第一次握手:建立連接時打掘,客戶端發(fā)送syn包(syn=j)到服務(wù)器华畏,并進入SYN_SENT狀態(tài),等待服務(wù)器確認(rèn)尊蚁;SYN:同步序列編號(Synchronize Sequence Numbers)亡笑。
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1)横朋,同時自己也發(fā)送一個SYN包(syn=k)仑乌,即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài)琴锭;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包晰甚,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢决帖,客戶端和服務(wù)器進入ESTABLISHED(TCP連接成功)狀態(tài)厕九,完成三次握手。
完成三次握手地回,客戶端與服務(wù)器開始傳送數(shù)據(jù)扁远,在上述過程中,還有一些重要的概念:
未連接隊列
在三次握手協(xié)議中刻像,服務(wù)器維護一個未連接隊列畅买,該隊列為每個客戶端的SYN包(syn=j)開設(shè)一個條目,該條目表明服務(wù)器已收到SYN包细睡,并向客戶發(fā)出確認(rèn)谷羞,正在等待客戶的確認(rèn)包。這些條目所標(biāo)識的連接在服務(wù)器處于SYN_RECV狀態(tài)纹冤,當(dāng)服務(wù)器收到客戶的確認(rèn)包時洒宝,刪除該條目,服務(wù)器進入ESTABLISHED狀態(tài)萌京。
關(guān)閉TCP連接:改進的三次握手
對于一個已經(jīng)建立的連接雁歌,TCP使用改進的三次握手來釋放連接(使用一個帶有FIN附加標(biāo)記的報文段)。TCP關(guān)閉連接的步驟如下:
第一步知残,當(dāng)主機A的應(yīng)用程序通知TCP數(shù)據(jù)已經(jīng)發(fā)送完畢時靠瞎,TCP向主機B發(fā)送一個帶有FIN附加標(biāo)記的報文段(FIN表示英文finish)。
第二步求妹,主機B收到這個FIN報文段之后乏盐,并不立即用FIN報文段回復(fù)主機A,而是先向主機A發(fā)送一個確認(rèn)序號ACK制恍,同時通知自己相應(yīng)的應(yīng)用程序:對方要求關(guān)閉連接(先發(fā)送ACK的目的是為了防止在這段時間內(nèi)父能,對方重傳FIN報文段)。
第三步净神,主機B的應(yīng)用程序告訴TCP:我要徹底的關(guān)閉連接何吝,TCP向主機A送一個FIN報文段溉委。
第四步,主機A收到這個FIN報文段后爱榕,向主機B發(fā)送一個ACK表示連接徹底釋放瓣喊。
為什么要采用三次握手,兩次不行嗎黔酥?
痹迦活計時器:
設(shè)想有這樣的情況:客戶端已主動與服務(wù)器建立了TCP連接,但后來客戶端的主機突然出現(xiàn)故障跪者。
通常設(shè)為2小時棵帽。若2小時沒有收到客戶端的數(shù)據(jù),服務(wù)器就發(fā)送一個探測報文段坑夯,以后則每隔75分鐘發(fā)送一次岖寞。若一連發(fā)送10個探測報文段后仍無客戶端的響應(yīng),服務(wù)器就認(rèn)為客戶端出現(xiàn)了故障柜蜈,接著就關(guān)閉這個連接仗谆。
為什么連接的時候是三次握手,關(guān)閉的時候卻是四次握手淑履?
答:因為當(dāng)Server端收到Client端的SYN連接請求報文后隶垮,可以直接發(fā)送SYN+ACK報文。其中ACK報文是用來應(yīng)答的秘噪,SYN報文是用來同步的狸吞。但是關(guān)閉連接時,當(dāng)Server端收到FIN報文時指煎,很可能并不會立即關(guān)閉SOCKET蹋偏,所以只能先回復(fù)一個ACK報文,告訴Client端至壤,"你發(fā)的FIN報文我收到了"威始。只有等到我Server端所有的報文都發(fā)送完了,我才能發(fā)送FIN報文像街,因此不能一起發(fā)送黎棠。故需要四步握手。
為什么TIME_WAIT狀態(tài)需要經(jīng)過2MSL(最大報文段生存時間)才能返回到CLOSE狀態(tài)镰绎?
答:雖然按道理脓斩,四個報文都發(fā)送完畢,我們可以直接進入CLOSE狀態(tài)了畴栖,但是我們必須假象網(wǎng)絡(luò)是不可靠的随静,有可以最后一個ACK丟失。所以TIME_WAIT狀態(tài)就是用來重發(fā)可能丟失的ACK報文吗讶。
文章轉(zhuǎn)自:http://blog.csdn.net/qq_18425655