日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

彻底搞懂---三握四挥

發布時間:2025/3/20 编程问答 9 豆豆
生活随笔 收集整理的這篇文章主要介紹了 彻底搞懂---三握四挥 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 三握手
  • 四揮手

三握手

正所謂,工欲善其事,必先利其器。
我們要想搞懂三次握手必須得先知道一些基礎的東西。

我們先分析一下上圖的英文都是啥東西。 SYN: 代表連接請求/連接接受 ACK: 確認 ack: 確認號 seq:序號客戶機下面有三個框里面分別是: CLOSED SYN-SENT ESTAB-LISHED 這代表主機的三個狀態。 服務器下面有四個框分別是: CLOSED LISTEN SYN-RCVD ESTAB-LISHED 這代表服務器的四個狀態。 CLOSED: 表示初始狀態 CLOSED大家應該都知道是關閉的意思。 其實這里的CLOSED是關閉上次握手的東西。所以說CLOSED也就是初始化的意思。LISTEN: 監聽狀態。表示服務器端的某個SOCKET處于監聽狀態。 所以說客戶機是沒有監聽狀態的,因為客戶機是主動的一方。SYN-SENT(客戶機): 客戶端調用連接,發送一個SYN請求建立一個連接,在發送連接請求后等待匹配的連接請求,此時狀態為SYN_SENT。 簡言之: 就是我(客戶機)給你(服務器)發個消息說咱倆連接吧! 等待你確認和我連接的狀態。SYN-RCVD(服務器): 在收到客戶機發來的連接請求和自己發送一個可以連接,等待對方對連接請求的確認的狀態。 簡言之:(服務器)同意和你(客戶機)連接,我(服務器)等你(客戶機)確認和我(服務器)說話的過程。ESTAB-LISHED: 連接已經建立,兩臺機器正在傳輸數據的狀態。

基礎的東西都知道了,那么我們再來分析三次握手的過程。

第一次握手: 客戶機發送SYN=1, seq=x(隨機的序號) 這時客戶機進入SYN-SENT狀態。 簡言之:(客戶機)發送一個連接請求,并說我這個報文的序號是x。第二次握手: 服務器在收到客戶機發來的SYN(連接請求)后,進入了SYN-RCVD狀態。 服務器并發送:SYN=1(接受連接),ACK=1(確認),ack=x+1(客戶機下次需要發送的報文序號) 和seq=y(服務器發送報文序號) 簡言之:(服務器)答應連你,確認收到你的消息了。 下次你(客戶機)給我發上次發送的報文(x)的后一個(即x+1.因為這個我有了 我要下一個)。我發送報文序號是y。第三次握手: 客戶機發送ACK=1,seq=x+1,ack=y+1 這時候客戶機和服務器就開始進入傳輸數據(ESTAB-LISHED)的狀態。 簡言之: 我知道你接受我的連接請求了,這次我發送的報文序號是(x+1),你下次給我發送y+1這個序號的報文。最后將我們理解的術語和專業術語的TCP三次握手的過程來個對比。

看到上圖的對比,是不是發現 TCP三次握手的過程徹底明白了。

那為啥要三次握手呢?第一次握手: 服務器知道了: 客戶端的發送是正常的 自己的接收也是正常的。第二次握手: 客戶端知道了 : 服務器的發送是正常的,接收也是正常的。自己的發送是正常的,接收也是正常的。第三次握手: 服務端知道了: 自己的發送是正常的,客戶端的接收也是正常的。三次握手后: 客戶端知道了: 自己的發送接收都正常,也知道了服務器的接受和發送是正常的。服務器知道了: 自己的發送接收都正常,也知道了客戶端的接受和發送是正常的。 所以需要三次握手。

四揮手

同樣的在了解四次揮手前我們也得弄懂一些東西。

我們先分析一下上圖的英文都是啥東西。

客戶機下面有五個框里面分別是: ESTAB-LISHED FIN-WAIT-1 FIN-WAIT-2 TIME-WAIT CLOSED 這代表主機的五個狀態。 服務器下面有四個框分別是: ESTAB-LISHED CLOSE-WAIT LAST-ACK CLOSED 這代表服務器的四個狀態。 ESTAB-LISHED 在三握里已經知道了是 連接建立。 CLOSED 是關閉連接。FIN-WAIT-1(客戶機): FIN_WAIT_1狀態是當客戶機在ESTABLISHED狀態時,它想主動關閉連接,向對方發送了FIN報文,此時該客戶機即 進入到FIN_WAIT_1狀態.這時雙方的連接都還沒有斷。FIN-WAIT-2(客戶機): 當對方(服務器)回應ACK報文后(即對方確認可以斷開后),則進入到FIN_WAIT_2狀態。這時候是半連接狀態。即客戶機要求關閉連接,客戶機不發送數據了但服務器暫時還有點數據需要傳送給客戶機,稍后再關閉連接。TIME_WAIT(客戶機): 表示收到了服務器的FIN報文,并發送出了ACK報文,就等2MSL后即可回到CLOSED可用狀態了。如果FIN_WAIT_1狀態下,收到了對方同時帶 FIN標志和ACK標志的報文時,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態。 簡言之: 收到了對方(服務器)的斷開標志(FIN)并確認(ACK)后,這時說明服務器確認斷開連接且沒有數據要傳了,客戶機可以直接從FIN-WAIT-1到TIME-WAIT狀態。 CLOSE-WAIT(服務器): 等待客戶機發來的連接中斷請求 ,服務器收到FIN后,就發出ACK以回應FIN請求,服務器進入CLOSE_WAIT狀態。 LAST_ACK(服務器): 服務器在發送FIN報文后,最后等待客戶機的ACK報文。這個狀態就是LAST_ACK。當收到ACK報文后,服務器進入到CLOSED可用狀態了。

基礎的東西都知道了,那么我們再來分析四次揮手的過程。

第一次揮手: 客戶機發送FIN=1,seq=u 之后進入了FIN-WAIT-1狀態。 簡言之: 客戶機發送了一個斷開連接的標志(FIN=1)。 并說這個報文的序號是u。接著客戶機就進入了等待服務器確認的狀態(FIN_WAIT-1)。第二次揮手: 服務器發送ACK=1,seq=v,ack=u+1 后服務器進入了CLOSE-WAIT狀態。客戶機進入FIN-WAIT-2狀態。 簡言之: 服務器說我確認收到你的斷開請求了(ACK=1),我發送的報文序號是v, 下次你(客戶機)給我(服務器)發送u+1這個序號的報文。 服務器開始處理剩余的一些數據(CLOSE-WAIT)。客戶機等服務器處理完剩余的數據給自己發送確認信號(FIN-WAIT-2)第三次揮手: 服務器發送 FIN=1,ACK=1,seq=w,ack=u+1 隨后服務器進入LAST-ACK狀態。簡言之: 服務器給客戶機發送了一個斷開連接的標志(FIN=1),確認收到你的斷開請求了(ACK=1), 我的發送的報文序號是w,你(客戶機)下次給我(服務器)發送u+1這個序號的報文。 因為在此之前客戶機并沒有再次的給服務器發送報文。所以服務器給客戶機要的報文序號還是u+1。 服務器等待客戶機給自己發送確認收到的報文(LAST-ACK)。第四次揮手: 客戶機發送ACK=1,seq=u+1,ack=w+1,服務器隨后進入TIME-WAIT狀態。服務器收到后進入CLOSED狀態。等2MSL時間后客戶機也進入CLOSED狀態。 簡言之: 客戶機給服務器說我知道你可以斷開了(ACK=1),我(客戶機)發送的報文的序號是u+1,(服務器)下次給我(客戶機)發送的報文序號是w+1。服務器收到客戶機的確認后沒啥可說的,就關閉連接了。 客戶機等了2MSL后服務器沒有動靜了就也關閉連接了。最后將我們理解的術語和專業術語的TCP四次揮手的過程來個對比。


看到上圖的對比,是不是發現 TCP四次揮手的過程徹底明白了。

最后我們來分析一下為啥客戶機要等待2MSL的時間才關閉連接?MSL: 最長報文段的壽命。那2MSL就是報文段一來一回的最長時間。 如果客戶機等待的時間小于2MSL。 當客戶機給服務器發送確認報文,服務器沒有收到時。這時候服務器就會再次的進行三次揮手的過程。 但是當第三次揮手的報文到達客戶機時,客戶機這時候已經關閉連接了。那么此時服務器就無法進入關閉狀態。那客戶機等待時間大于2MSL呢? 大于2MSL的話就浪費時間了。 因為2MSL已經是報文段一來一回的最長時間了,如果服務器沒有收到客戶機的確認。 在2MSL時間內客戶機是一定會再次收到的。所以2MSL是最好的等待時間。

最后,三次握手我借鑒了這個視頻: https://www.bilibili.com/video/BV1vA411i7rs
里面講的很不錯。

總結

以上是生活随笔為你收集整理的彻底搞懂---三握四挥的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。