TCP的連接釋放
為更好了解揮手過程源祈,你需要理解握手過程虫溜。點這里
1. 過程簡單描述
數(shù)據(jù)傳輸結(jié)束后合敦,通信的雙方都可以釋放連接,此時豌汇,客戶機A和服務器B都處在ESTABLLISHED(已建立連接)狀態(tài)幢炸。
①. A的應用進程先向TCP發(fā)出連接釋放報文段,并停止發(fā)送數(shù)據(jù)瘤礁,主動關(guān)閉TCP連接阳懂。A把連接釋放報文段首部的 FIN 置 1梅尤,其序號 seq = u柜思,它等于前面已傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加 1。這時巷燥,A進入FIN-WAIT-1(終止等待1)狀態(tài)赡盘,等待服務器B的確認。
(注:TCP規(guī)定缰揪,FIN報文段即使不攜帶數(shù)據(jù)陨享,也會消耗一個序號。)
②. B收到連接釋放報文段后即發(fā)出確認钝腺,確認號為ack = u+1,而這個報文段自己的序號是 v抛姑,等于 B 前面已傳送過的數(shù)據(jù)的最后一個字節(jié)的序號加 1。之后B就進入CLOSE-WAIT(關(guān)閉等待)狀態(tài)艳狐。——>這時定硝,TCP服務器進程應通知高層應用進程,因而從A到B這個方向的連接就釋放了毫目,TCP連接此時處于半關(guān)閉(half-close)狀態(tài)蔬啡,即A已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但B若發(fā)送數(shù)據(jù)镀虐,A仍要接收箱蟆。也就是說,從B到A這個方向的連接并沒有關(guān)閉刮便。
③. A收到來自B的確認后空猜,進入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報文段恨旱。
若B已經(jīng)沒有要向A發(fā)送的數(shù)據(jù)辈毯,其應用進程就通知TCP釋放連接。——>這時窖杀,B發(fā)出的連接釋放報文段必須使FIN = 1漓摩,假定B的序號為 w(在半關(guān)閉狀態(tài)B可能又發(fā)送了一些數(shù)據(jù)),B還必須重復上傳已發(fā)送過的確認號ack = u+1入客。——>這時管毙,B進入LAST-ACK(最后確認)狀態(tài)腿椎,等待A的確認。
④. A在收到B的連接釋放報文段后夭咬,必須對此發(fā)出確認啃炸。在確認報文段中把ACK 置 1 ,確認號 ack = w+1卓舵,而自己的序號是 seq = u+1(注:TCP標準南用,前面發(fā)送過的FIN報文段要消耗一個序號)——>此時,A進入TIME-WAIT(時間等待)狀態(tài)掏湾。注意裹虫,現(xiàn)在 TCP 連接還沒有釋放掉。必須經(jīng)過 時間等待計時器(TIME-WAIT timer)設置的時間 2MSL 后融击,A 才進入CLOSED 狀態(tài)筑公。(注:時間 MSL 叫做最長報文段壽命,RFC 793建議設置為2分鐘尊浪,對于如今的網(wǎng)絡來說匣屡,2分鐘太長了,因此TCP允許不同的實現(xiàn)可以根據(jù)具體的情況使用更小的MSL 值拇涤。)——>所以捣作,從A進入TIME-WAIT狀態(tài)后,要經(jīng)過4分鐘才能進入CLOSED狀態(tài)鹅士,才能開始建立下一個新的連接券躁。——>當A撤銷了相應的傳輸控制塊TCB后,就結(jié)束了這次的TCP連接如绸。
B只要收到了A發(fā)出的確認嘱朽,就進入了CLOSED狀態(tài),同樣怔接,B在撤銷相應的傳輸控制塊TCB后搪泳,就結(jié)束了這次的TCP連接。B 結(jié)束TCP連接的時間比 A 要早一些扼脐。
上述的 TCP 連接釋放過程就是四次揮手岸军,也可以看成是兩個二次揮手。
那么問題來了:
為什么 A 在 TIME-WAIT 狀態(tài)必須等待 2MSL 的時間瓦侮?
理由: 第一艰赞,為了保證A發(fā)送的最后一個 ACK報文段能過到達B。這個ACK報文段可能丟失肚吏,因而使處在 LAST-ACK狀態(tài)下的B收不到對已發(fā)送的 FIN+ACK報文段的確認方妖。B會超時重傳這個FIN+ACK報文段,而A就能在 2MSL時間內(nèi)收到這個重傳的 FIN+ACK報文段罚攀。接著党觅, A 重傳一次確認雌澄,重新啟動 2MSL計時器。最后杯瞻,A 和 B 就能都正常的進入CLOSED狀態(tài)镐牺。如果A在TIME-WAIT狀態(tài)下不等待一段時間,而是在發(fā)送完ACK報文段之后立即釋放連接魁莉,那么無法收到B重傳的FIN+ACK睬涧,因而也不會再發(fā)送一次確認報文段,那么旗唁。B就無法按照正常的步驟進入CLOSED狀態(tài)畦浓。
第二,為了防止“已失效的連接請求報文段”出現(xiàn)逆皮。A在發(fā)送完最后一個ACK報文段后宅粥,經(jīng)過時間2MSL后参袱,就可以使本連續(xù)的時間內(nèi)所產(chǎn)生的所有報文段(包括舊的連接請求報文段)都從網(wǎng)絡上消失电谣。
了解:什么是保活計時器抹蚀?
服務器每收到一次客戶的數(shù)據(jù)剿牺,就重新設置保活計時器环壤,時間的設置通常是 兩小時晒来。若兩小時沒有收到客戶的數(shù)據(jù),服務器就發(fā)送一個探測報文段郑现。以后則每隔75 分鐘發(fā)送一次湃崩,若一連發(fā)送 10個探測報文段后仍無客戶的響應,服務器就會認為客戶端除了故障接箫,接著關(guān)閉了連接攒读。所以說,毙劣眩活計時器就是為了處理在客戶端出了故障的時候薄扁,讓服務器不再白白等下去而浪費資源。