TCP為什么是三次握手?兩次、四次握手不行嗎?
TCP協議需要經過三次握手,才能建立連接,而像SCTP協議,則必須經過四次握手,才能建立連接。不禁我們要問了,為什么TCP不是兩次握手,或者四次握手來建立連接呢?
TCP是一種可靠的傳輸控制協議,它必須做到兩點,一是保證數據的可靠傳輸,二是盡可能提高傳輸效率,三次握手正是為了做到這兩點才出現的。
可靠性的實現
假設A、B雙方欲建立TCP連接。
首先,由操作系統隨機選取一個32位序列號,假設A的初始序列號為1000,接著對所要發送的數據進行編號,1001,1002,1003...
A會把初始序列號ISN告訴給B,讓B知道,什么樣的編號數據是合法的,什么樣的編號數據是非法的,比如接收到一個編號999的數據,那就是非法的。
B也會對A每一個編號數據進行確認,如果收到編號為2001,1001-2000說明有1000個字節已經安全到達。
同理,B也會進行類似的操作。如果B的初始序列號ISN為2000,B也會開始編號2001,2002,2003...
B再將初始序列號ISN告訴A,A同樣可以確認B發送了多少個字節,這些數據合不合法。
通過以上步驟,不難發現,TCP協議握手的本質是通信雙方數據原點的序列號,從而實現可靠性。
傳輸效率
實現數據可靠傳輸,為什么剛好需要三次握手呢?如果兩次握手,行不行?
兩次握手:
- A發送同步信號SYN+A的初始序列號
- B發送同步信號SYN+B的初始序列號+B的ACK序列號
兩次握手會產生一個問題,B沒辦法知道A是不是已經接收了自己的同步信號。一旦這個同步信號丟了,A和B就B的初始序列號將無法達成一致。
顯然,兩次握手是不可取的。
那么四次握手又如何呢?
- A發送同步信號SYN+A的初始序列號
- B確認收到A的同步信號,并記錄A的ISN到本地,命名B的ACK序列號
- B發送同步信號SYN+B的初始序列號
- A確認收到B的同步信號,并記錄B的ISN到本地,命名A的ACK序列號
顯然,并不需要四個步驟,2和3和可以合并,提高連接的速度和效率。
TCP協議需考慮到可靠性和傳輸效率,明白了這一點,我們也就明白了為什么只能是三次握手,而不是兩次或者四次了。