TCP三次握手详解及释放连接过程
TCP頭部: 其中 ACK?? SYN? 序號? 這三個部分在以下會用到,它們的介紹也在下面。
?
暫時需要的信息有:
ACK?: TCP協(xié)議規(guī)定,只有ACK=1時有效,也規(guī)定連接建立后所有發(fā)送的報文的ACK必須為1
SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1. 因此,? SYN置1就表示這是一個連接請求或連接接受報文。
?
FIN?(finis)即完,終結(jié)的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放連接。
?
三次握手的過程:
首先由Client發(fā)出請求連接即 SYN=1 ACK=0? (請看頭字段的介紹), TCP規(guī)定SYN=1時不能攜帶數(shù)據(jù),但要消耗一個序號,因此聲明自己的序號是 seq=x
然后 Server 進行回復確認,即 SYN=1 ACK=1 seq=y, ack=x+1,
再然后 Client 再進行一次確認,但不用SYN 了,這時即為 ACK=1, seq=x+1, ack=y+1.
然后連接建立。
為什么要進行三次握手呢(兩次確認)?
?
下面是釋放連接的過程:
當客戶A 沒有東西要發(fā)送時就要釋放 A 這邊的連接,A會發(fā)送一個報文(沒有數(shù)據(jù)),其中 FIN 設(shè)置為1,? 服務器B收到后會給應用程序一個信,這時A那邊的連接已經(jīng)關(guān)閉,即A不再發(fā)送信息(但仍可接收信息)。?
A收到B的確認后進入等待狀態(tài),等待B請求釋放連接, B數(shù)據(jù)發(fā)送完成后就向A請求連接釋放,也是用FIN=1 表示, 并且用 ack = u+1(如圖), A收到后回復一個確認信息,并進入 TIME_WAIT 狀態(tài), 等待 2MSL 時間。
另外服務器B存在一個保活狀態(tài),即如果A突然故障死機了,那B那邊的連接資源什么時候能釋放呢?? 就是保活時間到了后,B會發(fā)送探測信息, 以決定是否釋放連接。
為了這種情況: B向A發(fā)送 FIN = 1 的釋放請求,但這個報文丟失了, A沒有接到不會發(fā)送確認信息, B 超時會重傳,這時A在 TIME_WAIT?還能夠接收到這個請求,這時再回復一個確認就行了。(A收到 FIN = 1 的請求后 等待時間(2MSL) 會重新記時)
為什么要TIME_WAIT等待呢?
-
如果 【最后一步】A 響應ACK 包丟失,B 會以為 A 沒有收到自己的關(guān)閉請求,然后B會重試向 A 再發(fā) FIN 包。如果沒有 TIME_WAIT 狀態(tài),A 不再保存這個連接的信息,收到一個不存在的連接的包,A 會響應 RST 包,導致 B 端異常響應。
此時, TIME_WAIT 是為了保證 TCP 連接正常終止。
-
我們還知道,TCP 下的 IP 層協(xié)議是無法保證包傳輸?shù)南群箜樞虻?/span>。如果雙方揮手之后,一個網(wǎng)絡(luò)四元組(src/dst ip/port)被回收,而此時網(wǎng)絡(luò)中還有一個【遲到的數(shù)據(jù)包】沒有被 B 接收,A 應用程序又立刻使用了同樣的四元組再創(chuàng)建了一個新的連接后,這個遲到的數(shù)據(jù)包才到達 B,那么這個數(shù)據(jù)包就會讓 B 以為是 A 剛發(fā)過來的。
此時, TIME_WAIT 是為了保證迷失的數(shù)據(jù)包正常過期。
MSL時長的確定
由原因來推實現(xiàn),TIME_WAIT 狀態(tài)的保持時長也就可以理解了。確定 TIME_WAIT 的時長主要考慮上文的第二種情況,保證關(guān)閉連接后這個連接在網(wǎng)絡(luò)中的所有數(shù)據(jù)包都過期。
說到過期時間,不得不提另一個概念: 最大分段壽命(MSL, Maximum Segment Lifetime),它表示一個 TCP 分段可以存在于互聯(lián)網(wǎng)系統(tǒng)中的最大時間,由 TCP 的實現(xiàn),超出這個壽命的分片都會被丟棄。
TIME_WAIT 狀態(tài)由主動關(guān)閉的 A 來保持,那么我們來考慮對于 A 來說,可能接到上一個連接的數(shù)據(jù)包的最大時長:A 剛發(fā)出的數(shù)據(jù)包,能保持 MSL 時長的壽命,它到了 B 端后,B 端由于關(guān)閉連接了,會響應 RST 包,這個 RST 包最長也會在 MSL 時長后到達 A,那么 A 端只要保持 TIME_WAIT 到達 2MS 就能保證網(wǎng)絡(luò)中這個連接的包都會消失。
MSL 的時長被 RFC 定義為 2分鐘,但在不同的 unix 實現(xiàn)上,這個值不并確定,我們常用的 centOS 上,它被定義為 30s,我們可以通過?/proc/sys/net/ipv4/tcp_fin_timeout?這個文件查看和修改這個值。
什么是2MSL
MSL是Maximum Segment Lifetime英文的縮寫,中文可以譯為“報文最大生存時間”,他是任何報文在網(wǎng)絡(luò)上存在的最長時間,超過這個時間報文將被丟棄。因為tcp報文(segment)是ip數(shù)據(jù)報(datagram)的數(shù)據(jù)部分,具體稱謂請參見《數(shù)據(jù)在網(wǎng)絡(luò)各層中的稱呼》一文,而ip頭中有一個TTL域,TTL是time to live的縮寫,中文可以譯為“生存時間”,這個生存時間是由源主機設(shè)置初始值但不是存的具體時間,而是存儲了一個ip數(shù)據(jù)報可以經(jīng)過的最大路由數(shù),每經(jīng)過一個處理他的路由器此值就減1,當此值為0則數(shù)據(jù)報將被丟棄,同時發(fā)送ICMP報文通知源主機。RFC 793中規(guī)定MSL為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。
????2MSL即兩倍的MSL,TCP的TIME_WAIT狀態(tài)也稱為2MSL等待狀態(tài),當TCP的一端發(fā)起主動關(guān)閉,在發(fā)出最后一個ACK包后,即第3次握手完成后發(fā)送了第四次握手的ACK包后就進入了TIME_WAIT狀態(tài),必須在此狀態(tài)上停留兩倍的MSL時間,等待2MSL時間主要目的是怕最后一個ACK包對方?jīng)]收到,那么對方在超時后將重發(fā)第三次握手的FIN包,主動關(guān)閉端接到重發(fā)的FIN包后可以再發(fā)一個ACK應答包。在TIME_WAIT狀態(tài)時兩端的端口不能使用,要等到2MSL時間結(jié)束才可繼續(xù)使用。當連接處于2MSL等待階段時任何遲到的報文段都將被丟棄。不過在實際應用中可以通過設(shè)置SO_REUSEADDR選項達到不必等待2MSL時間結(jié)束再使用此端口。
TTL與MSL是有關(guān)系的但不是簡單的相等的關(guān)系,MSL要大于等于TTL。
?
總結(jié)
以上是生活随笔為你收集整理的TCP三次握手详解及释放连接过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 条件变量为什么要和互斥锁一起使用
- 下一篇: TCP滑动窗口和拥塞控制机制