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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

TCP頭部: 其中 ACK?? SYN? 序號(hào)? 這三個(gè)部分在以下會(huì)用到,它們的介紹也在下面。

?

暫時(shí)需要的信息有:

ACK?: TCP協(xié)議規(guī)定,只有ACK=1時(shí)有效,也規(guī)定連接建立后所有發(fā)送的報(bào)文的ACK必須為1

SYN(SYNchronization) : 在連接建立時(shí)用來同步序號(hào)。當(dāng)SYN=1而ACK=0時(shí),表明這是一個(gè)連接請(qǐng)求報(bào)文。對(duì)方若同意建立連接,則應(yīng)在響應(yīng)報(bào)文中使SYN=1和ACK=1. 因此,? SYN置1就表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文。

?

FIN?(finis)即完,終結(jié)的意思, 用來釋放一個(gè)連接。當(dāng) FIN = 1 時(shí),表明此報(bào)文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放連接。

?

三次握手的過程:

首先由Client發(fā)出請(qǐng)求連接即 SYN=1 ACK=0? (請(qǐng)看頭字段的介紹), TCP規(guī)定SYN=1時(shí)不能攜帶數(shù)據(jù),但要消耗一個(gè)序號(hào),因此聲明自己的序號(hào)是 seq=x

然后 Server 進(jìn)行回復(fù)確認(rèn),即 SYN=1 ACK=1 seq=y, ack=x+1,

再然后 Client 再進(jìn)行一次確認(rèn),但不用SYN 了,這時(shí)即為 ACK=1, seq=x+1, ack=y+1.

然后連接建立。

為什么要進(jìn)行三次握手呢(兩次確認(rèn))?

?

下面是釋放連接的過程:

當(dāng)客戶A 沒有東西要發(fā)送時(shí)就要釋放 A 這邊的連接,A會(huì)發(fā)送一個(gè)報(bào)文(沒有數(shù)據(jù)),其中 FIN 設(shè)置為1,? 服務(wù)器B收到后會(huì)給應(yīng)用程序一個(gè)信,這時(shí)A那邊的連接已經(jīng)關(guān)閉,即A不再發(fā)送信息(但仍可接收信息)。?

A收到B的確認(rèn)后進(jìn)入等待狀態(tài),等待B請(qǐng)求釋放連接, B數(shù)據(jù)發(fā)送完成后就向A請(qǐng)求連接釋放,也是用FIN=1 表示, 并且用 ack = u+1(如圖), A收到后回復(fù)一個(gè)確認(rèn)信息,并進(jìn)入 TIME_WAIT 狀態(tài), 等待 2MSL 時(shí)間

另外服務(wù)器B存在一個(gè)保活狀態(tài),即如果A突然故障死機(jī)了,那B那邊的連接資源什么時(shí)候能釋放呢?? 就是保活時(shí)間到了后,B會(huì)發(fā)送探測信息, 以決定是否釋放連接。

為了這種情況: B向A發(fā)送 FIN = 1 的釋放請(qǐng)求,但這個(gè)報(bào)文丟失了, A沒有接到不會(huì)發(fā)送確認(rèn)信息, B 超時(shí)會(huì)重傳,這時(shí)A在 TIME_WAIT?還能夠接收到這個(gè)請(qǐng)求,這時(shí)再回復(fù)一個(gè)確認(rèn)就行了。(A收到 FIN = 1 的請(qǐng)求后 等待時(shí)間(2MSL) 會(huì)重新記時(shí))

為什么要TIME_WAIT等待呢?

  • 如果 【最后一步】A 響應(yīng)ACK 包丟失,B 會(huì)以為 A 沒有收到自己的關(guān)閉請(qǐng)求,然后B會(huì)重試向 A 再發(fā) FIN 包。如果沒有 TIME_WAIT 狀態(tài),A 不再保存這個(gè)連接的信息,收到一個(gè)不存在的連接的包,A 會(huì)響應(yīng) RST 包,導(dǎo)致 B 端異常響應(yīng)。

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

  • 我們還知道,TCP 下的 IP 層協(xié)議是無法保證包傳輸?shù)南群箜樞虻?/span>。如果雙方揮手之后,一個(gè)網(wǎng)絡(luò)四元組(src/dst ip/port)被回收,而此時(shí)網(wǎng)絡(luò)中還有一個(gè)【遲到的數(shù)據(jù)包】沒有被 B 接收,A 應(yīng)用程序又立刻使用了同樣的四元組再創(chuàng)建了一個(gè)新的連接后,這個(gè)遲到的數(shù)據(jù)包才到達(dá) B,那么這個(gè)數(shù)據(jù)包就會(huì)讓 B 以為是 A 剛發(fā)過來的。

    此時(shí), TIME_WAIT 是為了保證迷失的數(shù)據(jù)包正常過期

MSL時(shí)長的確定

由原因來推實(shí)現(xiàn),TIME_WAIT 狀態(tài)的保持時(shí)長也就可以理解了。確定 TIME_WAIT 的時(shí)長主要考慮上文的第二種情況,保證關(guān)閉連接后這個(gè)連接在網(wǎng)絡(luò)中的所有數(shù)據(jù)包都過期。

說到過期時(shí)間,不得不提另一個(gè)概念: 最大分段壽命(MSL, Maximum Segment Lifetime),它表示一個(gè) TCP 分段可以存在于互聯(lián)網(wǎng)系統(tǒng)中的最大時(shí)間,由 TCP 的實(shí)現(xiàn),超出這個(gè)壽命的分片都會(huì)被丟棄。

TIME_WAIT 狀態(tài)由主動(dòng)關(guān)閉的 A 來保持,那么我們來考慮對(duì)于 A 來說,可能接到上一個(gè)連接的數(shù)據(jù)包的最大時(shí)長:A 剛發(fā)出的數(shù)據(jù)包,能保持 MSL 時(shí)長的壽命,它到了 B 端后,B 端由于關(guān)閉連接了,會(huì)響應(yīng) RST 包,這個(gè) RST 包最長也會(huì)在 MSL 時(shí)長后到達(dá) A,那么 A 端只要保持 TIME_WAIT 到達(dá) 2MS 就能保證網(wǎng)絡(luò)中這個(gè)連接的包都會(huì)消失。

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

什么是2MSL

MSL是Maximum Segment Lifetime英文的縮寫,中文可以譯為“報(bào)文最大生存時(shí)間”,他是任何報(bào)文在網(wǎng)絡(luò)上存在的最長時(shí)間,超過這個(gè)時(shí)間報(bào)文將被丟棄。因?yàn)閠cp報(bào)文(segment)是ip數(shù)據(jù)報(bào)(datagram)的數(shù)據(jù)部分,具體稱謂請(qǐng)參見《數(shù)據(jù)在網(wǎng)絡(luò)各層中的稱呼》一文,而ip頭中有一個(gè)TTL域,TTL是time to live的縮寫,中文可以譯為“生存時(shí)間”,這個(gè)生存時(shí)間是由源主機(jī)設(shè)置初始值但不是存的具體時(shí)間,而是存儲(chǔ)了一個(gè)ip數(shù)據(jù)報(bào)可以經(jīng)過的最大路由數(shù),每經(jīng)過一個(gè)處理他的路由器此值就減1,當(dāng)此值為0則數(shù)據(jù)報(bào)將被丟棄,同時(shí)發(fā)送ICMP報(bào)文通知源主機(jī)。RFC 793中規(guī)定MSL為2分鐘,實(shí)際應(yīng)用中常用的是30秒,1分鐘和2分鐘等。

????2MSL即兩倍的MSL,TCP的TIME_WAIT狀態(tài)也稱為2MSL等待狀態(tài),當(dāng)TCP的一端發(fā)起主動(dòng)關(guān)閉,在發(fā)出最后一個(gè)ACK包后,即第3次握手完成后發(fā)送了第四次握手的ACK包后就進(jìn)入了TIME_WAIT狀態(tài),必須在此狀態(tài)上停留兩倍的MSL時(shí)間,等待2MSL時(shí)間主要目的是怕最后一個(gè)ACK包對(duì)方?jīng)]收到,那么對(duì)方在超時(shí)后將重發(fā)第三次握手的FIN包,主動(dòng)關(guān)閉端接到重發(fā)的FIN包后可以再發(fā)一個(gè)ACK應(yīng)答包。在TIME_WAIT狀態(tài)時(shí)兩端的端口不能使用,要等到2MSL時(shí)間結(jié)束才可繼續(xù)使用。當(dāng)連接處于2MSL等待階段時(shí)任何遲到的報(bào)文段都將被丟棄。不過在實(shí)際應(yīng)用中可以通過設(shè)置SO_REUSEADDR選項(xiàng)達(dá)到不必等待2MSL時(shí)間結(jié)束再使用此端口。

TTL與MSL是有關(guān)系的但不是簡單的相等的關(guān)系,MSL要大于等于TTL。

?

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。