【網(wǎng)絡是怎樣連接的】第2章 - 用電信號傳輸 TCP/IP 數(shù)據(jù)(4)

2.4 從服務器斷開并刪除套接字

數(shù)據(jù)發(fā)送完畢后斷開連接

圖2.12 斷開連接的交互過程.png

首先,服務器一方的應用程序會調(diào)用Socket庫的close程序。然后,服務器的協(xié)議棧會生成包含斷開信息的TCP頭部,具體來說就是將控制位中的FIN比特設(shè)為1。接下來,協(xié)議棧會委托IP模塊向客戶端發(fā)送數(shù)據(jù)(圖2.12①)。同時,服務器的套接字中也會記錄下斷開操作的相關(guān)信息。

接下來輪到客戶端了。當收到服務器發(fā)來的FIN為1的TCP頭部時,客戶端的協(xié)議棧會將自己的套接字標記為進入斷開操作狀態(tài)。然后,為了告知服務器已收到FIN為1的包,客戶端會向服務器返回一個ACK號(圖2.12②)。這些操作完成后,協(xié)議棧就可以等待應用程序來取數(shù)據(jù)了。

過了一會兒,應用程序就會調(diào)用read來讀取數(shù)據(jù)[插圖]。這時,協(xié)議棧不會向應用程序傳遞數(shù)據(jù)[插圖],而是會告知應用程序(瀏覽器)來自服務器的數(shù)據(jù)已經(jīng)全部收到了。根據(jù)規(guī)則,服務器返回請求之后,Web通信操作就全部結(jié)束了,因此只要收到服務器返回的所有數(shù)據(jù),客戶端的操作也就隨之結(jié)束了。因此,客戶端應用程序會調(diào)用close來結(jié)束數(shù)據(jù)收發(fā)操作,這時客戶端的協(xié)議棧也會和服務器一樣,生成一個FIN比特為1的TCP包,然后委托IP模塊發(fā)送給服務器(圖2.12③)。一段時間之后,服務器就會返回ACK號(圖2.12④)。到這里,客戶端和服務器的通信就全部結(jié)束了。

刪除套接字

和服務器的通信結(jié)束之后,用來通信的套接字也就不會再使用了,這時我們就可以刪除這個套接字了。不過,套接字并不會立即被刪除,而是會等待一段時間之后再被刪除。

等待這段時間是為了防止誤操作,引發(fā)誤操作的原因有很多。

可能存在服務器或客戶端 fin 丟失,重發(fā)。如果斷開連接,立即刪除套接字,就無法重新發(fā)送 fin 了。

數(shù)據(jù)收發(fā)操作小結(jié)

圖2.13 TCP的整體流程.png

創(chuàng)建套接字之后,客戶端會向服務器發(fā)起連接操作。首先,客戶端會生成一個SYN為1的TCP包并發(fā)送給服務器(圖2.13①)。這個TCP包的頭部還包含了客戶端向服務器發(fā)送數(shù)據(jù)時使用的初始序號,以及服務器向客戶端發(fā)送數(shù)據(jù)時需要用到的窗口大小[插圖]。當這個包到達服務器之后,服務器會返回一個SYN為1的TCP包(圖2.13②)。和圖2.13①一樣,這個包的頭部中也包含了序號和窗口大小,此外還包含表示確認已收到包①的ACK號[插圖]。當這個包到達客戶端時,客戶端會向服務器返回一個包含表示確認的ACK號的TCP包(圖2.13③)。到這里,連接操作就完成了,雙方進入數(shù)據(jù)收發(fā)階段。

以Web為例,首先客戶端會向服務器發(fā)送請求消息。TCP會將請求消息切分成一定大小的塊,并在每一塊前面加上TCP頭部,然后發(fā)送給服務器(圖2.13④)。TCP頭部中包含序號,它表示當前發(fā)送的是第幾個字節(jié)的數(shù)據(jù)。當服務器收到數(shù)據(jù)時,會向客戶端返回ACK號(圖2.13⑤)。在最初的階段,服務器只是不斷接收數(shù)據(jù),隨著數(shù)據(jù)收發(fā)的進行,數(shù)據(jù)不斷傳遞給應用程序,接收緩沖區(qū)就會被逐步釋放。這時,服務器需要將新的窗口大小告知客戶端。當服務器收到客戶端的請求消息后,會向客戶端返回響應消息,這個過程和剛才的過程正好相反(圖2.13⑥⑦)。

服務器的響應消息發(fā)送完畢之后,數(shù)據(jù)收發(fā)操作就結(jié)束了,這時就會開始執(zhí)行斷開操作。以Web為例,服務器會先發(fā)起斷開過程[插圖]。在這個過程中,服務器先發(fā)送一個FIN為1的TCP包(圖2.13⑧),然后客戶端返回一個表示確認收到的ACK號(圖2.13⑨)。接下來,雙方還會交換一組方向相反的FIN為1的TCP包(圖2.13⑩)和包含ACK號的TCP包(圖2.13?)。最后,在等待一段時間后,套接字會被刪除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容