詳解四次斷開
簡述四次斷開(揮手)的過程
當客戶端與伺服器端進行資料傳輸完畢後,客戶端主動請求關閉,伺服器端被動關閉
第一次揮手:客戶端向伺服器端傳送FIN包(seq=1,FIN=1),並進入FIN-WAIT1狀態
第二次揮手:伺服器端收到客戶端傳送的的包,會回覆ACK確認包,表示收到,並進入CLOSE_WAIT 狀態,客戶端收到伺服器的ACK包會進入FIN_WAIT2狀態
第三次揮手: 伺服器端向客戶端傳送FIN+ACK包給客戶端,表示資料已經傳輸完畢,可以關閉了,並進入LAST_ACK,最後確認狀態。
第四次揮手:客戶端收到伺服器端傳送的包,回覆ACK確認包,表示收到,然後進入TIME_WAIT狀態,等待2MSL後進入CLOSE狀態,伺服器收到ACK確認包進入CLOSE狀態。
四次揮手完畢
為什麼是四次揮手?而不是三次?
三次握手是因為伺服器端在收到客戶端的syn請求包後,將ACK確認包和自己的SYN請求包合在一起傳送給客戶端了,而在結束時,客戶端向伺服器端傳送FIN包,僅僅表示自己沒有要傳輸的資料了,但這並不表示伺服器端沒有資料要傳輸給客戶端了,所以伺服器端在收到客戶端傳送的資料包後,會先傳送一個ACK確認包給客戶端,表示自己收到了,然後把自己的資料傳輸完畢,才會再次向伺服器端傳送FIN+ACK確認包,所以這就導致多出了一次。
為什麼要等待2MSL?
另一種問法:TIME_WAIT狀態是什麼意思?有什麼作用?
MSL(Maximum Segment Lifetime 最長的報文段壽命 或最長生命週期),TCP允許不同的實現可以設定不同的MSL值。
ACK 包到達伺服器需要 MSL 時間,伺服器重傳 FIN 包也需要 MSL 時間,2MSL 是資料包往返的最大時間,如果 2MSL 後還未收到伺服器重傳的 FIN 包,就說明伺服器已經收到了 ACK 包。
第一,保證客戶端傳送的最後一個ACK報文能夠到達伺服器,因為這個ACK報文可能丟失,站在伺服器的角度看來,
我已經傳送了FIN+ACK報文請求斷開了,客戶端還沒有給我回應,應該是我傳送的請求斷開報文它沒有收到,
於是伺服器又會重新傳送一次,而客戶端就能在這個2MSL時間段內收到這個重傳的報文,接著給出回應報文,並且會重啟2MSL計時器。
第二,防止類似與“三次握手”中提到了的“已經失效的連線請求報文段”出現在本連線中。客戶端傳送完最後一個確認報文後,
在這個2MSL時間中,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣新的連線中不會出現舊連線的請求報文。
相關文章
- TCP/IP 四次斷開TCP
- Wireshark捕獲理解TCP三次握手四次斷開TCP
- 詳解TCP一:三次握手、四次揮手TCP
- TCP三次握手、四次揮手概念圖詳解TCP
- TCP的三次握手與四次揮手詳解TCP
- 介面測試--apipost介面斷言詳解API
- MySQL條件判斷IF,CASE,IFNULL語句詳解MySqlNull
- 如何判斷外鏈質量:基本方法詳解
- 解密TCP連線斷開:四次揮手的奧秘和資料傳輸的安全解密TCP
- TCP的三次握手,四次揮手及常見面試題詳解TCP面試題
- (圖文並茂,權威最詳細)Wireshark抓包分析 TCP三次握手/四次揮手詳解TCP
- 一文詳解Python字串條件判斷方法Python字串
- JavaScript 資料型別與型別判斷詳解JavaScript資料型別
- 詳解物件的建立,佈局,定位,物件存活判斷物件
- SpringMVC【開發Controller】詳解SpringMVCController
- Linux開機流程詳解Linux
- Spring Cloud:使用Hystrix實現斷路器原理詳解(下)SpringCloud
- 詳解JAVA執行緒問題診斷工具Thread DumpJava執行緒thread
- 『言善信』Fiddler工具 — 13、Fiddler斷點功能的使用詳解斷點
- 『動善時』JMeter基礎 — 29、JMeter響應斷言詳解JMeter
- 『動善時』JMeter基礎 — 30、JMeter中JSON斷言詳解JMeterJSON
- 『動善時』JMeter基礎 — 31、JMeter中BeanShell斷言詳解JMeterBean
- iOS開發之 Autolayout 詳解iOS
- Android開發 - Movie 類詳解Android
- Android開發 - RecyclerView 類詳解AndroidView
- Java中陣列判斷元素存在幾種方式比較詳解Java陣列
- 常見開源協議詳解協議
- Jmeter(二十一) - 從入門到精通 - JMeter斷言 - 上篇(詳解教程)JMeter
- Jmeter(二十二) - 從入門到精通 - JMeter斷言 - 下篇(詳解教程)JMeter
- 正規表示式之零寬斷言例項詳解【基於PHP】PHP
- Flutter完整開發實戰詳解(十六、詳解自定義佈局實戰)Flutter
- 熔斷和降級的初步詳解實現(NET Core控制檯輸出講解Polly)
- 自動化測試中如何判斷測試是否透過?詳解 Pytest 測試框架的斷言用法框架
- 終端斷開,任務不斷
- 【IOS開發初學者】UINavigationController詳解iOSUINavigationController
- iOS 靜態庫詳解與開發iOS
- 文章點選展開和收起詳解
- 瀏覽器開發者工具詳解瀏覽器