目錄
- 名詞解釋
- TCP的三次握手
- TCP建立鏈接的步驟
- TCP的三次握手步驟
- 思考:TCP握手為什么不是兩次 or 四次?
- TCP的四次揮手
- TCP斷開鏈接的步驟
- TCP的四次揮手步驟
- 思考:為什么斷開鏈接的時候要多一個步驟2呢处坪?
- 思考:為什么最后客戶端確認斷開鏈接之后還要等待2WSL呢根资?
- 面試題:TCP為什么是3次握手架专,4次揮手?
這是一個計算機網(wǎng)絡中一個很熱門玄帕,很基礎的問題部脚,也是面試常考的一個題裤纹,如果你會那不稀奇委刘,如果你不會,那就會涼涼鹰椒。我這里來對我學的東西做一個整理锡移,看完時候對這里的知識應該會很清晰。首先先來名詞解釋漆际,如果遇到不清晰的名詞淆珊,記得反過頭來看。
名詞解釋
TCP
:TCP
在計算機網(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個步驟:
- 客戶端發(fā)消息給服務端
(SYN)
- 服務端準備好進行連接
- 服務端針對客戶端的
(SYN)
給一個(ACK)
- 服務端發(fā)送一個
(SYN)
給客戶端 - 客戶端準備就緒
- 客戶端給服務端發(fā)送一個
(ACK)
其中鲁僚,2和5步驟是不需要進行握手的,3和4是可以合并到一起的裁厅。所以雖然建立鏈接要6步但是只需要三次握手蕴茴,分別是1,3+4姐直,6。
TCP的三次握手步驟
下面我們把三次握手的過程還原一下:
- 開始客戶端和服務端都處于
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
哨查,鏈接通道建立。
簡要總結就是:
- 客戶端 -> SYN -> 服務端
- 客戶端 <- SYN+ACK <- 服務端
- 客戶端 -> ACK -> 服務端
思考:TCP握手為什么不是兩次 or 四次剧辐?
設想一下寒亥,如果只有兩次邮府,服務端還沒有確定客戶端是否準備好了,這樣是無法穩(wěn)定的進行數(shù)據(jù)傳輸?shù)母绒取H绻拇喂涌斩烁鶕?jù)客戶端的ACK
再給客戶端回復一個ACK
,沒有什么很大的作用還造成資源浪費腐宋,那就是很沒有必要的事情了紊服。三次正好既可以保證可靠傳輸,也可以提高傳輸效率胸竞,
TCP的四次揮手
TCP
的揮手旨在把鏈接狀態(tài)斷開
TCP斷開鏈接的步驟
- 客戶端發(fā)消息要求斷開鏈接
(FIN)
欺嗤。 - 服務端接收到請求后,會先對自己是否收到請求回應
(ACK)
卫枝。 - 服務端處理剩余的事情煎饼,例如服務端還有沒有發(fā)送完的消息,服務端可能還有發(fā)送出去的消息沒有得到
ACK
校赤;也有可能服務端自己有資源要釋放等吆玖。 - 服務端處理完自己的事情,告訴客戶端可以關閉鏈接了
(FIN)
马篮。 - 客戶端收到
FIN
沾乘,處理自己完成的事情,比如客戶端有發(fā)送給服務端沒有收到ACK
的請求等浑测。 - 客戶端處理完成自己的事情翅阵,告訴服務端可以關閉
(ACK)
。
其中3和5是不需要進行揮手的迁央,但是注意這里掷匠,2和4是無法合并的。所以這里需要四次揮手岖圈,分別是1讹语,2,4蜂科,6顽决。
TCP的四次揮手步驟
- 開始客戶端向服務端發(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
。
簡要總結就是:
- 客戶端 -> FIN -> 服務端
- 客戶端 <- ACK <- 服務端
- 客戶端 <- FIN <- 服務端
- 客戶端 -> 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ù)傳輸婆廊,使用三次握手和四次揮手的工作機制。
三次握手的步驟是:
- 客戶端向服務端發(fā)送
SYN
建立鏈接的請求(大哥巫橄,能建立鏈接嗎淘邻?)
- 服務端要將
ACK+SYN
打包為一條消息回復(老妹兒,我收到你的消息了湘换,可以進行鏈接宾舅,你收到了嗎?)
- 客戶端接收到消息之后給服務端發(fā)送
ACK
作為回復(好嘞彩倚,走起~)
筹我,這個時候數(shù)據(jù)傳輸通道建立。
為什么不是兩次帆离,是因為客戶端不返回ACK
蔬蕊,那么服務端不知道客戶端有沒有接收到消息,如果是四次哥谷,根據(jù)ACK
再返回一次ACK
岸夯,浪費帶寬且沒有必要。
四次揮手的步驟是:
- 客戶端向服務端發(fā)送
FIN
斷開鏈接的請求(大哥们妥,我這邊東西都發(fā)完了猜扮,斷開鏈接吧~)
- 服務端接收到信息,給客戶端發(fā)送一個
ACK
進行回復(老妹兒监婶?要斷開鏈接旅赢?我知道了,你稍等會兒啊)
- 服務端處理完需要處理的事情,返回
FIN
給客戶端(我這邊完事兒了鲜漩,斷開鏈接吧~)
- 客戶端收到消息源譬,處理完自己的事情,返回
ACK
給服務端(好嘞孕似,掰掰~)
踩娘,這個時候數(shù)據(jù)傳輸通道斷開。
為什么這里是四次喉祭,是因為斷開鏈接服務端收到FIN
的時候养渴,還有一些事情要處理,需要一些時間泛烙,這個時候不能讓客戶端等太久理卑,所以先回復一個ACK
表示消息已經(jīng)收到了,這邊有東西要處理稍微等一下蔽氨。等到事情處理完藐唠,再給客戶端發(fā)送FIN同意斷開鏈接。
其實這個很好理解鹉究,在生活中宇立,我們收到對方發(fā)送的一個文件或者一個視頻,這個時候他們需要我們根據(jù)內(nèi)容進行回復或者點評自赔。我們應該先說一句內(nèi)容收到了妈嘹,我看看給你回復,這樣不會讓對方有疑問半天沒有回復是沒有收到還是收到了正在看绍妨。等我們看完之后再告訴對方他們要的結果润脸。