什么時候會TIME_WAIT
TCP在關(guān)閉的時候有個四次揮手的過程敬鬓,主動關(guān)閉方在四次揮手的最后一個ACK發(fā)送之后會變成TIME_WAIT狀態(tài)盅视。
主動關(guān)閉方
跟握手不同,揮手可以由客戶端發(fā)起署拟,也可以是服務端發(fā)起铁瞒。發(fā)起關(guān)閉的一端我們稱之為主動關(guān)閉方,另一端稱之為被動關(guān)閉方新娜。
四次揮手
- 主動關(guān)閉方會發(fā)送一個FIN給被動關(guān)閉方赵辕,表示數(shù)據(jù)已經(jīng)發(fā)送完畢。
- 被動關(guān)閉方接收到FIN概龄,響應一個ACK还惠。它的接收作為一個文件結(jié)束符(end-of-file)傳遞給接收端應用進程(放在所有已排隊等候該應用進程接收的任何其他數(shù)據(jù)之后)。FIN意味著接收端在相應連接上再無額外的數(shù)據(jù)可以接收了私杜。
- 一段時間后蚕键,被動關(guān)閉方的應用進程收到了文件結(jié)束符救欧,發(fā)送完所有需要發(fā)送的內(nèi)容,也會發(fā)送一個FIN給主動關(guān)閉方锣光。
- 接收到這個最終的FIN的主動關(guān)閉方也需要響應一個ACK笆怠。
TIME_WAIT狀態(tài)維持多久
主動關(guān)閉方響應完最后一次ACK之后,會在TIME_WAIT這個狀態(tài)維持2MSL嫉晶。
MSL
MSL全稱是maximum segment lifetime骑疆,最長分節(jié)生命期。MSL是任何IP數(shù)據(jù)報能夠在因特網(wǎng)存活的最長時間替废。我們知道箍铭,這個時間是有限的,因為每個數(shù)據(jù)報都含有一個限跳(hop limit)的8位字段椎镣,它的最大值是255(簡單的講就是不同經(jīng)過超過255個路由器)诈火。盡管這個跳數(shù)限制而不是真正的時間限制,我們?nèi)匀患僭O最大限跳的分組在網(wǎng)絡中存在的時間不可能超過MSL秒状答。
MSL的具體值通常為30秒或者是2分鐘冷守。
為什么需要TIME_WAIT
可靠地實現(xiàn)了TCP全雙工連接的終止
我們知道,TCP是比較可靠的惊科。當TCP向另一端發(fā)送數(shù)據(jù)時悲敷,他要求對端返回一個確認(如同我們關(guān)閉時候的FIN和ACK)较沪。如果沒有收到確認,則會重發(fā)。
回憶一下我們最終的那個FIN與ACK雾叭,被動關(guān)閉方發(fā)送FIN道批,并等待主動關(guān)閉方返回的ACK磅废。我們假設最終的ACK丟失题翰,被動關(guān)閉方將需要重新發(fā)送它的最終那個FIN,主動關(guān)閉方必須維護狀態(tài)信息(TIME_WAIT)窖张,以允許它重發(fā)最終的那個ACK幕随。
如果沒有了這個狀態(tài),當他第二次收到FIN時宿接,會響應一個RST(也是一種類型的TCP分節(jié))赘淮,會被服務器解釋成一個錯誤。
為了TCP打算執(zhí)行必要的工作以徹底終止某個連接兩個方向上的數(shù)據(jù)流(即全雙工關(guān)閉)睦霎,那么他必須要正確處理連接終止四個分節(jié)中任何一個分節(jié)丟失的情況梢卸。
允許老的重復分節(jié)在網(wǎng)絡中的消逝(為什么需要2MSL)
首先,存在這樣的情況碎赢,某個路由器崩潰或者兩個路由器之間的某個鏈接斷開時低剔,路由協(xié)議需要花費數(shù)秒到數(shù)分鐘的時間才能穩(wěn)定找出另一條通路。在這段時間內(nèi),可能發(fā)生路由循環(huán)(路由器A把分組發(fā)送給B襟齿,B又發(fā)送回給A)姻锁,這種情況我們稱之為迷途。假設迷途的分組是一個TCP分節(jié)猜欺,在迷途期間位隶,發(fā)送端TCP超時并重傳該分組,重傳分組通過某路徑到達目的地开皿,而后不久(最多MSL秒)路由循環(huán)修復涧黄,早先迷失在這個循環(huán)中的分組最終也被送到目的地。這種分組被稱之為重復分組或者漫游的重復分組赋荆,TCP必須要正確處理這些重復的分組笋妥。
我們假設ip1:port1和ip2:port2 之間有一個TCP連接。我們關(guān)閉了這個鏈接窄潭,過一段時間后在相同IP和端口之間建立了另一個連接春宣。TCP必須防止來自之前那個連接的老的重復分組在新連接上出現(xiàn)。為了做到這一點嫉你,TCP將不復用處于TIME_WAIT狀態(tài)的連接月帝。2MSL的時間足以讓某個方向上的分組存活MSL秒后被丟棄,另一個方向上的應答也最多存活MSL秒后被丟棄幽污。