tcp三次握手和time wait --- 轉(zhuǎn)
第一次握手:建立連接時(shí),客戶端發(fā)送syn包和一個(gè)隨機(jī)序列號(hào)seq=x到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器進(jìn)行確認(rèn)。(syn,同 步序列編號(hào))。第二次握手,服務(wù)器收到syn包,必須確認(rèn)客戶的SYN,然后服務(wù)器發(fā)送一個(gè)ACK=1, SYN=1, seq=y的隨機(jī)數(shù)和ack=x+1的確認(rèn)數(shù)的包發(fā)送回去。第三次握手是客戶端收到服務(wù)器端的SYN+ACK包,然后向服務(wù)器端發(fā)送確認(rèn)包 ack=y+1, seq=x+1, ACK=1,客戶端和服務(wù)器端進(jìn)入ESTABLISHED狀態(tài),完成三次握手。具體圖示如下:
這里多說(shuō)一點(diǎn),既然提到了連接時(shí)的三次握手,就順便把斷開(kāi)連接時(shí)的四次揮手也復(fù)習(xí)一下。首先客戶端主動(dòng)發(fā)送Fin=1,seq=u,它等于前面已傳 送過(guò)去的最后一個(gè)字節(jié)的序號(hào)加1.這是A進(jìn)入FIN-WAIT-1狀態(tài),等待B的確認(rèn)。B收到連接后立即發(fā)出確認(rèn),確認(rèn)號(hào)是ack=u+1,而這個(gè)報(bào)文段 自己的序號(hào)是v,等于B前面已傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)的序號(hào)加1.然后B即進(jìn)入CLOSE-WAIT狀態(tài)。因而A到B的這個(gè)鏈接現(xiàn)在已經(jīng)斷開(kāi)了,這時(shí) 的TCP連接處于半關(guān)閉狀態(tài),即A已經(jīng)沒(méi)有數(shù)據(jù)需要發(fā)送了。但B若發(fā)送數(shù)據(jù),A還是要接受的。A收到來(lái)自B的確認(rèn)之后就進(jìn)入了FIN-WAIT-2狀態(tài)等 待B發(fā)出連接釋放報(bào)文段。若B已經(jīng)沒(méi)有要向A發(fā)送數(shù)據(jù),其應(yīng)用進(jìn)程就通知TCP釋放連接。這是B發(fā)出的連接釋放報(bào)文段必須使用FIN=1.現(xiàn)在假定B的序 號(hào)為w,B還必須重復(fù)上次已發(fā)送過(guò)的確認(rèn)號(hào)ack=u+1.這時(shí)B就進(jìn)入了LAST-ACK狀態(tài),等待A確認(rèn)。A在收到B的連接釋放之后必須對(duì)此發(fā)出確 認(rèn)。在確認(rèn)號(hào)中把ACK置1,確認(rèn)號(hào)ack=w+1,而自己的序號(hào)是seq=u+1。接著A進(jìn)入TIME-WAIT狀態(tài)。為了保證B可以收到確認(rèn)釋放報(bào)文 段。如上圖:
是不是所有執(zhí)行主動(dòng)關(guān)閉的socket都會(huì)進(jìn)入TIME_WAIT狀態(tài)呢?
有沒(méi)有什么情況使主動(dòng)關(guān)閉的socket直接進(jìn)入CLOSED狀態(tài)呢?
主動(dòng)關(guān)閉的一方在發(fā)送最后一個(gè) ack 后
就會(huì)進(jìn)入 TIME_WAIT 狀態(tài) 停留2MSL(max segment lifetime)時(shí)間
這個(gè)是TCP/IP必不可少的,也就是“解決”不了的。
也就是TCP/IP設(shè)計(jì)者本來(lái)是這么設(shè)計(jì)的
主要有兩個(gè)原因
1。防止上一次連接中的包,迷路后重新出現(xiàn),影響新連接
(經(jīng)過(guò)2MSL,上一次連接中所有的重復(fù)包都會(huì)消失)
2。可靠的關(guān)閉TCP連接
在主動(dòng)關(guān)閉方發(fā)送的最后一個(gè) ack(fin) ,有可能丟失,這時(shí)被動(dòng)方會(huì)重新發(fā)
fin, 如果這時(shí)主動(dòng)方處于 CLOSED 狀態(tài) ,就會(huì)響應(yīng) rst 而不是 ack。所以
主動(dòng)方要處于 TIME_WAIT 狀態(tài),而不能是 CLOSED 。
posted on 2013-02-17 14:59 大龍 閱讀(2500) 評(píng)論(0) 編輯 收藏 引用