1. 程式人生 > >簡述TCP三次握手和四次揮手

簡述TCP三次握手和四次揮手

TCP是傳輸層的主要協議之一,其特點是面向連線的、可靠的程序對接程序的協議。

TCP報文首部格式

TCP報文段首部格式

源埠號:傳送方程序埠號。 目標埠號:目的埠對應程序。 序號(Sep):為每個位元組進行編號,由作業系統隨機產生首個序號(0~65535),以該序號為原點,下一個資料包的序號順序產生,以便於接收端正確重組。該序號獨立產生,一個連結裡A B雙方的序號可以相同。 確認號(Ack):對傳送端的迴應訊息,X+1,X=對方序號。 首部長度: TCP報頭的大小,預設20位元組。 保留:沒有實際用處。 URG:緊急指標有效位,此位為1時緊急指標生效、 0則不生效。 ACK:ACK=1時,確認號生效, ACK=0時,確認號不生效。 PSH

:標誌位為1時,通知儘快將資料送至應用層。 RST:當RST為1時,通知重新建立TCP連結。 SYN:同步序號位,TCP需要建立連結時,為1。 FIN:FIN=1時,斷開連結 視窗大小:大小可變,TCP的流控機制,可以根據網路暢通情況改變視窗大小。 校驗和:差錯控制,傳送端通過演算法(計算TCP首部、資料、其他填充位元組)算出一個值,接收到資料包後接收端也算出一個值,值一樣說明資料基本正確,值不同則丟棄該資料包 緊急指標:當URP=1時生效

TCP三次握手

這裡寫圖片描述

第一次握手:PC1向PC2傳送一個數據包 SYN為1(請求連結),其餘全為0 ,隨機產生一個序號(Seq)。

第二次握手

:PC2迴應PC1一個數據包,確認號(Ack)為對方序號+1,ACK=1(Ack生效)。隨機產生一個Seq, SYN為1(請求連結)。這一步可以看做兩個包,一個迴應包,一個請求連結包,一般將這兩步合併在一起。

第三次握手:PC1迴應PC2一個數據包,確認號(Ack)為對方序號+1,控制位ACK=1

TCP作為可靠的協議,其可靠性依賴的就是ACK確認。A向B傳送了一個TCP報文,B便要回復一個ACK確認,當A向B傳送的資料包丟失時或B向A傳送的ACK丟失,傳送方在超時時間內未收到對方發來的ACK,傳送方會一直週期性的重傳資料包,直到收到ACK為止、或者達到重傳上限重新建立TCP連結。

建立連線、資料傳輸、斷開連結需要ACK確認。

RST報文、裸ACK報文不需要ACK確認

RST報文不需要ACK確認主機A傳送完RST報文之後,作業系統會將和該TCP連結有關的記憶體全部釋放。 若B收到了RST報文,也會釋放相關記憶體。 若B未收到RST報文,可能會繼續傳送讓接收方彈射出Reset報文的報文,到最後對方一樣會收到重置報文,並最終釋放記憶體。

ACK報文不需要ACK確認 收到沒有攜帶任何資料的ACK報文不需要返回確認,否則會產生死迴圈。

資料包的組裝由作業系統完成,組裝完畢後交由報文中的目標埠,監聽該埠的程序提取資料。

TCP的四次揮手

這裡寫圖片描述

(1)PC1向PC2傳送一個斷開連結的資料包 (2)PC2迴應PC1一個確認位=1的資料包 (3)PC2向PC1傳送一個斷開連結的資料包 (4)PC1向PC2迴應一個確認位=1的資料包

從這四個步驟可以看出四次揮手和三次握手是大同小異的,四次揮手是將三次握手中的第二次握手分解成了兩步,便有了四次揮手。

四次揮手為什麼要將PC2的動作拆分成兩步?

因為在四次揮手中有個半關閉概念,TCP一方(通常是客戶端)可以終止傳送資料,但任然可以接受資料,稱之為半關閉

  1. 客戶端向伺服器傳送FIN報文,半關閉這個連結;伺服器迴應ACK確認,接受半關閉
  2. 伺服器繼續傳送資料,客戶端只回復ACK確認,不在傳送任何資料
  3. 當伺服器傳送完所有資料後,傳送FIN報文段,客戶端迴應ACK確認,徹底關閉這個連結。