TCP(傳輸控制協議)使用三次握手(3WHS)來建立一個可靠的連接,并使用四次揮手(4WHS)來終止連接。以下是每個步驟的詳細解釋:
三次握手(3WHS)建立連接:
-
SYN(同步序列編號):
- 客戶端選擇一個初始序列號x,并發送一個帶有SYN標志的TCP段給服務器,請求建立連接。此時,TCP段的序列號字段設置為x。
-
SYN-ACK(同步-確認):
- 服務器收到客戶端的SYN段后,如果同意建立連接,則會發送一個SYN-ACK段作為響應。服務器選擇自己的初始序列號y,并在ACK(確認)字段中確認客戶端的序列號x+1(期望接收到的第一個字節的序列號)。同時,SYN標志位也被設置。
-
ACK(確認):
- 客戶端收到服務器的SYN-ACK段后,發送一個帶有ACK標志的TCP段給服務器,確認服務器的初始序列號。客戶端在ACK字段中填入y+1。
完成這三個步驟后,TCP連接就成功建立,客戶端和服務器可以開始發送數據。
為什么需要三次握手:
- 防止已失效的連接請求報文段突然傳到服務器,因而產生錯誤:如果使用兩次握手,服務器端收到一個舊的連接請求并響應,可能會導致服務器錯誤地建立一個新連接。
例子: - 允許雙方確認彼此的初始序列號:三次握手確保了客戶端和服務器都能夠確認對方的接收能力和發送能力。
四次揮手(4WHS)終止連接:
-
FIN(結束):
- 當一方完成數據傳輸并希望關閉連接時,它發送一個帶有FIN標志的TCP段,表示已經沒有數據要發送了。
-
ACK(確認):
- 對方收到FIN段后,發送一個ACK段確認這個FIN。
-
FIN(結束):
- 對方完成數據傳輸后,也發送一個帶有FIN標志的TCP段。
-
ACK(確認):
- 最初發送FIN的一方收到這個FIN段后,發送最后一個ACK段確認。
完成這四個步驟后,TCP連接被關閉。
為什么需要四次揮手:
- TCP連接是全雙工的:意味著數據可以在兩個方向上獨立傳輸。因此,每個方向上的連接都需要單獨關閉。
- 確保數據傳輸完成:四次揮手允許一方在關閉自己的發送部分后,仍然接收來自對方的剩余數據。
上述為什么要三次握手第一個原因的理解
為什么TCP連接建立需要三次握手,而兩次握手可能不足以防止"已失效的連接請求"的問題。
假設場景:
假設客戶端A想要與服務器B建立TCP連接,但是客戶端A發送的第一個連接請求(SYN)在網絡中延遲了,沒有立即到達服務器B。
第一次握手(SYN):
- 客戶端A發送一個SYN報文(假設序列號為1000)給服務器B,請求建立連接。
網絡延遲:
- 這個SYN報文在網絡中延遲,沒有立即到達服務器B。
第二次握手(SYN+ACK,如果是兩次握手):
- 假設我們只使用兩次握手,客戶端A在發送第一個SYN報文后,由于沒有收到響應,會重新發送另一個SYN報文(假設序列號為2000)。
第三次握手(ACK,如果是兩次握手):
- 服務器B最終收到了第二個SYN報文(序列號2000),并發送了一個SYN+ACK報文作為響應,同意建立連接。
延遲的報文到達:
- 此時,客戶端A收到了服務器B的SYN+ACK報文,并發送了一個ACK報文確認,完成了兩次握手過程。但是,之前延遲的第一個SYN報文(序列號1000)現在終于到達了服務器B。
問題出現:
- 如果服務器B在兩次握手后沒有收到客戶端A的最終ACK確認,它可能會認為連接沒有成功建立。因此,當服務器B收到延遲的SYN報文(序列號1000)時,它可能會錯誤地認為客戶端A又發送了一個新的連接請求,并嘗試重新建立一個新的連接。
三次握手的作用:
- 通過三次握手,即使客戶端A的第一個SYN報文(序列號1000)延遲到達,服務器B也不會錯誤地建立一個新的連接。這是因為:
- 服務器B在收到第一個SYN(1000)后,會發送一個SYN+ACK(期望收到1000+1=1001),等待客戶端的確認。
- 客戶端A收到這個SYN+ACK后,會發送一個ACK(確認1001),但由于客戶端A實際上發送的是序列號2000,所以這個ACK不匹配服務器B的期望。
- 服務器B收到不匹配的ACK后,會知道這不是對它發出的SYN+ACK的響應,因此不會錯誤地建立一個新的連接。
通過這個例子,你可以看到三次握手如何確保即使在網絡延遲或重傳的情況下,連接的建立也是可靠和有序的。它防止了因為舊的或延遲的連接請求而導致的不必要的連接建立,確保了服務器不會對已經失效或過時的連接請求做出響應。