簡述TCP三次握手和四次揮手
TCP是傳輸層的主要協議之一,其特點是面向連線的、可靠的程序對接程序的協議。
TCP報文首部格式
源埠號:傳送方程序埠號。 目標埠號:目的埠對應程序。 序號(Sep):為每個位元組進行編號,由作業系統隨機產生首個序號(0~65535),以該序號為原點,下一個資料包的序號順序產生,以便於接收端正確重組。該序號獨立產生,一個連結裡A B雙方的序號可以相同。 確認號(Ack):對傳送端的迴應訊息,X+1,X=對方序號。 首部長度: TCP報頭的大小,預設20位元組。 保留:沒有實際用處。 URG:緊急指標有效位,此位為1時緊急指標生效、 0則不生效。 ACK:ACK=1時,確認號生效, ACK=0時,確認號不生效。 PSH
TCP三次握手
第一次握手:PC1向PC2傳送一個數據包 SYN為1(請求連結),其餘全為0 ,隨機產生一個序號(Seq)。
第二次握手
第三次握手:PC1迴應PC2一個數據包,確認號(Ack)為對方序號+1,控制位ACK=1
TCP作為可靠的協議,其可靠性依賴的就是ACK確認。A向B傳送了一個TCP報文,B便要回復一個ACK確認,當A向B傳送的資料包丟失時或B向A傳送的ACK丟失,傳送方在超時時間內未收到對方發來的ACK,傳送方會一直週期性的重傳資料包,直到收到ACK為止、或者達到重傳上限重新建立TCP連結。
建立連線、資料傳輸、斷開連結需要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一方(通常是客戶端)可以終止傳送資料,但任然可以接受資料,稱之為半關閉
- 客戶端向伺服器傳送FIN報文,半關閉這個連結;伺服器迴應ACK確認,接受半關閉
- 伺服器繼續傳送資料,客戶端只回復ACK確認,不在傳送任何資料
- 當伺服器傳送完所有資料後,傳送FIN報文段,客戶端迴應ACK確認,徹底關閉這個連結。