先上經典老圖3次握手:
我們討論四次握手和兩次握手的情況:
四次握手的過程:
- A發送同步信號SYN+A’s Initial sequence number
- B確認收到A的同步信號,並記錄A’s ISN 到本地,命名 B’s ACK sequence number
- B發送同步信號SYN+B’s Initial sequence number
- A確認收到B的同步信號,並記錄B’s ISN 到本地,命名 A’s ACK sequence number
很顯然2和3這兩個步驟可以合併,只需要三次握手,可以提高連接的速度和效率。
兩次握手的過程:
- A發送同步信號SYN+A’s Initial sequence number
- 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的確認纔可以發送數據。