重學TCP協議(6) 四次揮手

1. 四次揮手

image.png

  1. 客戶端進程發出連接釋放報文,并且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等于前面已經傳送過來的數據的最后一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

  2. 服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,并且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處于半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。

  3. 客戶端收到服務器的確認請求后,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最后的數據)

  4. 服務器將最后的數據發送完畢后,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由于在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號為seq=w,此時,服務器就進入了LAST-ACK(最后確認)狀態,等待客戶端的確認。

  5. 客戶端收到服務器的連接釋放報文后,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2?MSL(最長報文段壽命)的時間后,當客戶端撤銷相應的TCB后,才進入CLOSED狀態。

  6. 服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB后,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

1.1 為什么FIN報文段即使不攜帶數據,也要消耗一個序號

例如 FIN 包不消耗一個序列號。客戶端發送了 100 字節的數據包和 FIN 包,都等待服務端確認。如果這個時候客戶端收到了ACK=1000 的確認包,就無法得知到底是 100 字節的確認包還是 FIN 包的確認包。

1.2 為什么要4次揮手

當Server端收到FIN報文時,很可能并不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

如果服務端確定沒有什么數據需要發給客戶端,那么當然是可以把 FIN 和 ACK 合并成一個包,四次揮手的過程就成了三次。

1.3 同時關閉

image.png

  1. 當應用層發出關閉命令時,兩端均從 E S TA B L I S H E D變為F I N _ WA I T _ 1。
  2. 這將導致雙方各發送一個 F I N,兩個F I N經過網絡傳送后分別到達另一端。
  3. 收到 F I N后,狀態由F I N _ WA I T _ 1變遷到C L O S I N G,并發送最后的 A C K。當收到最后的 A C K時,狀態變化為T I M E _ WA I T。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391174.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql數據庫部分操作指令

用cmd開啟服務時拒絕訪問. 原因:不是管理員用戶,沒有權限 將服務中的 MySQL設置為手動啟動, 否則 開機自動啟動. 啟動mysql服務,用管理員權限打開dos界面 windowsX A 打開開始界面 點擊管理員開啟cmd 啟動服務:net start …

推箱子2-向右推!_保持冷靜并砍箱子-嗶

推箱子2-向右推!Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards a C…

UML建模圖實戰筆記

一、前言 UML:Unified Modeling Language(統一建模語言),使用UML進行建模的作用有哪些: 可以更好的理解問題可以及早的發現錯誤或者被遺漏的點可以更加方便的進行組員之間的溝通支持面向對象軟件開發建模,可…

數據草擬:使您的團隊熱愛數據的研討會

Learn the rules to Data Draw Up; a fun way to get your teams invested in data.了解數據收集的規則; 一種讓您的團隊投入數據的有趣方式。 Let’s keep things short. Metrics are one of the most important things in Product Management. They help us to u…

python:列表推導式

python中有種獨特的語法:推導式,可以將代碼壓縮到1行,但是不使用也不影響。 有三種:列表、字典、集合(注意沒有元組推導式) 列表推導式 # 1、一行代碼實現1—100之和(知識點:列表推導式) print(…

WPF中刪除打開過的圖片

WPF中刪除打開過的圖片 原文:WPF中刪除打開過的圖片在WPF中,當我們刪除打開過的圖片時,往往會遇到"...無法刪除,文件正在被另一個進程使用"的異常。即使當前文件是打開后關閉過的也不行。 這個問題的原因很簡單,是因為W…

深入理解InnoDB(5)-文件系統

1. 數據庫和文件系統的關系 像 InnoDB 、 MyISAM 這樣的存儲引擎都是把表存儲在文件系統上的。當我們想讀取數據的時候,這些存儲引擎會從文件系統中把數據讀出來返回給我們,當我們想寫入數據的時候,這些存儲引擎會把這些數據又寫回文件系統。…

vim捐贈_#PayItBackwards-一位freeCodeCamp畢業生如何向事業捐贈10,000美元

vim捐贈On Monday my phone suddenly started buzzing. Shawn Wang, AKA Swyx, had just tweeted about a donation hed made to freeCodeCamp.org.星期一,我的電話突然開始嗡嗡作響。 Awn Swyx的Shawn Wang剛剛在推特上發布了他對freeCodeCamp.org的捐款。 I glan…

Digital River拉來Netconcepts站臺 亞太營銷服務升級

它是大洋彼岸的一家網絡軟件下載、分銷商,很多重量級的軟件行業領軍企業都是其客戶,它一直低調摸索亞太營銷的路子,在今年九月份,它一改常態,高調宣布入華,三個月后,它帶來了最新消息&#xff1…

按下按鈕_按下

按下按鈕Updated with the latest data: 23/8/2020更新最新數據:23/8/2020 As restrictions are lifted for Laois and Offaly, difficult times are set to continue for the people of Kildare, at least for another couple of weeks, as they continue to fight…

windows中怎么添加定時任務

linux中有crontab定時任務,很方便 其實windows也有類似的 需求:定時執行python腳本 1、Windows鍵R,調出此窗口,輸入compmgmt.msc 2、 轉載于:https://www.cnblogs.com/gcgc/p/11594467.html

css設置黑體宋體等(轉)

代碼如下: .selector{ font-family:"Microsoft YaHei",微軟雅黑,"MicrosoftJhengHei",華文細黑,STHeiti,MingLiu } 說明: 加上中文名“微軟雅黑”是為了兼容opera。 MicrosoftJhengHei為微軟正黑體,STHeiti為華文黑體,Mi…

重學TCP協議(7) Timestamps 選項

1.Timestamps 選項的組成部分 時間戳選項占10個字節 kind(1字節) + length(1字節) info (8字節),其中kind8,length10,info由timestamp(TS value)和timestamp echo(TS Echo Reply)兩…

sudoku代碼_首席執行官可以編碼嗎? 在星期六晚上坐在酒吧時,從頭開始觀看Netlify首席執行官的Sudoku應用程序代碼

sudoku代碼Netlify CEO Matt Biilmann live-codes a Sudoku app using Netlify in this tutorial video. Matt shows how simple and quick it can be to create a working app using the JAMstack.在本教程視頻中,Netlify CEO Matt Biilmann使用Netlify對Sudoku應用…

c++ 時間序列工具包_我的時間序列工具包

c 時間序列工具包When it comes to time series forecasting, I’m a great believer that the simpler the model, the better.關于時間序列預測,我堅信模型越簡單越好。 However, not all time series are created equal. Some time series have a strongly defi…

bash 的相關配置

bash 參數自動補全 請安裝 bash-completion bash 提示符 說明:參考文檔 1. 簡潔風格 if [[ ${EUID} 0 ]] ; then PS1\[\033[01;32m\][\[\033[01;35m\]\u\[\033[01;37m\] \w\[\033[01;32m\]]\$\[\033[00m\] else PS1\[\033[01;32m\][\u\[\033[01;37m\] \w\[\033[01;…

LINUX系統安裝和管理

目錄 一.應用程序 對比應用程序與系統命令的關系 典型應用程序的目錄結構 常見的軟件包裝類型 二.RPM軟件包管理 1.RPM是什么? 2.RPM命令的格式 查看已安裝的軟件包格式 查看未安裝的軟件包 3.RPM安裝包從哪里來? 4.掛載的定義 掛載命令moun…

sql基礎教程亞馬遜_針對Amazon,Apple,Google的常見SQL面試問題

sql基礎教程亞馬遜SQL is used in a wide variety of programming jobs. Its important to be familiar with SQL if you are going to be interviewing soon for a software position. This is especially true if you are going to interview at a top tech company such as …

leetcode 1720. 解碼異或后的數組(位運算)

未知 整數數組 arr 由 n 個非負整數組成。 經編碼后變為長度為 n - 1 的另一個整數數組 encoded ,其中 encoded[i] arr[i] XOR arr[i 1] 。例如,arr [1,0,2,1] 經編碼后得到 encoded [1,2,3] 。 給你編碼后的數組 encoded 和原數組 arr 的第一個元…

adobe 書簽怎么設置_讓我們設置一些規則…沒有Adobe Analytics處理規則

adobe 書簽怎么設置Originally published at Analyst Admin.最初發布于Analyst Admin 。 In my experience working with Adobe Analytics, I’ve found that Processing Rules help in some cases, but oftentimes they create more work. I try to avoid using Processing R…