TCP協議詳解(三)

TCP建立連接和關閉連接的過程

首先我們來回顧下我們以前瞭解過的,TCP頭部結構有6個標識位

  • SYN:僅在三次握手建立連接時有效,表示同步報文段。
  • ACK:對TCP請求的確認標誌。
  • FIN:標誌用來結束一個TCP連接,標識此報文段是一個結束報文段

以上就是我們講到以下內容的時候需要用到的知識點

三次握手建立連接

開始介紹一下三次握手的過程:

  • 第一次握手:其實是客戶端發送一個帶有SYN的數據報文段發送給服務器,對應在圖片中就是從主機A->主機B(SYN=1,seq=i),seq爲對應序列號爲i。之後主機A進入SYN_SENT狀態。同時等待服務器的確認
  • 第二次握手:服務器收到同步報文段後(也就是帶有SYN的同步報文段),必須確定客戶的同步報文段。然後自己也發送一個帶有SYN的報文段,對應到圖片中也就死第二個報文段,其中SYN=1,表示這是一個同步報文段,ACK=1,表示這是一個確認報文段,確認序號值爲i+1,序號值爲j。
  • 第三次握手:這次就是客戶端收到確認同步報文段後,它向服務器發送確認包,對應到圖片中也就是第三個報文段,ack=1也就是表示這是一個確認報文段,確認序號爲j+1

三次握手建立後,客戶端與服務器開始傳送數據。

三次握手示意圖:

這裏寫圖片描述

四次握手關閉連接

接下來,我們來介紹下四次握手關閉

  • 第一次握手:表示客戶端A發送給服務器一個帶有SYN的結束報文段,用來關閉客戶端A到服務端B的數據傳送,對應到圖片中也就是第一個報文段,FIN=1,seq=i,表示一個結束報文段
  • 第二次握手:服務端B接收到這個結束報文段後,它返回一個確認報文段,對應到圖片中就是第二個確認報文段。其中ACK=1,ack=i+i,表示一個確認報文段,確認序號爲i+1.
  • 第三次握手:服務器B關閉與客戶端A的連接,他發送一個帶有SYN結束報文段,對應圖片上第三個報文段,其中 SYN=1,seq=j,表示結束報文段,序號爲j。
  • 第四次握手:客戶端A返回一個確認報文段,其中確認序號爲j+1,對應圖片上爲第四個報文段,ACK=1,ack=j+1。

總結:爲什麼建立連接需要三次握手?爲什麼關閉連接需要四次握手?爲什麼建立連接需要三次握手呢?

  • 接受連接缺需要4次握手,LISTEN狀態下建立連接後,它可以把同步報文段和確認報文段合併成一個報文段來進行發送,確認報文段起到應達作用,同步報文段起到同步作用,也就是三次握手中的第二個報文段其實是發揮了兩個作用

  • 在關閉連接時,當收到對方的結束報文段時,表示對方沒有數據發給你了,但是自己的數據未必全部發送完畢,所以你可能還需要繼續發送一些數據之後在發送結束報文段給對方了表示你同意現在可以斷開連接,所以關閉連接需要四次握手

  • 如果把三次握手改成兩次握手,就有可能發生死鎖。關於死鎖,(搜索一下)

四次握手示意圖:

這裏寫圖片描述

TIME_WAIT狀態的含義

在TCP詳解(二)中,提到過,當客戶端收到服務器的結束報文段後,不會立即進入CLOSED狀態,而是轉移到TIME_WAIT狀態下,在這個狀態下,客戶端要等待一段2倍的MSL(報文段最大生存時間)時間。等待這個時間後才能完全關閉。TIME_WAIT狀態的持續時間是MSL的2倍,這就足以讓某個方向上的分組最多存活msl秒即被丟棄,另一個方向上的應答最多存活msl秒也被丟棄。 通過實施這個規則,我們就能保證每成功建立一個TCP連接時。來自該鏈接先前化身的重複分組都已經在網絡中消逝了。

TIME_WAIT狀態存在的原因有兩點:

  • 可靠的終止TCP連接:

    例如在四次握手時,如果第三個報文段丟失,這個時候服務器將重新發送這個報文段,所以客戶端需要停留在摸個狀態來處理重複信息。否則客戶端將會向服務器發送復位報文段,讓服務器誤認爲這是一個錯誤

  • 保證延遲來的TCP報文段有足夠的時間去識別並丟棄:

    在Linux系統上,一個TCP端口不能被同時打開多次,當一個TCP連接處於TIME_WAIT狀態時,我們將無法立即使用該連接佔用的端口建立一個新連接。
    但是我們反過來考慮,如果不存在這種機制,那麼服務器剛關閉連接,又建立了一個類似的連接,成爲“原鏈接化身”,這個“化身“就有可能就收到屬於原來連接的數據報文段,這種情況是不允許出現的。

IME_WAIT狀態過多的缺點:

  • 根據上訴,我們可以瞭解到,如果IME_WAIT狀態過多會佔用大量的端口號,佔用系用資源

IME_WAIT狀態過多的處理方法

  • 修改內核參數

  • 儘可能被動關閉連接

  • 將長連接修改爲短連接

  • 通過套接字選項儘可能迴避IME_WAIT狀態帶來的負面影響

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章