python TCP協議詳解 三次握手四次揮手和11種狀態

来源:https://www.cnblogs.com/hades0607/archive/2018/08/29/9557436.html
-Advertisement-
Play Games

11種狀態解析 LISTEN 等待從任何遠端TCP 和埠的連接請求。 SYN_SENT 發送完一個連接請求後等待一個匹配的連接請求。 SYN_RECEIVED 發送連接請求並且接收到匹配的連接請求以後等待連接請求確認。 ESTABLISHED 表示一個打開的連接,接收到的數據可以被投遞給用戶。連接 ...


11種狀態解析

LISTEN  --------------------  等待從任何遠端TCP 和埠的連接請求。

SYN_SENT  ---------------  發送完一個連接請求後等待一個匹配的連接請求。

SYN_RECEIVED  --------  發送連接請求並且接收到匹配的連接請求以後等待連接請求確認。

ESTABLISHED  -----------  表示一個打開的連接,接收到的數據可以被投遞給用戶。連接的數據傳輸階段的正常狀態。

FIN_WAIT_1  --------------  等待遠端TCP 的連接終止請求,或者等待之前發送的連接終止請求的確認。

FIN_WAIT_2  --------------  等待遠端TCP 的連接終止請求。

CLOSE_WAIT  ------------  等待本地用戶的連接終止請求。

CLOSING  ------------------  等待遠端TCP 的連接終止請求確認。

LAST_ACK  ----------------  等待先前發送給遠端TCP 的連接終止請求的確認(包括它位元組的連接終止請求的確認)

TIME_WAIT  ---------------  等待足夠的時間過去以確保遠端TCP 接收到它的連接終止請求的確認。

CLOSED  -------------------  不在連接狀態(這是為方便描述假想的狀態,實際不存在)

TIME_WAIT 兩個存在的理由:
  1.可靠的實現tcp全雙工連接的終止;
  2.允許老的重覆分節在網路中消逝。

 

TCP協議

可靠傳輸, TCP數據包沒有長度限制, 理論上可以無限長, 但是為了保證網路的效率,

通常TCP數據包的長度不會超過IP數據包的長度, 以確保單個TCP數據包不必再分割

 

UDP協議

不可靠傳輸, ""報頭""部分一共只有8個位元組, 總長度不超過65535位元組, 正好放進一個IP數據包

 

三次握手

置位概念: 根據TCP的包頭欄位, 存在3個重要的表示ACK, SYN, FIN

ACK: 表示驗證欄位

SYN: 位數置1, 表示建立TCP連接

FIN:位數置1,表示斷開TCP連接

 

 三次握手過程說明

 1. 由客戶端發送建立TCP連接的請求報文, 其中報文中包含seq序列號, 是由發送端隨機生成的,

並且將報文中的SYN欄位置為1, 表示需要建立TCP連接 (SYN=1, seq=x, x為隨機生成數值)

 2. 由服務端回覆客戶端發送的TCP連接請求報文, 其中包含seq序列號, 是由回覆端隨機生成的, 並且將SYN置為1,

而且會產生ACK欄位, ACK欄位數值是在客戶端發送過來的序列號seq的基礎上加1進行回覆,以便客戶端收到信息時,

知曉自己的TCP建立請求已得到驗證 (SYN=1, ACK=x+1, seq=y, y為隨機生成數值) 這裡的ACK加1可以理解為是確認和誰建立連接

3. 客戶端收到服務端發送的TCP建立驗證請求後, 會使自己的序列號加1表示, 並且再次回覆ACK驗證請求, 在服務端發過來的seq上加1進行回覆(SYN=1, ACK=y+1, seq=x+1)

 

 

四次揮手 

四次揮手過程說明

 1. 客戶端發送斷開TCP連接請求的報文, 其中報文中包含seq序列號, 是由發送端隨機生成的, 

並且還將報文中的FIN欄位置為1, 表示需要斷開TCP連接 (FIN=1, seq=x, x由客戶端隨機生成)

 

2. 服務端會回覆客戶端發送的TCP斷開請求報文, 其包含seq序列號, 是由回覆端隨機生成的,

而且會產生ACK欄位, ACK欄位數值是在客戶端發過來的seq序列號基礎上加1進行回覆,

以便客戶端收到信息時, 知曉自己的TCP斷開請求已經得到驗證 (FIN=1, ACK=x+1, seq=y, y由服務端隨機生成)

 

3、服務端在回覆完客戶端的TCP斷開請求後,不會馬上進行TCP連接的斷開,

服務端會先確保斷開前,所有傳輸到A的數據是否已經傳輸完畢,一旦確認傳輸數據完畢,

就會將回覆報文的FIN欄位置1,並且產生隨機seq序列號。(FIN=1,ACK=x+1,seq=z,z由服務端隨機生成)

 

4、客戶端收到服務端的TCP斷開請求後,會回覆服務端的斷開請求,包含隨機生成的seq欄位和ACK欄位,

ACK欄位會在服務端的TCP斷開請求的seq基礎上加1,從而完成服務端請求的驗證回覆。(FIN=1,ACK=z+1,seq=h,h為客戶端隨機生成)


至此TCP斷開的4次揮手過程完畢

 

 

11種狀態

1、一開始,建立連接之前伺服器和客戶端的狀態都為CLOSED; 
2、伺服器創建socket後開始監聽,變為LISTEN狀態; 
3、客戶端請求建立連接,向伺服器發送SYN報文,客戶端的狀態變味SYN_SENT; 
4、伺服器收到客戶端的報文後向客戶端發送ACK和SYN報文,此時伺服器的狀態變為SYN_RCVD; 
5、然後,客戶端收到ACK、SYN,就向伺服器發送ACK,客戶端狀態變為ESTABLISHED; 
6、伺服器端收到客戶端的ACK後變為ESTABLISHED。此時3次握手完成,連接建立!

由於TCP連接是全雙工的,斷開連接會比建立連接麻煩一點點。 


1、客戶端先向伺服器發送FIN報文,請求斷開連接,其狀態變為FIN_WAIT1; 
2、伺服器收到FIN後向客戶端發送ACK,伺服器的狀態圍邊CLOSE_WAIT; 
3、客戶端收到ACK後就進入FIN_WAIT2狀態,此時連接已經斷開了一半了。如果伺服器還有數據要發送給客戶端,就會繼續發送; 
4、直到發完數據,就會發送FIN報文,此時伺服器進入LAST_ACK狀態; 
5、客戶端收到伺服器的FIN後,馬上發送ACK給伺服器,此時客戶端進入TIME_WAIT狀態; 
6、再過了2MSL長的時間後進入CLOSED狀態。伺服器收到客戶端的ACK就進入CLOSED狀態。 
至此,還有一個狀態沒有出來:CLOSING狀態。 


CLOSING狀態表示: 
客戶端發送了FIN,但是沒有收到伺服器的ACK,卻收到了伺服器的FIN,這種情況發生在伺服器發送的ACK丟包的時候,因為網路傳輸有時會有意外。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、List介面 2、Set介面 3、判斷集合唯一性原理 ...
  • Struts就是一個MVC框架,下麵Struts1 是如何實現MVC 的。參考圖如下: M主要是ActionForm和JavaBean。負責程式的數據收集和業務處理,ActionForm屬於Struts的框架的,這裡的JavaBean是應用本身的業務邏輯。 V層主要是Jsp。主要用於動態頁面的顯示, ...
  • Java當中的異常 瞭解 當中的異常,那麼什麼是異常呢?異常又有什麼分類呢?異常中的特殊結構: 結構的使用方法。 異常是一種對象,是靠虛擬機產生的,異常中斷了正常指令流(程式靠著一個又一個指令)的事件,異常是運行時出現的。在 中編譯上出現的錯誤為所謂的語法上等的錯誤,而異常是編譯通過的,但在運行時產 ...
  • Spring提供了一個AOP框架,讓我把切麵插入到方法執行的周圍。 1、概念 定義通用功能,通過申明定義這些功能要以何種方式在何處應用,而不需要修改受影響的類。這些通用功能可以模塊化為特殊的類,即切麵。 連接點:連接點是一個應用執行過程中能夠插入一個切麵的點(Spring只支持方法級別的連接點) 切 ...
  • 假設Andy和Doris想在晚餐時選擇一家餐廳,並且他們都有一個表示最喜愛餐廳的列表,每個餐廳的名字用字元串表示。 你需要幫助他們用最少的索引和找出他們共同喜愛的餐廳。 如果答案不止一個,則輸出所有答案並且不考慮順序。 你可以假設總是存在一個答案。 示例 1: 輸入: ["Shogun", "Tap ...
  • 需求:實體是blog 和author 關係是一對一,查詢 blog 以及 blog 的作者信息 嵌套查詢 xml select from blog where bid = {id, jdbcType=INTEGER} ...
  • 引言 還記得大三時上培訓班的是時候,當時的培訓老師說自己是本地講解spring最好的講師,但是後來等我實習了看了《Spring 3.x 企業應用開發實戰》以及後續版本《精通Spring+4.x++企業應用開發實戰》才發現,這位培訓老師就是基本按照《Spring 3.x 企業應用開發實戰》給我們講sp ...
  • #以下是我自己在聯繫列表中所編寫的語句:names=["zangsan",'lisi','wangermazi','Xiaoliuzi','dabiaoge','牛erbiaodi']# 0 1 2 3 4 5 print(names[2])#簡單取值#取lisi和wangermaziprint(n ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...