吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

網(wǎng)絡(luò)協(xié)議:TCP的三次握手,四次揮手技術(shù)解析

454398 ? 來源:博客園 ? 作者:北國丶風(fēng)光 ? 2020-10-26 15:28 ? 次閱讀

TCP 包頭格式

老規(guī)矩,咱們先來看看 TCP 頭的格式。

從上面這個圖可以看出,它比 UDP 要復(fù)雜的多。而復(fù)雜的地方,也正是它為了解決 UDP 存在的問題所必需的字段。

首先,源端口號和目標(biāo)端口號是兩者都有,不可缺少的字段。

接下來是包的序號給包編號就是為了解決亂序的問題。老大哥做事,穩(wěn)重為主,一件件來,面臨再復(fù)雜的情況,也臨危不亂。

除了發(fā)送端需要給包編號外,接收方也會回復(fù)確認(rèn)序號。做事靠譜,答應(yīng)了就要做到,暫時做不到也要給個回復(fù)。

這里要注意的是,TCP 是個老大哥沒錯,但不能說他一定會保證傳輸準(zhǔn)確無誤的完成。從 IP 層面來講,如果網(wǎng)絡(luò)的確那么差,是沒有任何可靠性保證的,即使 TCP 老大哥再穩(wěn),他也管不了 IP 層丟包,他只能盡可能的保證在他的層面上的可靠性。

然后是一些狀態(tài)位。有以下常見狀態(tài)位:

SYN(Synchronize Sequence Numbers,同步序列編號):發(fā)起一個連接

ACK(Acknowledgement,確認(rèn)字符):回復(fù)

RST(Connection reset):重新連接

FIN:結(jié)束連接

從這些狀態(tài)位就可以看出,TCP 基于“性惡論”,警覺性就很高,不像 UDP 和小朋友似的,隨便一個不認(rèn)識的小朋友都能玩到一起,他與別人的信任要經(jīng)過多次交互才能建立。

還有一個窗口大小。這個是 TCP 用來進(jìn)行流量控制的。通信雙方各聲明一個窗口,標(biāo)識自己當(dāng)前的處理能力,讓發(fā)送端別發(fā)送的太快,要不然撐死接收端。也不能發(fā)送的太慢,要不然就餓死接收端了。

根據(jù)上述對 TCP 頭的分析,我們知道對于 TCP 協(xié)議要重點關(guān)注以下幾個問題:

  • 順序問題,穩(wěn)重不亂;
  • 丟包問題,承諾靠譜;
  • 連接偉豪,有始有終;
  • 流量控制,把握分寸;
  • 擁塞控制,知進(jìn)知退。

TCP 的三次握手

了解完 TCP 頭,我們就來看下 TCP 建立連接的過程,這就是著名的“三次握手”。

三次握手,過程是這樣子的:

A:你好,我是 A(SYN)。

B:你好 A,我是 B(SYN,ACK)。

A:你好 B(ACK 的 ACK)。

著重記憶上述過程,后續(xù)很多分析都是基于這個過程來的。

記得剛接觸三次握手的時候,就一直很納悶,為啥一定要三次?兩次不行嗎?四次不行嗎?然后很多人就解釋,如果是兩次,就怎樣怎樣,四次,又怎樣怎樣?但這其實都是從結(jié)果推原因,沒有說明本質(zhì)。

我們應(yīng)該知道,握手是為了建立穩(wěn)定的連接,這個是最終目的。而要達(dá)到這個目的,就要通信雙方的交互形成一個確認(rèn)的閉環(huán)

拿上述 A、B 通信的例子來看,A 給 B 發(fā)信息,B 要告訴 A 他收到信息了。這時候,算是一個確認(rèn)閉環(huán)嗎?明顯不是,因為 B 沒有收到來自 A 的確認(rèn)信息。

所以,要達(dá)到我們上述的目標(biāo),還要 A 給 B 一個確認(rèn)信息,這樣就形成了一個確認(rèn)閉環(huán)

A 給 B 的確認(rèn)信息發(fā)出后,遇到網(wǎng)絡(luò)不好的情況,也會出現(xiàn)丟包的情況。按理來說,還應(yīng)該有個回應(yīng),但是,我們發(fā)現(xiàn),好像這樣下去就沒玩沒了啦。

所以,我們說,只要通信雙方形成一個確認(rèn)閉環(huán)后,就認(rèn)為連接已建立。一旦連接建立,A 會馬上發(fā)送數(shù)據(jù),而 A 發(fā)送數(shù)據(jù),后續(xù)的很多問題都得到了解決。

例如 A 發(fā)給 B 的確認(rèn)消息丟了,當(dāng) A 后續(xù)發(fā)送的數(shù)據(jù)到達(dá)的時候,B 可以認(rèn)為這個連接已經(jīng)建立。如果 B 直接掛了,A 發(fā)送的數(shù)據(jù)就會報錯,說 B 不可達(dá),這樣,A 也知道 B 出事情了。

三次握手除了通信雙方建立連接外,主要還是為了溝通 TCP 包的序號問題

A 要告訴 B,我發(fā)起的包的序號起始是從哪個號開始的,B 也要告訴 A,B 發(fā)起的包的序號的起始號。

TCP 包的序號是會隨時間變化的,可以看成一個 32 位的計數(shù)器,每 4ms 加一。計算一下,這樣到出現(xiàn)重復(fù)號,需要 4 個多小時。但是,4 個小時后,還沒到達(dá)目的地的包早就死翹翹了。這是因為 IP 包頭里的 TTL(生存時間)。

為什么序號不能從 1 開始呢?因為這樣會很容易出現(xiàn)沖突。

例如,A 連上 B 之后,發(fā)送了 1、2、3 三個包,但是發(fā)送 3 的時候,中間丟了,或者繞路了,于是重新發(fā)送,后來 A 掉線了,重新連上 B 后,序號又從 1 開始,然后發(fā)送 2,但是壓根沒想發(fā)送 3,而如果上次繞路的那個 3 剛好又回來了,發(fā)給了 B ,B 自然就認(rèn)為,這就是下一包,于是發(fā)生了錯誤。

就這樣,雙方歷經(jīng)千辛萬苦,終于建立了連接。前面也說過,為了維護(hù)這個連接,雙方都要維護(hù)一個狀態(tài)機,在連接建立的過程中,雙方的狀態(tài)變化時序圖就像下面這樣:

整體過程是:

客戶端和服務(wù)端都處于 CLOSED 狀態(tài);

服務(wù)端主動監(jiān)聽某個端口,處于 LISTEN 狀態(tài);

客戶端主動發(fā)起連接 SYN,處于 SYN-SENT 狀態(tài)。

服務(wù)端收到客戶端發(fā)起的連接,返回 SYN,并且 ACK 客戶端的 SYN,處于 SYN-RCVD 狀態(tài);

客戶端收到服務(wù)端發(fā)送的 SYN 和 ACK 之后,發(fā)送 ACK 的 ACK,處于 ESTABLISHED 狀態(tài);

服務(wù)端收到 ACK 的 ACK 之后,處于 ESTABLISHED 狀態(tài)。

TCP 的四次揮手

說完了連接,接下來就來了解下 TCP 的“再見模式”。這也常被稱為四次揮手

還拿 A 和 B 舉例,揮手過程:

A:B 啊,我不想和你玩了。

B:哦,你不想玩了啊,我知道了。這個時候,還只是 A 不想玩了,就是說 A 不會再發(fā)送數(shù)據(jù),但是 B 此時還沒做完自己的事情,還是可以發(fā)送數(shù)據(jù)的,所以此時的 B 處于半關(guān)閉狀態(tài)

B:A啊,好吧,我也不想和你玩了,拜拜。

A:好的,拜拜。

這樣這個連接就關(guān)閉了。看起來過程很順利,是的,這是通信雙方“和平分手”的場面。

A 開始說“不玩了”,B 說“知道了”,這個回合,是沒什么問題的,因為在此之前,雙方還處于合作的狀態(tài)。

如果 A 說“不玩了”,沒有收到回復(fù),那么 A 會重新發(fā)送“不玩了”。但是這個回合結(jié)束之后,就很可能出現(xiàn)異常情況了,因為有一方率先撕破臉。這種撕破臉有兩種情況。

一種情況是,A 說完“不玩了”之后,A 直接跑路,這是會有問題的,因為 B 還沒有發(fā)起結(jié)束,而如果 A 直接跑路,B 就算發(fā)起結(jié)束,也得不到回答,B 就就不知道該怎么辦了。

另一種情況是,A 說完“不玩了”,B 直接跑路。這樣也是有問題的,因為 A 不知道 B 是還有事情要處理,還是過一會發(fā)送結(jié)束。

為了解決這些問題,TCP 專門設(shè)計了幾個狀態(tài)來處理這些問題。接下來,我們就來看看斷開連接時的狀態(tài)時序圖

整體過程是:

A 說“不玩了”,就進(jìn)入 FIN_WAIT_1 狀態(tài);

B 收到 “A 不玩”的消息后,回復(fù)“知道了”,就進(jìn)入 CLOSE_WAIT 狀態(tài);

A 收到“B 說知道了”,進(jìn)入 FIN_WAIT_2 狀態(tài)。這時候,如果B 直接跑路,則 A 將永遠(yuǎn)在這個狀態(tài)。TCP 協(xié)議里面并沒有對這個狀態(tài)的處理,但是 Linux 有,可以調(diào)整 tcp_fin_timeout 這個參數(shù),設(shè)置一個超時時間;

B 沒有跑路,發(fā)送了“B 也不玩了”的消息,處于 LAST_ACK 狀態(tài);

A 收到“B 說不玩了”的消息,回復(fù)“A 知道 B 也不玩了”的消息后,從 FINE_WAIT_2 狀態(tài)結(jié)束。

最后一個步驟里,如果 A 直接跑路了,也會出現(xiàn)問題。因為 A 的最后一個回復(fù),B 如果沒有收到的話就會重復(fù)第 4 步,但是因為 A 已經(jīng)跑路了,所以 B 會一直重復(fù)第 4 步。

因此,TCP 協(xié)議要求 A 最后要等待一段時間,這個等待時間是 TIME_WAIT,這個時間要足夠長,長到如果 B 沒收到 A 的回復(fù),B 重發(fā)給 A,A 的回復(fù)要有足夠時間到達(dá) B。

A 直接跑路還有一個問題是,A 的端口就空出來了,但是 B 不知道,B 原來發(fā)過的很多包可能還在路上,如果 A 的端口被新的應(yīng)用占用了,這個新的應(yīng)用會受到上個連接中 B 發(fā)過來的包,雖然序列號是重新生成的,但是這里會有一個雙保險,防止產(chǎn)生混亂。因此也需要 A 等待足夠長的時間,等到 B 發(fā)送的所有未到的包都“死翹翹”,再空出端口。

這個等待的時間設(shè)為 2MSL,MSL 是Maximum Segment Lifetime,即報文最大生存時間。它是任何報文再網(wǎng)絡(luò)上存在的最長時間,超過這個時間的報文就會被丟棄。

因為 TCP 報文基于 IP 協(xié)議,而 IP 頭中有一個 TTL 域,是 IP 數(shù)據(jù)報可以經(jīng)過的最大路有數(shù),每經(jīng)過一個處理他的路由器,此值就減 1,當(dāng)此值為 0 時,數(shù)據(jù)報就被丟棄,同時發(fā)送 ICMP 報文通知源主機。協(xié)議規(guī)定 MSL 為 2 分鐘,實際應(yīng)用中常用的是 30 秒、1分鐘和 2 分鐘等。

還有一種異常情況,B 超過了 2MS 的時間,依然沒有收到它發(fā)的 FIN 的 ACK。按照 TCP 的原理,B 當(dāng)然還會重發(fā) FIN,這個時候 A 再收到這個包之后,就表示,我已經(jīng)等你這么久,算是仁至義盡了,再來的數(shù)據(jù)包我就不認(rèn)了,于是直接發(fā)送 RST,這樣 B 就知道 A 跑路了。

TCP 狀態(tài)機

將連接建立和連接斷開的兩個時序狀態(tài)圖綜合起來,就是著名的TCP 狀態(tài)機。我們可以將這個狀態(tài)機和時序狀態(tài)機對照看,就會更加明了。

圖中加黑加粗部分,是上面說到的主要流程,相關(guān)說明:

阿拉伯?dāng)?shù)字序號:建立連接順序;

大寫中文數(shù)字序號:斷開連接順序;

加粗實線:客戶端 A 的狀態(tài)變遷;

加粗虛線:服務(wù)端 B 的狀態(tài)變遷;

總結(jié)

TCP 包頭很復(fù)雜,主要關(guān)注 5 個問題。順序問題、丟包問題、連接維護(hù)、流量控制、擁塞控制;

建立連接三次握手,斷開連接四次揮手,狀態(tài)圖要牢記。
編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 網(wǎng)絡(luò)協(xié)議

    關(guān)注

    3

    文章

    269

    瀏覽量

    21636
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1378

    瀏覽量

    79309
  • 狀態(tài)機
    +關(guān)注

    關(guān)注

    2

    文章

    492

    瀏覽量

    27652
收藏 人收藏

    評論

    相關(guān)推薦

    一文看懂TCP三次握手工作原理

    的那樣云山霧繞。為了實現(xiàn)可靠數(shù)據(jù)傳輸,?TCP 協(xié)議的通信雙方, 都必須維護(hù)一個序列號, 以標(biāo)識發(fā)送出去的數(shù)據(jù)包中, 哪些是已經(jīng)被對方收到的。三次握手的過程即是通信雙方相互告知序列號起
    的頭像 發(fā)表于 01-09 10:19 ?190次閱讀
    一文看懂<b class='flag-5'>TCP</b><b class='flag-5'>三次</b><b class='flag-5'>握手</b>工作原理

    如何監(jiān)測TCP三次握手過程

    在計算機網(wǎng)絡(luò)中,傳輸控制協(xié)議TCP)是確保數(shù)據(jù)可靠傳輸?shù)年P(guān)鍵協(xié)議之一。TCP通過三次
    的頭像 發(fā)表于 01-06 09:20 ?218次閱讀

    TCP三次握手與負(fù)載均衡的配置

    在計算機網(wǎng)絡(luò)中,TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。它通過三次
    的頭像 發(fā)表于 01-06 09:15 ?233次閱讀

    TCP三次握手如何影響網(wǎng)絡(luò)性能

    在計算機網(wǎng)絡(luò)中,TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。它通過三次握手過程來建立兩個
    的頭像 發(fā)表于 01-06 09:13 ?240次閱讀

    TCP三次握手的常見問題及解決方案

    TCP三次握手(Three-way Handshake)是TCP(傳輸控制協(xié)議)建立連接時的一個過程,它確保了兩個端點在開始通信之前都準(zhǔn)備好
    的頭像 發(fā)表于 01-06 09:11 ?339次閱讀

    TCP三次握手與連接建立的關(guān)系

    在計算機網(wǎng)絡(luò)中,TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。它負(fù)責(zé)在兩個主機之間建立、維護(hù)和終止連接,確保數(shù)據(jù)的可靠傳輸。
    的頭像 發(fā)表于 01-06 09:09 ?232次閱讀

    TCP三次握手的步驟詳解

    1.TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。在兩個主機之間建立通信之前,必須通過三次握手過程來建立一個穩(wěn)定的連接。這個過程確保了兩個端點都準(zhǔn)備好發(fā)送和接收數(shù)據(jù)。 2
    的頭像 發(fā)表于 01-06 09:07 ?235次閱讀

    TCP三次握手網(wǎng)絡(luò)抓包分析

    在計算機網(wǎng)絡(luò)中,TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議TCP通過
    的頭像 發(fā)表于 01-06 09:05 ?238次閱讀

    TCP三次握手安全性分析

    TCP(傳輸控制協(xié)議)的三次握手是建立可靠連接的重要機制,它確保了通信雙方在數(shù)據(jù)傳輸前的連接狀態(tài)是可靠和準(zhǔn)確的。然而,從安全性的角度來分析,TCP
    的頭像 發(fā)表于 01-03 18:10 ?548次閱讀

    TCP三次握手與UDP的區(qū)別

    、連接管理、可靠性、效率等方面有著顯著的區(qū)別。 1. TCP三次握手 TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。在數(shù)據(jù)傳輸
    的頭像 發(fā)表于 01-03 17:35 ?439次閱讀

    TCP三次握手的基本原理

    在計算機網(wǎng)絡(luò)中,TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。它確保了數(shù)據(jù)在網(wǎng)絡(luò)中傳輸?shù)目煽啃院晚樞蛐浴榱私?/div>
    的頭像 發(fā)表于 01-03 17:25 ?518次閱讀

    TCP三次握手協(xié)議的作用

    在計算機網(wǎng)絡(luò)中,數(shù)據(jù)的傳輸需要在發(fā)送方和接收方之間建立一個穩(wěn)定的連接,以確保數(shù)據(jù)的完整性和順序。TCP(傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它通過
    的頭像 發(fā)表于 01-03 17:15 ?360次閱讀

    TCP三次握手的詳細(xì)過程

    TCP(傳輸控制協(xié)議三次握手是一種在互聯(lián)網(wǎng)上建立一個可靠的、有序的和錯誤檢測能力的連接的方法。這個過程確保了兩個設(shè)備(通常是客戶端和服務(wù)器)在數(shù)據(jù)傳輸開始之前能夠相互確認(rèn)對方的存在和
    的頭像 發(fā)表于 01-03 17:11 ?394次閱讀

    DHCP 四次握手

    DHCP的四次握手過程大白話大致如下: 客戶端:剛開機,還沒有IP地址,哪位佬能給個IP? 這個過程中,客戶端就是一個網(wǎng)絡(luò)小白,它也不知道自己IP是多少,就開始喊話,問有沒有DHCP服務(wù)器能給它分配
    的頭像 發(fā)表于 12-25 10:11 ?172次閱讀

    簡述TCP協(xié)議三次握手機制

    TCP(Transmission Control Protocol,傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。它主要用于在IP網(wǎng)絡(luò)中進(jìn)行數(shù)據(jù)傳輸。
    的頭像 發(fā)表于 08-16 10:57 ?1212次閱讀
    百家乐官网之三姐妹赌博机| 大发888秘籍| 百家乐官网保单破解方法| 百家乐小九梭哈| 现场百家乐官网电话投注| 百家乐微笑投注| 百家乐官网下注几多| 362百家乐的玩法技巧和规则| 太阳城百家乐官网怎么出千| 新全讯网网站| 新濠百家乐官网的玩法技巧和规则 | 百家乐象棋赌博| 百家乐官网打大必赢之法| 二八杠技术| 风水上看做生意养金毛好吗| 城口县| 电子百家乐破| 百家乐官网遥控洗牌器| bet365娱乐城注册| 澳门百家乐娱乐开户| 百家乐官网怎么样投注| 大发888laohuji| 沙龙百家乐官网娱乐场开户注册| 大发体育场| 百家乐是怎样算牌| 欧洲百家乐官网的玩法技巧和规则| 寻乌县| 大发888娱乐城真钱lm0| 澳门百家乐博彩网| 百家乐官网的桌子| 棋牌评测网xjqppc| 奔驰百家乐游戏电玩| 百家乐官网赌博筹码| 皇冠网络| 威尼斯人娱乐场门票| 百家乐靠什么赢| 赌场百家乐官网信誉| 永利博网址| 中国百家乐澳门真人娱乐平台网址| 百家乐视频麻将| 环球百家乐官网现金网|