TCP連接爲什麼是三次握手,不是兩次?不是四次?

先上經典老圖3次握手:
在這裏插入圖片描述
我們討論四次握手和兩次握手的情況:
四次握手的過程:

  1. A發送同步信號SYN+A’s Initial sequence number
  2. B確認收到A的同步信號,並記錄A’s ISN 到本地,命名 B’s ACK sequence number
  3. B發送同步信號SYN+B’s Initial sequence number
  4. A確認收到B的同步信號,並記錄B’s ISN 到本地,命名 A’s ACK sequence number

在這裏插入圖片描述

很顯然2和3這兩個步驟可以合併,只需要三次握手,可以提高連接的速度和效率。

兩次握手的過程:

  1. A發送同步信號SYN+A’s Initial sequence number
  2. B發送同步信號SYN+B’s Initial sequence number+B’s ACK sequence number

在這裏插入圖片描述

這裏有一個問題,A與B就A的初始序列號達成了一致,這裏是1000。但是B無法知道A是否已經接收到自己的同步信號,如果這個同步信號丟失了,A和B就B的初始序列號將無法達成一致。

於是TCP的設計者將SYN這個同步標誌位SYN設計成佔用一個字節的編號(FIN標誌位也是),既
然是一個字節的數據,按照TCP對有數據的TCP segment必須確認的原則,所以在這裏A必須給B一個確認,以確認A已經接收到B的同步信號。

如果A發給B的確認丟了,該如何?
A會超時重傳這個ACK嗎?不會!TCP不會爲沒有數據的ACK超時重傳。
那該如何是好?B如果沒有收到A的ACK,會超時重傳自己的SYN同步信號,一直到收到A的ACK爲止。


第一個包,即A發給B的SYN 中途被丟,沒有到達B

A會週期性超時重傳,直到收到B的確認

第二個包,即B發給A的SYN +ACK 中途被丟,沒有到達A

B會週期性超時重傳,直到收到A的確認

第三個包,即A發給B的ACK 中途被丟,沒有到達B

第三個包,即A發給B的ACK 中途被丟,沒有到達B

  • a.假定此時雙方都沒有數據發送,B會週期性超時重傳,直到收到A的確認,收到之後B的TCP連接也爲Established狀態,雙向可以發包。

  • b.假定此時A有數據發送,B收到A的Data + ACK,自然會切換爲established狀態,並接受A的Data。

  • c. 假定B有數據發送,數據發送不了,會一直週期性超時重傳SYN + ACK,直到收到A的確認纔可以發送數據。

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