TCP的三次握手和四次揮手

目錄

  • 名詞解釋
  • TCP的三次握手
    • TCP建立鏈接的步驟
    • TCP的三次握手步驟
    • 思考:TCP握手為什么不是兩次 or 四次?
  • TCP的四次揮手
    • TCP斷開鏈接的步驟
    • TCP的四次揮手步驟
    • 思考:為什么斷開鏈接的時候要多一個步驟2呢处坪?
    • 思考:為什么最后客戶端確認斷開鏈接之后還要等待2WSL呢根资?
  • 面試題:TCP為什么是3次握手架专,4次揮手?

這是一個計算機網(wǎng)絡中一個很熱門玄帕,很基礎的問題部脚,也是面試常考的一個題裤纹,如果你會那不稀奇委刘,如果你不會,那就會涼涼鹰椒。我這里來對我學的東西做一個整理锡移,看完時候對這里的知識應該會很清晰。首先先來名詞解釋漆际,如果遇到不清晰的名詞淆珊,記得反過頭來看。

名詞解釋

  • TCPTCP在計算機網(wǎng)絡模型的傳輸層奸汇,對應的是主機到主機的傳輸施符,為應用間通信提供能力。TCP是一個雙工協(xié)議擂找,數(shù)據(jù)任何時候都可以雙向傳輸戳吝,這就意味著客戶端和服務端可以平等地發(fā)送、接收信息贯涎。

  • 鏈接:是傳輸層的概念听哭,鏈接是一種傳輸數(shù)據(jù)的行為,是網(wǎng)絡行為狀態(tài)的記錄塘雳。在傳輸之前陆盘,建立一個鏈接,就是在數(shù)據(jù)收發(fā)雙方的內(nèi)存中都建立一個用于維護數(shù)據(jù)傳輸狀態(tài)的對象粉捻,里面記錄了雙方的IP和端口號礁遣,狀態(tài)是怎樣,傳輸速度是如何等肩刃。

  • 雙工/單工

名稱 概念 線路數(shù)量
單工 在任何一個時刻祟霍,如果數(shù)據(jù)只能單向發(fā)送 只需1條( =1 )
半雙工 在某個時刻數(shù)據(jù)可以向一個方向傳輸,也可以向另一個方向反方向傳輸盈包,而且交替進行 至少 1 條( >= 1 )
全雙工 任何時刻數(shù)據(jù)都可以雙向收發(fā) 大于 1 條( >1 )
  • 握手TCP的握手目的是為了建立穩(wěn)定的鏈接通道叽粹。
  • 揮手TCP的揮手目的是為了斷開鏈接烘绽。
  • WSL(Maximum Segment Lifetime):報文最大生存時間朵你,TCP允許不同的實現(xiàn)可以設置不同的WSL值原茅。
  • seq序號:用來標識從TCP源端向目的端發(fā)送的字節(jié)流,發(fā)起方發(fā)送數(shù)據(jù)時對此進行標記??叛氨。
  • ack確定序號:只有ACK標志為1時呼渣,確認序號字段才有效棘伴,ack = seq + 1
  • 標志位:
    • SYN(Synchronization):一個 Host主動向另一個 Host發(fā)起連接,請求同步屁置。
    • ACK(Acknowledgement):因為要保持連接和可靠性約束焊夸,TCP協(xié)議要保證每一條發(fā)出的數(shù)據(jù)必須給返回。接收方收到數(shù)據(jù)后蓝角,都需要給發(fā)送方一個響應確認序號有序阱穗。
    • RST(Reset):重置鏈接
    • FIN(Finish):一個Host主動斷開請求,請求完成
    • PSH(Push):一個 Host給另一個Host發(fā)送數(shù)據(jù)使鹅,數(shù)據(jù)推送
    • ...

TCP的三次握手

TCP的三次握手揪阶,相對來說是一個比較完整的機制,旨在建立穩(wěn)定的傳輸通道患朱。

TCP建立鏈接的步驟

下面來看一下TCP建立鏈接的6個步驟:

  1. 客戶端發(fā)消息給服務端(SYN)
  2. 服務端準備好進行連接
  3. 服務端針對客戶端的(SYN)給一個(ACK)
  4. 服務端發(fā)送一個(SYN)給客戶端
  5. 客戶端準備就緒
  6. 客戶端給服務端發(fā)送一個(ACK)

其中鲁僚,2和5步驟是不需要進行握手的,3和4是可以合并到一起的裁厅。所以雖然建立鏈接要6步但是只需要三次握手蕴茴,分別是1,3+4姐直,6。

TCP的三次握手步驟

下面我們把三次握手的過程還原一下:

TCP的三次握手.jpg
  • 開始客戶端和服務端都處于CLOSED的狀態(tài)蒋畜,客戶端發(fā)送SYN=1給服務端表示要求建立鏈接声畏,并且發(fā)送了一個seq序號,這個時候客戶端的狀態(tài)變成SYN-SEND姻成。
  • 服務端收到消息返回一個ACK=1表示確認收到插龄,還有ack確定序號,是上一個seq序號+1科展,即x+1均牢,還有本次的seq序號y,還有一個SYN=1建立鏈接才睹,這個時候服務端狀態(tài)變成SYN-REVD徘跪。
  • 客戶端收到消息之后向服務端發(fā)送一個ACK=1表示確認收到,還有一個新的seq序號是x+1琅攘,還有一個ack確定序號是上一個seq序號+1垮庐,即y+1。完成之后客戶端的狀態(tài)編程ESTABLISHED坞琴。
  • 服務端接收到消息之后狀態(tài)也變成ESTABLISHED哨查,鏈接通道建立。

簡要總結就是:

  1. 客戶端 -> SYN -> 服務端
  2. 客戶端 <- SYN+ACK <- 服務端
  3. 客戶端 -> ACK -> 服務端

思考:TCP握手為什么不是兩次 or 四次剧辐?

設想一下寒亥,如果只有兩次邮府,服務端還沒有確定客戶端是否準備好了,這樣是無法穩(wěn)定的進行數(shù)據(jù)傳輸?shù)母绒取H绻拇喂涌斩烁鶕?jù)客戶端的ACK再給客戶端回復一個ACK,沒有什么很大的作用還造成資源浪費腐宋,那就是很沒有必要的事情了紊服。三次正好既可以保證可靠傳輸,也可以提高傳輸效率胸竞,

TCP的四次揮手

TCP的揮手旨在把鏈接狀態(tài)斷開

TCP斷開鏈接的步驟

  1. 客戶端發(fā)消息要求斷開鏈接(FIN)欺嗤。
  2. 服務端接收到請求后,會先對自己是否收到請求回應(ACK)卫枝。
  3. 服務端處理剩余的事情煎饼,例如服務端還有沒有發(fā)送完的消息,服務端可能還有發(fā)送出去的消息沒有得到ACK校赤;也有可能服務端自己有資源要釋放等吆玖。
  4. 服務端處理完自己的事情,告訴客戶端可以關閉鏈接了(FIN)马篮。
  5. 客戶端收到FIN沾乘,處理自己完成的事情,比如客戶端有發(fā)送給服務端沒有收到 ACK的請求等浑测。
  6. 客戶端處理完成自己的事情翅阵,告訴服務端可以關閉(ACK)

其中3和5是不需要進行揮手的迁央,但是注意這里掷匠,2和4是無法合并的。所以這里需要四次揮手岖圈,分別是1讹语,2,4蜂科,6顽决。

TCP的四次揮手步驟

TCP的四次揮手.jpg
  • 開始客戶端向服務端發(fā)送FIN=1要斷開鏈接,并且發(fā)送了一個seq序號=u导匣,這個時候客戶端變成FIN-WAIT1擎值。
  • 服務端接收到消息之后,返回一個ACK=1確定消息逐抑,還有ack確認序號鸠儿,是上一個seq序號+1,即u+1,還有一個新的seq序號為v进每,此時服務端的狀態(tài)變成CLOSE-WAIT汹粤,客戶端收到消息之后,狀態(tài)會變成FIN-WAIT2田晚。
  • 等服務端準備好所有的東西可以關閉鏈接的時候嘱兼,向客戶端發(fā)送ACK=1,還要發(fā)送ack確認序號贤徒,上一個seq序號+1芹壕,即u+1,還有一個新的seq序號為w接奈,還要發(fā)送一個FIN=1踢涌。如果有之前沒有發(fā)送完的數(shù)據(jù),會跟著這次請求一并發(fā)送給客戶端序宦。此時服務端的狀態(tài)變成LASE-ACK睁壁。
  • 客戶端收到消息之后,把自己這里的東西都完成向服務端發(fā)送ACK=1確認消息互捌,還發(fā)送了ack確認序號潘明,上一個seq序號+1,即w+1秕噪,還有一個新的seq序號為u+1钳降,然后客戶端的狀態(tài)就變成了TIME-WAIT,這種狀態(tài)會持續(xù)2WSL腌巾,如果等待的這段時間不再收到后端的消息牲阁,2WSL之后會變成CLOSED。服務端接收到消息之后壤躲,狀態(tài)也變成CLOSED

簡要總結就是:

  1. 客戶端 -> FIN -> 服務端
  2. 客戶端 <- ACK <- 服務端
  3. 客戶端 <- FIN <- 服務端
  4. 客戶端 -> ACK -> 服務端

思考:為什么斷開鏈接的時候要多一個步驟2呢备燃?

因為斷開鏈接服務端接收到FIN時碉克,斷開連接要處理的問題比較多,不能直接關閉鏈接并齐,這個時候如果不發(fā)送ACK回應說是內(nèi)容收到了漏麦,客戶端是無法判斷這個消息服務端收到?jīng)]有,不能讓客戶端在這種情況下等太久况褪,所以應該先回復一個ACK報文說是收到了撕贞,你等會我這里還有事情要處理。等到服務端的事情都處理完畢了测垛,再發(fā)送一個FIN捏膨,確定可以斷開鏈接了。

思考:為什么最后客戶端確認斷開鏈接之后還要等待2WSL呢?

  • 第一用于保證客戶端發(fā)送的最后一個ACK報文可以到達服務器号涯,如果這個ACK報文丟失目胡,服務器會覺得客戶端沒有收到我發(fā)的請求斷開報文,于是服務器就會重發(fā)一次链快,如果客戶端在這個2MSL時間段內(nèi)收到重傳的報文誉己,就會重新給出回應報文,還會重啟2MSL計時器域蜗。
  • 第二是在這個2WSL時間中巨双,可以使本鏈接持續(xù)時間內(nèi)產(chǎn)生的所有報文段從網(wǎng)絡中消失,這樣新的TCP三次握手的時候就不會出現(xiàn)舊鏈接中失效的請求報文霉祸。

面試題:TCP為什么是3次握手筑累,4次揮手?

TCP在傳輸層脉执,對應主機到主機的傳輸疼阔,為應用通信提供能力,且TCP是一個雙工協(xié)議半夷,為了保證雙方都建立穩(wěn)定而高效的數(shù)據(jù)傳輸婆廊,使用三次握手和四次揮手的工作機制。

三次握手的步驟是:

  1. 客戶端向服務端發(fā)送SYN建立鏈接的請求 (大哥巫橄,能建立鏈接嗎淘邻?)
  2. 服務端要將ACK+SYN打包為一條消息回復 (老妹兒,我收到你的消息了湘换,可以進行鏈接宾舅,你收到了嗎?)
  3. 客戶端接收到消息之后給服務端發(fā)送ACK作為回復 (好嘞彩倚,走起~)筹我,這個時候數(shù)據(jù)傳輸通道建立。

為什么不是兩次帆离,是因為客戶端不返回ACK蔬蕊,那么服務端不知道客戶端有沒有接收到消息,如果是四次哥谷,根據(jù)ACK再返回一次ACK岸夯,浪費帶寬且沒有必要。

四次揮手的步驟是:

  1. 客戶端向服務端發(fā)送FIN斷開鏈接的請求 (大哥们妥,我這邊東西都發(fā)完了猜扮,斷開鏈接吧~)
  2. 服務端接收到信息,給客戶端發(fā)送一個ACK進行回復 (老妹兒监婶?要斷開鏈接旅赢?我知道了,你稍等會兒啊)
  3. 服務端處理完需要處理的事情,返回FIN給客戶端 (我這邊完事兒了鲜漩,斷開鏈接吧~)
  4. 客戶端收到消息源譬,處理完自己的事情,返回ACK給服務端 (好嘞孕似,掰掰~)踩娘,這個時候數(shù)據(jù)傳輸通道斷開。

為什么這里是四次喉祭,是因為斷開鏈接服務端收到FIN的時候养渴,還有一些事情要處理,需要一些時間泛烙,這個時候不能讓客戶端等太久理卑,所以先回復一個ACK表示消息已經(jīng)收到了,這邊有東西要處理稍微等一下蔽氨。等到事情處理完藐唠,再給客戶端發(fā)送FIN同意斷開鏈接。

其實這個很好理解鹉究,在生活中宇立,我們收到對方發(fā)送的一個文件或者一個視頻,這個時候他們需要我們根據(jù)內(nèi)容進行回復或者點評自赔。我們應該先說一句內(nèi)容收到了妈嘹,我看看給你回復,這樣不會讓對方有疑問半天沒有回復是沒有收到還是收到了正在看绍妨。等我們看完之后再告訴對方他們要的結果润脸。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市他去,隨后出現(xiàn)的幾起案子毙驯,更是在濱河造成了極大的恐慌,老刑警劉巖灾测,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爆价,死亡現(xiàn)場離奇詭異,居然都是意外死亡行施,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門魂那,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛾号,“玉大人,你說我怎么就攤上這事涯雅∠式幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長精刷。 經(jīng)常有香客問我拗胜,道長,這世上最難降的妖魔是什么怒允? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任埂软,我火速辦了婚禮,結果婚禮上纫事,老公的妹妹穿的比我還像新娘勘畔。我一直安慰自己,他們只是感情好丽惶,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布炫七。 她就那樣靜靜地躺著,像睡著了一般钾唬。 火紅的嫁衣襯著肌膚如雪万哪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天抡秆,我揣著相機與錄音奕巍,去河邊找鬼。 笑死琅轧,一個胖子當著我的面吹牛伍绳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乍桂,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼冲杀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了睹酌?” 一聲冷哼從身側響起权谁,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憋沿,沒想到半個月后旺芽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡辐啄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年采章,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壶辜。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡悯舟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砸民,到底是詐尸還是另有隱情抵怎,我是刑警寧澤奋救,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站反惕,受9級特大地震影響尝艘,放射性物質發(fā)生泄漏。R本人自食惡果不足惜姿染,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一背亥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盔粹,春花似錦隘梨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至进萄,卻和暖如春捻脖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背中鼠。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工可婶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人援雇。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓矛渴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親惫搏。 傳聞我的和親對象是個殘疾皇子具温,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容