天天看點

tcp簡單傳輸過程分析

簡單的做一下tcp傳輸的過程分析(linux下),以加深自己的記憶,如有不足之處,希望各位道友能夠指出,謝謝!

Tcp連接配接傳輸分三步:

  1. 三步握手建立連接配接
  2. 資料傳輸
  3. 四步揮手斷開連接配接   
    tcp簡單傳輸過程分析

一、三步握手連接配接

  1. 在服務端已經完成bind listen等開啟監聽服務進而阻塞于accept()下(簡單的情況),用戶端connect()服務端:發送一個SYN資料包建立連接配接, 資料包IP頭中包含SYN及一些常見的選項如MSS、Window size等,此時用戶端:SYN_SENT;
  2. 服務端接收資料包後回應相應的ACK資料包,并在包中設定SYN位,也請求像對方建立連結,此時服務端:SYN——REVD;
  3. 用戶端接收到服務端的資料包,狀态:SYN_SENT---->ESTABLISHED, connect()傳回,而後發送ACK回應包,表示接收到了服務端的SYN包。而後服務端接收到此包,狀态:SYN_REVD--->ESTABLISHED, accept()傳回,至此,連接配接成功建立。

二、資料傳輸

  1. 用戶端write()發送資料,資料包ip頭包含seq序号
  2. 服務段接收到這個資料包後,發送Ack把确認接收到了資料包

三、四步揮手斷開連結

  1. 用戶端調用close(),發送FIN包,請求結束,此時用戶端:FIN_WAIT_1
  2. 服務端接受到FIN資料包時,發送一個ACK包回應表示接收到此包,客戶段接收ACK包,包此時用戶端:FIN_WAIT_2,服務端:CLOSE_WAIT。(注:斷開連結不和三步連接配接一樣,在發送ACK包的同時也在包中設定FIN标志,是因為當接收到用戶端的FIN包時,服務端可能在讀取客戶段發送過來的資料)
  3. 服務端讀取完資料之後,發送FIN包請求斷開連接配接,用戶端接受此包 ,此時服務端:LAST_ACK, 用戶端:TIME_WAIT
  4. 用戶端發送ACK包回應服務端的FIN包,服務端接收,狀态:CLOSED。(注:用戶端最後的TIME_WAIT狀态是為了保證服務端能夠接受到最後ACK包,服務端沒收到ACK後,服務端重發FIN,用戶端就能夠重發ACK,即可靠的實作TCP雙全工的終止。還可允許重複的分節在網絡中消逝。)

至此TCP傳輸連結完成。

繼續閱讀