TCP的連接釋放
為更好了解揮手過程,你需要理解握手過程。點這里
1. 過程簡單描述
數(shù)據(jù)傳輸結(jié)束后,通信的雙方都可以釋放連接,此時,客戶機A和服務器B都處在ESTABLLISHED(已建立連接)狀態(tài)。
①. A的應用進程先向TCP發(fā)出連接釋放報文段,并停止發(fā)送數(shù)據(jù),主動關閉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(關閉等待)狀態(tài)。——>這時,TCP服務器進程應通知高層應用進程,因而從A到B這個方向的連接就釋放了,TCP連接此時處于半關閉(half-close)狀態(tài),即A已經(jīng)沒有數(shù)據(jù)要發(fā)送了,但B若發(fā)送數(shù)據(jù),A仍要接收。也就是說,從B到A這個方向的連接并沒有關閉。
③. A收到來自B的確認后,進入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報文段。
若B已經(jīng)沒有要向A發(fā)送的數(shù)據(jù),其應用進程就通知TCP釋放連接。——>這時,B發(fā)出的連接釋放報文段必須使FIN = 1,假定B的序號為 w(在半關閉狀態(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)絡上消失。
了解:什么是?;钣嫊r器?
服務器每收到一次客戶的數(shù)據(jù),就重新設置?;钣嫊r器,時間的設置通常是 兩小時。若兩小時沒有收到客戶的數(shù)據(jù),服務器就發(fā)送一個探測報文段。以后則每隔75 分鐘發(fā)送一次,若一連發(fā)送 10個探測報文段后仍無客戶的響應,服務器就會認為客戶端除了故障,接著關閉了連接。所以說,?;钣嫊r器就是為了處理在客戶端出了故障的時候,讓服務器不再白白等下去而浪費資源。
