Posted on 2008-06-23 01:25
dennis 閱讀(17839)
評(píng)論(3) 編輯 收藏 所屬分類(lèi):
計(jì)算機(jī)科學(xué)與基礎(chǔ)
主動(dòng)關(guān)閉的Socket端會(huì)進(jìn)入TIME_WAIT狀態(tài),并且持續(xù)2MSL時(shí)間長(zhǎng)度,MSL就是maximum segment lifetime(最大分節(jié)生命期),這是一個(gè)IP數(shù)據(jù)包能在互聯(lián)網(wǎng)上生存的最長(zhǎng)時(shí)間,超過(guò)這個(gè)時(shí)間將在網(wǎng)絡(luò)中消失。MSL在RFC 1122上建議是2分鐘,而源自berkeley的TCP實(shí)現(xiàn)傳統(tǒng)上使用30秒,因而,TIME_WAIT狀態(tài)一般維持在1-4分鐘。
TIME_WAIT狀態(tài)存在的理由:
1)可靠地實(shí)現(xiàn)TCP全雙工連接的終止
在進(jìn)行關(guān)閉連接四路握手協(xié)議時(shí),最后的ACK是由主動(dòng)關(guān)閉端發(fā)出的,如果這個(gè)最終的ACK丟失,服務(wù)器將重發(fā)最終的FIN,因此客戶(hù)端必須維護(hù)狀態(tài)信息允許它重發(fā)最終的ACK。如果不維持這個(gè)狀態(tài)信息,那么客戶(hù)端將響應(yīng)RST分節(jié),服務(wù)器將此分節(jié)解釋成一個(gè)錯(cuò)誤(在java中會(huì)拋出connection reset的SocketException)。因而,要實(shí)現(xiàn)TCP全雙工連接的正常終止,必須處理終止序列四個(gè)分節(jié)中任何一個(gè)分節(jié)的丟失情況,主動(dòng)關(guān)閉的客戶(hù)端必須維持狀態(tài)信息進(jìn)入TIME_WAIT狀態(tài)。
2)允許老的重復(fù)分節(jié)在網(wǎng)絡(luò)中消逝
TCP分節(jié)可能由于路由器異常而“迷途”,在迷途期間,TCP發(fā)送端可能因確認(rèn)超時(shí)而重發(fā)這個(gè)分節(jié),迷途的分節(jié)在路由器修復(fù)后也會(huì)被送到最終目的地,這個(gè)原來(lái)的迷途分節(jié)就稱(chēng)為lost duplicate。在關(guān)閉一個(gè)TCP連接后,馬上又重新建立起一個(gè)相同的IP地址和端口之間的TCP連接,后一個(gè)連接被稱(chēng)為前一個(gè)連接的化身(incarnation),那么有可能出現(xiàn)這種情況,前一個(gè)連接的迷途重復(fù)分組在前一個(gè)連接終止后出現(xiàn),從而被誤解成從屬于新的化身。為了避免這個(gè)情況,TCP不允許處于TIME_WAIT狀態(tài)的連接啟動(dòng)一個(gè)新的化身,因?yàn)門(mén)IME_WAIT狀態(tài)持續(xù)2MSL,就可以保證當(dāng)成功建立一個(gè)TCP連接的時(shí)候,來(lái)自連接先前化身的重復(fù)分組已經(jīng)在網(wǎng)絡(luò)中消逝。
新的SCTP協(xié)議通過(guò)在消息頭部添加驗(yàn)證標(biāo)志避免了TIME_WAIT狀態(tài)。