TCP為什么是三次握手??jī)纱巍⑺拇挝帐植恍袉幔?/h1>
TCP協(xié)議需要經(jīng)過(guò)三次握手,才能建立連接,而像SCTP協(xié)議,則必須經(jīng)過(guò)四次握手,才能建立連接。不禁我們要問(wèn)了,為什么TCP不是兩次握手,或者四次握手來(lái)建立連接呢?
TCP是一種可靠的傳輸控制協(xié)議,它必須做到兩點(diǎn),一是保證數(shù)據(jù)的可靠傳輸,二是盡可能提高傳輸效率,三次握手正是為了做到這兩點(diǎn)才出現(xiàn)的。
可靠性的實(shí)現(xiàn)
假設(shè)A、B雙方欲建立TCP連接。
首先,由操作系統(tǒng)隨機(jī)選取一個(gè)32位序列號(hào),假設(shè)A的初始序列號(hào)為1000,接著對(duì)所要發(fā)送的數(shù)據(jù)進(jìn)行編號(hào),1001,1002,1003...
A會(huì)把初始序列號(hào)ISN告訴給B,讓B知道,什么樣的編號(hào)數(shù)據(jù)是合法的,什么樣的編號(hào)數(shù)據(jù)是非法的,比如接收到一個(gè)編號(hào)999的數(shù)據(jù),那就是非法的。
B也會(huì)對(duì)A每一個(gè)編號(hào)數(shù)據(jù)進(jìn)行確認(rèn),如果收到編號(hào)為2001,1001-2000說(shuō)明有1000個(gè)字節(jié)已經(jīng)安全到達(dá)。
同理,B也會(huì)進(jìn)行類似的操作。如果B的初始序列號(hào)ISN為2000,B也會(huì)開(kāi)始編號(hào)2001,2002,2003...
B再將初始序列號(hào)ISN告訴A,A同樣可以確認(rèn)B發(fā)送了多少個(gè)字節(jié),這些數(shù)據(jù)合不合法。
通過(guò)以上步驟,不難發(fā)現(xiàn),TCP協(xié)議握手的本質(zhì)是通信雙方數(shù)據(jù)原點(diǎn)的序列號(hào),從而實(shí)現(xiàn)可靠性。
傳輸效率
實(shí)現(xiàn)數(shù)據(jù)可靠傳輸,為什么剛好需要三次握手呢?如果兩次握手,行不行?
兩次握手:
- A發(fā)送同步信號(hào)SYN+A的初始序列號(hào)
- B發(fā)送同步信號(hào)SYN+B的初始序列號(hào)+B的ACK序列號(hào)
兩次握手會(huì)產(chǎn)生一個(gè)問(wèn)題,B沒(méi)辦法知道A是不是已經(jīng)接收了自己的同步信號(hào)。一旦這個(gè)同步信號(hào)丟了,A和B就B的初始序列號(hào)將無(wú)法達(dá)成一致。
顯然,兩次握手是不可取的。
那么四次握手又如何呢?
- A發(fā)送同步信號(hào)SYN+A的初始序列號(hào)
- B確認(rèn)收到A的同步信號(hào),并記錄A的ISN到本地,命名B的ACK序列號(hào)
- B發(fā)送同步信號(hào)SYN+B的初始序列號(hào)
- A確認(rèn)收到B的同步信號(hào),并記錄B的ISN到本地,命名A的ACK序列號(hào)
顯然,并不需要四個(gè)步驟,2和3和可以合并,提高連接的速度和效率。
TCP協(xié)議需考慮到可靠性和傳輸效率,明白了這一點(diǎn),我們也就明白了為什么只能是三次握手,而不是兩次或者四次了。