一、三次握手
三次握手(Three-way Handshake)其實就是指建立一個TCP連接時,需要客戶端和服務器總共發(fā)送3個包
主要作用就是為了確認雙方的接收能力和發(fā)送能力是否正常、指定自己的初始化序列號為后面的可靠性傳送做準備
過程如下:
- 第一次握手:客戶端給服務端發(fā)一個 SYN 報文,并指明客戶端的初始化序列號 ISN(c),此時客戶端處于 SYN_SENT 狀態(tài)
- 第二次握手:服務器收到客戶端的 SYN 報文之后,會以自己的 SYN 報文作為應答,為了確認客戶端的 SYN,將客戶端的 ISN+1作為ACK的值,此時服務器處于 SYN_RCVD 的狀態(tài)
- 第三次握手:客戶端收到 SYN 報文之后,會發(fā)送一個 ACK 報文,值為服務器的ISN+1。此時客戶端處于 ESTABLISHED 狀態(tài)。服務器收到 ACK 報文之后,也處于 ESTABLISHED 狀態(tài),此時,雙方已建立起了連接
上述每一次握手的作用如下:
- 第一次握手:客戶端發(fā)送網(wǎng)絡包,服務端收到了 這樣服務端就能得出結論:客戶端的發(fā)送能力、服務端的接收能力是正常的。
- 第二次握手:服務端發(fā)包,客戶端收到了 這樣客戶端就能得出結論:服務端的接收、發(fā)送能力,客戶端的接收、發(fā)送能力是正常的。不過此時服務器并不能確認客戶端的接收能力是否正常
- 第三次握手:客戶端發(fā)包,服務端收到了。 這樣服務端就能得出結論:客戶端的接收、發(fā)送能力正常,服務器自己的發(fā)送、接收能力也正常
通過三次握手,就能確定雙方的接收和發(fā)送能力是正常的。之后就可以正常通信了
為什么不是兩次握手?
如果是兩次握手,發(fā)送端可以確定自己發(fā)送的信息能對方能收到,也能確定對方發(fā)的包自己能收到,但接收端只能確定對方發(fā)的包自己能收到 無法確定自己發(fā)的包對方能收到
并且兩次握手的話, 客戶端有可能因為網(wǎng)絡阻塞等原因會發(fā)送多個請求報文,延時到達的請求又會與服務器建立連接,浪費掉許多服務器的資源
二、四次揮手
tcp
終止一個連接,需要經(jīng)過四次揮手
過程如下:
- 第一次揮手:客戶端發(fā)送一個 FIN 報文,報文中會指定一個序列號。此時客戶端處于 FIN_WAIT1 狀態(tài),停止發(fā)送數(shù)據(jù),等待服務端的確認
- 第二次揮手:服務端收到 FIN 之后,會發(fā)送 ACK 報文,且把客戶端的序列號值 +1 作為 ACK 報文的序列號值,表明已經(jīng)收到客戶端的報文了,此時服務端處于 CLOSE_WAIT狀態(tài)
- 第三次揮手:如果服務端也想斷開連接了,和客戶端的第一次揮手一樣,發(fā)給 FIN 報文,且指定一個序列號。此時服務端處于?
LAST_ACK
?的狀態(tài) - 第四次揮手:客戶端收到 FIN 之后,一樣發(fā)送一個 ACK 報文作為應答,且把服務端的序列號值 +1 作為自己 ACK 報文的序列號值,此時客戶端處于 TIME_WAIT狀態(tài)。需要過一陣子以確保服務端收到自己的 ACK 報文之后才會進入 CLOSED 狀態(tài),服務端收到 ACK 報文之后,就處于關閉連接了,處于 CLOSED 狀態(tài)
四次揮手原因
服務端在收到客戶端斷開連接Fin
報文后,并不會立即關閉連接,而是先發(fā)送一個ACK
包先告訴客戶端收到關閉連接的請求,只有當服務器的所有報文發(fā)送完畢之后,才發(fā)送FIN
報文斷開連接,因此需要四次揮手
三、總結
一個完整的三次握手四次揮手如下圖所示:
文章來源:http://www.zghlxwxcb.cn/news/detail-844258.html
參考文獻
- https://zhuanlan.zhihu.com/p/53374516
- https://segmentfault.com/a/1190000020610336
如果對您有所幫助,歡迎您點個關注,我會定時更新技術文檔,大家一起討論學習,一起進步。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-844258.html
到了這里,關于說說TCP為什么需要三次握手和四次揮手?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!