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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...