在《輸入一個(gè)網(wǎng)址后》中也有提到tcp連接的建立和三次握手袄膏,這篇文章就是細(xì)講建立環(huán)節(jié)的各種細(xì)節(jié)。
tcp建立連接就是基于三次握手的咽笼。
一個(gè)個(gè)報(bào)文分別細(xì)說(shuō)招刨。
在服務(wù)器listen的狀態(tài),客戶端先發(fā)了第一個(gè)報(bào)文灵份。
客戶端會(huì)初始化報(bào)文仁堪,隨機(jī)序列號(hào)client-syn,然后將SYN置為1填渠,這個(gè)報(bào)文沒(méi)有任何應(yīng)用層數(shù)據(jù)弦聂。發(fā)出后客戶端處于SYN-SEND狀態(tài)。
第二個(gè)其實(shí)是兩個(gè)報(bào)文合起來(lái)發(fā)了氛什,以提高效率莺葫。一個(gè)是SYN的報(bào)文,服務(wù)器初始化自身的序列號(hào)sever-syn枪眉,然后處于SYN-RCVD狀態(tài)捺檬。一個(gè)是ACK報(bào)文,在確認(rèn)應(yīng)答號(hào)那里將客戶端的序號(hào)client-syn加一贸铜。這個(gè)報(bào)文也不包含應(yīng)用層是數(shù)據(jù)堡纬。
第三次這個(gè)是最后的報(bào)文,ACK置為1萨脑,應(yīng)答號(hào)從server-syn +1隐轩,這個(gè)階段就可以帶應(yīng)用層的數(shù)據(jù)了。發(fā)送后處于established狀態(tài)渤早,服務(wù)器收到后也進(jìn)入established职车,正式建立連接。
以上就是三次握手的過(guò)程鹊杖,在《輸入一個(gè)網(wǎng)址后》中也有提到悴灵,三次握手是為了互相保證雙方都具有發(fā)送和接收數(shù)據(jù)的能力。
更細(xì)點(diǎn)講骂蓖,有兩個(gè)原因积瞒。
1.三次握手可以阻止歷史連接的初始化
因?yàn)榫W(wǎng)絡(luò)是比較復(fù)雜的,在比較擁堵的情況下登下,有可能先發(fā)的包茫孔,反而后到叮喳。而假設(shè)這個(gè)時(shí)候舊包到了,建立了連接缰贝,會(huì)加劇網(wǎng)絡(luò)的擁堵問(wèn)題馍悟。而兩次連接是沒(méi)有足夠的上下文信息去確定是不是歷史連接。流程如圖
2.通過(guò)同步雙方序列號(hào)的方法來(lái)維護(hù)tcp的可靠性剩晴,有序和不冗余锣咒。接收方有對(duì)方的序列號(hào),那么就可以不重復(fù)接收相同的包赞弥,如果出現(xiàn)超時(shí)重傳的話毅整。有序列號(hào),就可以保證按序接收绽左。有序列號(hào)和ack悼嫉,可以確認(rèn)哪些是對(duì)方已經(jīng)收到的數(shù)據(jù)。這些保證都需要三次連接來(lái)提供上下文妇菱。