溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

TCP/IP協(xié)議中三次握手過程及原因是什么

發(fā)布時間:2021-11-20 09:47:01 來源:億速云 閱讀:164 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)TCP/IP協(xié)議中三次握手過程及原因是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

三次握手都做什么?

三次握手 建立起 TCP連接 的 reliable,分配初始序列號和資源,在相互確認之后開始數(shù)據(jù)的傳輸。有 主動打開(一般是client) 和 被動打開(一般是server)。

TCP使用3次握手建立一條連接,該握手初始化了傳輸可靠性以及數(shù)據(jù)順序性必要的信息,這些信息包括兩個方向的初始序列號,確認號由初始序列號生成,使用3次握手是因為3次握手已經(jīng)準備好了傳輸可靠性以及數(shù)據(jù)順序性所必要的信息,該握手的第3次實際上并不是需要單獨傳輸?shù)?,完全可以和?shù)據(jù)一起傳輸。詳細過程如下所示:

第一步,Client會進入SYN_SENT狀態(tài),并發(fā)送Syn 消息給Server端,SYN標志位在此場景下被設(shè)置為1,同時會帶上Client這端分配好的Seq號,這個序列號是一個U32的整型數(shù),該數(shù)值的分配是根據(jù)時間產(chǎn)生的一個隨機值,通常情況下每間隔4ms會加1。除此之外還會帶一個MSS,也就是最大報文段長度,表示Tcp傳往另一端的最大數(shù)據(jù)塊的長度。

第二步,Server端在收到,Syn消息之后,會進入SYN_RCVD狀態(tài),同時返回Ack消息給Client,用來通知Client,Server端已經(jīng)收到SYN消息并通過了確認。這一步Server端包含兩部分內(nèi)容,一部分是回復(fù)Client的Syn消息,其中ACK=1,Seq號設(shè)置為Client的Syn消息的Seq數(shù)值+1;另一部分是主動發(fā)送Sever端的Syn消息給Client,Seq號碼是Server端上面對應(yīng)的序列號,當然Syn標志位也會設(shè)置成1,MSS表示的是Server這一端的最大數(shù)據(jù)塊長度。

第三步,Client在收到第二步消息之后,首先會將Client端的狀態(tài)從SYN_SENT變換成ESTABLISHED,此時Client發(fā)消息給Server端,這個方向的通道已經(jīng)建立成功,Client可以發(fā)送消息給Server端了,Server端也可以成功收到這些消息。其次,Client端需要回復(fù)ACK消息給Server端,消息包含ACK狀態(tài)被設(shè)置為1,Seq號碼被設(shè)置成Server端的序列號+1。(備注:這一步往往會與Client主動發(fā)起的數(shù)據(jù)消息,合并到一起發(fā)送給Server端。)

第四步,Server端在收到這個Ack消息之后,會進入ESTABLISHED狀態(tài),到此時刻Server發(fā)向Client的通道連接建立成功,Server可以發(fā)送數(shù)據(jù)給Client,TCP的全雙工連接建立完成。

TCP/IP協(xié)議中三次握手過程及原因是什么

圖片來自網(wǎng)絡(luò),侵權(quán)請告知,會及時刪除

為什么需要三次握手?

TCP的連接因為是全雙工的,也就是Client和Server兩端,發(fā)送消息兩個方向的連接都要建立成功。如果要保證雙向連接都成功的話,三次通信是最少的次數(shù)了。大于三次的話,后面的次數(shù)通信就沒有必要了,是在浪費資源。

二次的話,會怎么樣,可不可以呢?答案是不可以,我們來看下,下面的場景。

在談?wù)撨@個之前,我們先要知道TCP是基于IP協(xié)議的,而IP協(xié)議是有路由的,IP協(xié)議不能夠保證先發(fā)送的數(shù)據(jù)先到達,這當中依賴于IP協(xié)議底層的網(wǎng)絡(luò)質(zhì)量,以及Client與Server之間的路由跳數(shù)。

Client在發(fā)送完Syn消息1,這里稱作Syn1之后,假設(shè)因為網(wǎng)絡(luò)原因,Syn1并沒有到達Server端,這個時候Client端已經(jīng)超時,Client之后重新發(fā)起SYN消息,這里稱作Syn2。結(jié)果由于網(wǎng)絡(luò)原因Syn2先到達Server,Server于是與Client基于Syn2建立了連接,結(jié)果沒過多久Syn1又到達了Server,Server于是關(guān)掉了Syn2建立的那條連接,又重新建立了一條連接。對于Client來說新建立的這條連接是早就過時的,所以Client不會在這條連接上發(fā)送任何數(shù)據(jù),這就導致了Server端長時間收不到數(shù)據(jù),Client新的連接被斷掉了。

三次握手失敗了會怎么樣?

這里要看是在那個階段失敗的,Client在發(fā)送SYN之后沒有收到ACK消息,Client會進行重傳,第一次重傳時間5.5-6s之間,第二次重傳會是24s,不成功還會繼續(xù)嘗試,伯克利系統(tǒng)在超過75s之后,如果還是不成功,會放棄嘗試連接。(備注:這里面的重傳時間設(shè)置,與底層的定時器設(shè)置有過關(guān)系,可以參考TCP/IP詳解卷1,這里不做詳談。)

如果Server沒有收到最后的一次Ack消息,同樣的原理,Server也會進行重傳第二步的Syn+Ack消息。

三次握手的狀態(tài)轉(zhuǎn)換?

TCP的狀態(tài)變化圖如下所示,Client和Server的初始狀態(tài)都是CLOSED狀態(tài),其中:

Client:

CLOSED-----發(fā)送Syn 消息--->SYN_SENT-----收到Server端發(fā)回的SYN+ACK--->ESTABLISHED---發(fā)送和接收數(shù)據(jù)-->......

Server:

CLOSED----收到Client端發(fā)送過來的SYN消息-->SYN_RCVD-----發(fā)送SYN+ACK消息--->SYN_RCVD----收到Client發(fā)回來的ACK消息--->ESTABLISHED-----發(fā)送和接收數(shù)據(jù)-->......

TCP/IP協(xié)議中三次握手過程及原因是什么

其中TCP的三次握手與Scoket的函數(shù)對應(yīng)關(guān)系如下所示:

TCP/IP協(xié)議中三次握手過程及原因是什么

備注:connect時,觸發(fā)了連接請求,向服務(wù)器發(fā)送了SYN J包,這時connect進入阻塞狀態(tài);服務(wù)器監(jiān)聽到連接請求,即收到SYN J包,調(diào)用accept函數(shù)接收請求向客戶端發(fā)送SYN K ,ACK J+1,這時accept進入阻塞狀態(tài);客戶端收到服務(wù)器的SYN K ,ACK J+1之后,這時connect返回,并對SYN K進行確認;服務(wù)器收到ACK K+1時,accept返回,至此三次握手完畢,連接建立。

上述就是小編為大家分享的TCP/IP協(xié)議中三次握手過程及原因是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI