1、資料傳輸結束後,通訊的雙方都可釋放連線。現在 a
的應用程序先向其
tcp
發出連線釋放報文段,並停止再傳送資料,主動關閉 tcp 連線。a 把連線釋放報文段首部的
fin = 1
,其序號seq = u,等待
b 的確認。
2、b 發出確認,確認號
ack = u +1
,而這個報文段自己的序號 seq = v
。tcp 伺服器程序通知高層應用程序,從 a
到 b
這個方向的連線就釋放了,
tcp
連線處於
半關閉狀態。
b 若傳送資料,
a 仍要接收。
3、 若 b
已經沒有要向
a 傳送的資料,其應用程序就通知 tcp
釋放連線
4、a 收到連線釋放報文段後,必須發出確認。在確認報文段中 ack = 1
,確認號
ack =w
+1,自己的序號 seq = u + 1。
5、四次握手全過程
6、注意:tcp
連線必須經過時間
2msl
後才真正釋放掉
原因:(1)為了保證a傳送的最後乙個ack報文能夠到達b。這個ack報文段有可能丟失,因而使處在last-ack狀態的b收不到對已傳送的fin+ack報文段的確認。b會超時重傳這個fin+ack報文段,而a就能在2msl時間內收到這個重傳的fin+ack報文段。如果a在time-wait狀態不等待一段時間,而是在傳送完ack報文段後就立即釋放連線,就無法收到b重傳的fin+ack報文段,因而也不會再傳送一次確認報文段。這樣,b就無法按照正常的步驟進入closed狀態。
(2)a在傳送完ack報文段後,再經過2msl時間,就可以使本連線持續的時間所產生的所有報文段都從網路中消失。這樣就可以使下乙個新的連線中不會出現這種舊的連線請求的報文段。
7、msl介紹
msl是maximum segment lifetime英文的縮寫,中文可以譯為「報文最大生存時間」,他是任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄。因為tcp報文(segment)是ip資料報(datagram)的資料部分,具體稱謂請參見《資料在網路各層中的稱呼》一文,而ip頭中有乙個ttl域,ttl是time to live的縮寫,中文可以譯為「生存時間」,這個生存時間是由源主機設定初始值但不是存的具體時間,而是儲存了乙個ip資料報可以經過的最大路由數,每經過乙個處理他的路由器此值就減1,當此值為0則資料報將被丟棄,同時傳送icmp報文通知源主機。rfc 793中規定msl為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。
2msl即兩倍的msl,tcp的time_wait狀態也稱為2msl等待狀態,當tcp的一端發起主動關閉,在發出最後乙個ack包後,即第3次握手完成後傳送了第四次握手的ack包後就進入了time_wait狀態,必須在此狀態上停留兩倍的msl時間,等待2msl時間主要目的是怕最後乙個ack包對方沒收到,那麼對方在超時後將重發第三次握手的fin包,主動關閉端接到重發的fin包後可以再發乙個ack應答包。在time_wait狀態時兩端的埠不能使用,要等到2msl時間結束才可繼續使用。當連線處於2msl等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設定so_reuseaddr選項達到不必等待2msl時間結束再使用此埠。
TCP四次握手連線釋放
tcp連線釋放 四次握手正常釋放鏈結如圖 第一次握手 a方傳送連線釋放請求dr給b,在發出dr的同時它也啟動乙個定時器 第二次握手 當這個dr到達b的時候,b會回發乙個確認ack,這個ack到達a後a的連線就釋放了 第三次握手 與此同時收到dr的那一方b,它也會發出乙個連線釋放的請求dr並同樣啟動定...
TCP建立連線三次握手和釋放連線四次握手
尊重 在談及tcp建立連線和釋放連線過程,先來簡單認識一下 tcp報文段首部格式 的的幾個名詞 這裡只是簡單說明,具體請檢視相關教程 序列號seq 佔4個位元組,用來標記資料段的 順序,tcp把連線中傳送的所有資料位元組都編上乙個序號,第乙個位元組的編號由本地隨機產生 給位元組編上序號後,就給每乙個...
TCP建立連線三次握手和釋放連線四次握手
尊重 在談及tcp建立連線和釋放連線過程,先來簡單認識一下tcp報文段首部格式 的的幾個名詞 這裡只是簡單說明,具體請檢視相關教程 序列號seq 佔4個位元組,用來標記資料段的順序,tcp把連線中傳送的所有資料位元組都編上乙個序號,第乙個位元組的編號由本地隨機產生 給位元組編上序號後,就給每乙個報文...