TCP四次握手释放连接
一、四次握手的過程
TCP需要三次握手才能建立連接,整個過程如下圖所示:
假設A運行的是TCP客戶端進程,而B運行的是TCP服務端進程。最開始的時候兩端的TCP進程都處于ESTABLISHED(已建立連接)狀態。
這時候,A主動關閉,請求釋放連接。
(1)第一次握手 ?A→ B
A的TCP客戶進程向B發出釋放連接請求報文段,其中FIN(終止位)=1,seq(序號)=u。
TCP規定,當報文段的FIN=1時,表明此報文段的發送方的數據已發生完畢,并要求釋放連接;FIN報文段(FIN=1的報文段)不能攜帶數據,但是要消耗掉一個序號。
在A發送完畢之后,A的TCP客戶端進程進入FIN-WAIT-1(終止等待1)狀態。
B在收到連接釋放連接請求報文段之后,隨即向A發送確認報文段。其中ACK=1,seq=v,ack(確認號)=u+1。
在B發送完畢之后,B的TCP服務端進程進入CLOSE-WAIT(關閉等待)狀態。
TCP服務器進程這時應該通知高層應用經常,從A到B這個方向的連接就要釋放了,這時的TCP連接處于半關閉(half-close)狀態。
A在收到B的確認報文段之后,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文段。
在B發送完畢之后,B的TCP服務端進程進入LAST-ACK(最后確認)狀態。
A在接收到B的釋放連接請求報文段之后,必須對此發出確認。其中ACK=1,seq=u+1,ack=w+1。
A在發送完畢之后,進入到TIME-WAIT(時間等待)狀態。B在接收到A的確認之后,進入到CLOSED(關閉)狀態。
在經過時間等待計時器設置的時間2MSL之后,A才進入到CLOSED狀態。
四次握手可以看成是兩個二次握手,分別是A的TCP客戶端進程請求釋放連接和B的TCP服務端進程請求釋放連接。
為什么A在發送最后一次確認報文段之后還需要等待2MSL時間呢?主要有兩個原因,一是為了讓B能夠按照正常步驟進入CLOSED狀態,二是為了防止已失效的請求連接報文段出現在下次連接中,因而產生錯誤。
原因如下:
第一,為了保證A發送的最后一個ACK報文段能夠到達B。因為這個ACK報文段有可能丟失,這樣B就無法接收到而進入CLOSED狀態。于是B會重傳請求釋放連接的報文段,A在這段等待時間接收到了,重傳ACK報文段,這樣B還是會順利接收到確認報文段,進入CLOSED狀態。如果此時A已經關閉了,那么就無法收到B的請求報文段,也不會發送ACK報文段,這樣B就無法進入CLOSED狀態了。
第二,在這2MSL的等待時間內,本次連接的所有報文都已經從網絡中消失,從而不會出現失效的報文出現在下次連接中。
參考資料:
1、TCP協議中的三次握手和四次揮手(圖解)?http://blog.csdn.net/whuslei/article/details/6667471
2、簡析TCP的三次握手與四次分手?http://www.jellythink.com/archives/705
3、TCP三次握手詳解及釋放連接過程 ?http://blog.csdn.net/oney139/article/details/8103223
總結
以上是生活随笔為你收集整理的TCP四次握手释放连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有了它后老电脑性能飙升老电脑性能提升
- 下一篇: TCP连续ARQ协议和滑动窗口协议