日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TCP三次握手详解及释放连接过程

發布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TCP三次握手详解及释放连接过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

TCP頭部: 其中 ACK?? SYN? 序號? 這三個部分在以下會用到,它們的介紹也在下面。

?

暫時需要的信息有:

ACK?: TCP協議規定,只有ACK=1時有效,也規定連接建立后所有發送的報文的ACK必須為1

SYN(SYNchronization) : 在連接建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連接請求報文。對方若同意建立連接,則應在響應報文中使SYN=1和ACK=1. 因此,? SYN置1就表示這是一個連接請求或連接接受報文。

?

FIN?(finis)即完,終結的意思, 用來釋放一個連接。當 FIN = 1 時,表明此報文段的發送方的數據已經發送完畢,并要求釋放連接。

?

三次握手的過程:

首先由Client發出請求連接即 SYN=1 ACK=0? (請看頭字段的介紹), TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,因此聲明自己的序號是 seq=x

然后 Server 進行回復確認,即 SYN=1 ACK=1 seq=y, ack=x+1,

再然后 Client 再進行一次確認,但不用SYN 了,這時即為 ACK=1, seq=x+1, ack=y+1.

然后連接建立。

為什么要進行三次握手呢(兩次確認)?

?

下面是釋放連接的過程:

當客戶A 沒有東西要發送時就要釋放 A 這邊的連接,A會發送一個報文(沒有數據),其中 FIN 設置為1,? 服務器B收到后會給應用程序一個信,這時A那邊的連接已經關閉,即A不再發送信息(但仍可接收信息)。?

A收到B的確認后進入等待狀態,等待B請求釋放連接, B數據發送完成后就向A請求連接釋放,也是用FIN=1 表示, 并且用 ack = u+1(如圖), A收到后回復一個確認信息,并進入 TIME_WAIT 狀態, 等待 2MSL 時間

另外服務器B存在一個保活狀態,即如果A突然故障死機了,那B那邊的連接資源什么時候能釋放呢?? 就是保活時間到了后,B會發送探測信息, 以決定是否釋放連接。

為了這種情況: B向A發送 FIN = 1 的釋放請求,但這個報文丟失了, A沒有接到不會發送確認信息, B 超時會重傳,這時A在 TIME_WAIT?還能夠接收到這個請求,這時再回復一個確認就行了。(A收到 FIN = 1 的請求后 等待時間(2MSL) 會重新記時)

為什么要TIME_WAIT等待呢?

  • 如果 【最后一步】A 響應ACK 包丟失,B 會以為 A 沒有收到自己的關閉請求,然后B會重試向 A 再發 FIN 包。如果沒有 TIME_WAIT 狀態,A 不再保存這個連接的信息,收到一個不存在的連接的包,A 會響應 RST 包,導致 B 端異常響應。

    此時, TIME_WAIT 是為了保證 TCP 連接正常終止

  • 我們還知道,TCP 下的 IP 層協議是無法保證包傳輸的先后順序的。如果雙方揮手之后,一個網絡四元組(src/dst ip/port)被回收,而此時網絡中還有一個【遲到的數據包】沒有被 B 接收,A 應用程序又立刻使用了同樣的四元組再創建了一個新的連接后,這個遲到的數據包才到達 B,那么這個數據包就會讓 B 以為是 A 剛發過來的。

    此時, TIME_WAIT 是為了保證迷失的數據包正常過期

MSL時長的確定

由原因來推實現,TIME_WAIT 狀態的保持時長也就可以理解了。確定 TIME_WAIT 的時長主要考慮上文的第二種情況,保證關閉連接后這個連接在網絡中的所有數據包都過期。

說到過期時間,不得不提另一個概念: 最大分段壽命(MSL, Maximum Segment Lifetime),它表示一個 TCP 分段可以存在于互聯網系統中的最大時間,由 TCP 的實現,超出這個壽命的分片都會被丟棄。

TIME_WAIT 狀態由主動關閉的 A 來保持,那么我們來考慮對于 A 來說,可能接到上一個連接的數據包的最大時長:A 剛發出的數據包,能保持 MSL 時長的壽命,它到了 B 端后,B 端由于關閉連接了,會響應 RST 包,這個 RST 包最長也會在 MSL 時長后到達 A,那么 A 端只要保持 TIME_WAIT 到達 2MS 就能保證網絡中這個連接的包都會消失。

MSL 的時長被 RFC 定義為 2分鐘,但在不同的 unix 實現上,這個值不并確定,我們常用的 centOS 上,它被定義為 30s,我們可以通過?/proc/sys/net/ipv4/tcp_fin_timeout?這個文件查看和修改這個值。

什么是2MSL

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時間結束再使用此端口。

TTL與MSL是有關系的但不是簡單的相等的關系,MSL要大于等于TTL。

?

總結

以上是生活随笔為你收集整理的TCP三次握手详解及释放连接过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。