|
http://blog.csdn.net/du_zou/article/details/5598885 2010 1 A: 獨(dú)奏大哥我給你發(fā)經(jīng)典合集都發(fā)完了(FIN) 2 B: 恩..都收到了..(ACK) 3 B: 那今天就到這嘍,下次要有好的記得分享哦..(FIN) 4 A: 恩.好的...(ACK)
這就是tcp四次握手?jǐn)嚅_的過(guò)程.那可能有人會(huì)有疑問(wèn).在tcp連接握手時(shí)為何 ACK是和SYN一起發(fā)送.這里ACK卻沒(méi)有何FIN一起發(fā)送呢. 原因是因?yàn)閠cp是全雙工模式.接收到FIN時(shí)意味將沒(méi)有數(shù)據(jù)再發(fā)來(lái)..但是還是可以繼續(xù)發(fā)送數(shù)據(jù).. 下面我們來(lái)把這幅圖幾個(gè)狀態(tài)說(shuō)明下 LISTEN : 監(jiān)聽(tīng)狀態(tài). SYN_SENT : 已發(fā)送SYN同步會(huì)變?yōu)檫@個(gè)狀態(tài).等待服務(wù)端的SYN和ACK確認(rèn). SYN_RECV: 當(dāng)收到客戶端的SYN時(shí)變?yōu)榇藸顟B(tài).這時(shí)將發(fā)送SYN及這個(gè)報(bào)文的ACK(合并SYN+ACK) ESTABLISHEN: 雙方連接建立 FIN_WAIT_1: 當(dāng)準(zhǔn)備關(guān)閉連接時(shí),將進(jìn)入這個(gè)狀態(tài)并發(fā)送FIN.確認(rèn)后會(huì)變?yōu)镕IN_WAIT_2 FIN_WAIT_2: 實(shí)際這個(gè)狀態(tài)就是在客戶端發(fā)送FIN并得到確認(rèn)后等待服務(wù)端的FIN報(bào)文 CLOSE_WAIT: 當(dāng)被動(dòng)關(guān)閉方收到FIN時(shí)會(huì)遷移到這個(gè)狀態(tài).如果此時(shí)應(yīng)用層所有數(shù)據(jù)都已發(fā)送完畢則.遷移到LAST_ACK并發(fā)送FIN給客戶端,并等待客戶端的最后確認(rèn),如果在一定時(shí)間內(nèi)沒(méi)有收到最后的ACK確認(rèn)則服務(wù)端會(huì)重新發(fā)送FIN.直到發(fā)送超時(shí).直接關(guān)閉連接. LAST_ACK :服務(wù)端發(fā)送FIN后等待客戶端的最后確認(rèn).收到確認(rèn)后則雙方數(shù)據(jù)流均關(guān)閉可以關(guān)閉了此連接了 TIME_WAIT: 當(dāng)客戶端吧收到被動(dòng)關(guān)閉方的FIN后意味只要發(fā)送最后一ACK就可以最終關(guān)閉連接.那為何發(fā)送ACK后不直接關(guān)閉連接而是保持在TIME_WAIT呢.按上面說(shuō)的如果客戶端發(fā)送的最后一個(gè)ACK由于網(wǎng)絡(luò)原因沒(méi)有到達(dá)服務(wù)端.服務(wù)端會(huì)重新發(fā)送FIN.TIME_WAIT就是為了接受服務(wù)端重新發(fā)送的FIN,并重發(fā)丟失的ACK報(bào)文..這個(gè)狀態(tài)持續(xù)時(shí)間會(huì)有2MSL,MSL就是一個(gè)報(bào)文在被丟棄前網(wǎng)絡(luò)上的最長(zhǎng)時(shí)間..tcpip協(xié)議卷上說(shuō) MSL會(huì)有兩分鐘....具體的可能跟實(shí)現(xiàn)不同.我就不知道了..沒(méi)測(cè)試過(guò)嘍..O(∩_∩)O~ CLOSED: 連接關(guān)閉
還有個(gè)CLOSEING狀態(tài)是在同時(shí)關(guān)閉時(shí),當(dāng)客戶端發(fā)送FIN后進(jìn)入FIN_WAIT_1等待服務(wù)端的ACK.這時(shí)接受的卻不是ACK,而是服務(wù)端發(fā)送的FIN,這種情況一般是當(dāng)雙發(fā)同時(shí)發(fā)送FIN.會(huì)進(jìn)入CLOSING狀態(tài).隨機(jī)收到各自的ACK后雙發(fā)都會(huì)進(jìn)入TIME_WAIT狀態(tài)
|
|
|