為什么建立TCP連接需要三次握手,為什么斷開TCP連接需要四次握手,TIME_WAIT狀態(tài)的意義

轉自:https://www.cnblogs.com/zhoudayang/p/6012257.html

為什么建立TCP連接需要三次握手?

原因:為了應對網(wǎng)絡中存在的延遲的重復數(shù)組的問題

例子:

假設client發(fā)起連接的連接請求報文段在網(wǎng)絡中沒有丟失,而是在某個網(wǎng)絡節(jié)點長時間滯留了,導致延遲到達server。本來這是一個已經(jīng)失效的連接報文,但是server接收到這個連接報文之后,誤認為client發(fā)起了新的連接,于是向client發(fā)送確認報文段。此時因為沒有了連接的3次握手,client不會對server的確認報文作出回應,也不會向server發(fā)送數(shù)據(jù),server就以為連接已經(jīng)建立,一直在空等client的數(shù)據(jù),這樣server的這一部分網(wǎng)絡資源就被浪費了。

另外:

基于通信方式和雙全工的特性,所以在tcp連接建立時

client需要將自己的ISN序號告知對方,同時需要對方的確定。

server也需要將自己的ISN序號告知對方,同時也要對方的確定。

在上圖中,server將自己的ack和發(fā)出的syn標志的告知對方ISN的合并在一次傳遞中,這樣子節(jié)省流量。所以三次握手很合理。

為什么斷開TCP連接需要進行四次握手 ?

TCP通信雙方都可以獨立關閉自己的通信通道,也就是半關閉。

client先發(fā)送FIN告知對方我已經(jīng)完成數(shù)據(jù)發(fā)送了,server回復ack來確定我知道了。這樣一個流程,就關閉了client的發(fā)送信息通道。但是client還可以接收。

server此時已經(jīng)知道接收不到client的數(shù)據(jù)了,但是還可以給它發(fā)送數(shù)據(jù)。如果server也沒有啥數(shù)據(jù)要發(fā)送給對方了,server也會以FIN標志位發(fā)送一個信息給client,client接到后,也會傳遞一個ack表示知道了。這樣子,雙方都完成了關閉。

因為TCP連接是全雙工的網(wǎng)絡協(xié)議,允許同時通信的雙方同時進行數(shù)據(jù)的收發(fā),同樣也允許收發(fā)兩個方向的連接被獨立關閉,以避免client數(shù)據(jù)發(fā)送完畢,向server發(fā)送FIN關閉連接,而server還有發(fā)送到client的數(shù)據(jù)沒有發(fā)送完畢的情況。所以關閉TCP連接需要進行四次握手,每次關閉一個方向上的連接需要FIN和ACK兩次握手。

TIME_WAIT狀態(tài)的意義

在TCP連接中,當被動關閉連接的一方(圖中client)發(fā)送的FIN報文到達時,被動關閉連接的一方會發(fā)送ACK確認報文,并且進入TIME_WAIT狀態(tài),并且等待2MSL時間段(MSL:maximum segment life)。這么做有下述兩個原因:

被動關閉連接的一方(圖中的server)在一段時間內(nèi)沒有收到對方的ACK確認數(shù)據(jù)包,會重新發(fā)送FIN數(shù)據(jù)包,因而主動關閉連接的一方需要停留在等待狀態(tài)以處理對方重新發(fā)送的FIN數(shù)據(jù)包。否則他會回應一個RST數(shù)據(jù)包給被動關閉連接的一方,使得對方莫名其妙。

在TIME_WAIT狀態(tài)下,不允許應用程序在當前ip和端口上和之前通信的client(這個client的ip和端口號不變)建立一個新的連接。這樣就能避免新的連接收到之前的ip和端口一致的連接殘存在網(wǎng)絡中的數(shù)據(jù)包。這也是TIME_WAIT狀態(tài)的等待時間被設置為2MSL的原因,以確保網(wǎng)絡上當前連接兩個方向上尚未接收的TCP報文已經(jīng)全部消失。

尤其是通信雙方都可以獨立關閉自己的通信通道,也就是半關閉。

client先發(fā)送FIN告知對方我已經(jīng)完成數(shù)據(jù)發(fā)送了,server回復ack來確定我知道了。這樣一個流程,就關閉了client的發(fā)送信息通道。但是client還可以接收。

server此時已經(jīng)知道接收不到client的數(shù)據(jù)了,但是還可以給它發(fā)送數(shù)據(jù)。如果server也沒有啥數(shù)據(jù)要發(fā)送給對方了,server也會以FIN標志位發(fā)送一個信息給client,client接到后,也會傳遞一個ack表示知道了。這樣子,雙方都完成了關閉。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容