TCP連接的狀態分析

来源:http://www.cnblogs.com/keos/archive/2016/03/21/5303822.html
-Advertisement-
Play Games

1.先來瞭解一下TCP連接建立與關閉過程中的各種狀態: CLOSED:初始狀態,表示沒有任何連接。LISTEN:Server端的某個Socket正在監聽來自遠方的TCP埠的連接請求。SYN_SENT:發送連接請求後等待確認信息。當客戶端Socket進行Connect連接時,會首先發送SYN包,隨即



1.先來瞭解一下TCP連接建立與關閉過程中的各種狀態:

CLOSED:初始狀態,表示沒有任何連接。
LISTEN:Server端的某個Socket正在監聽來自遠方的TCP埠的連接請求。
SYN_SENT:發送連接請求後等待確認信息。當客戶端Socket進行Connect連接時,會首先發送SYN包,隨即進入SYN_SENT狀態,然後等待Server端發送三次握手中的第2個包。
SYN_RECEIVED:收到一個連接請求後回送確認信息和對等的連接請求,然後等待確認信息。通常是建立TCP連接的三次握手過程中的一個中間狀態,表示Server端的Socket接收到來自Client的SYN包,並作出回應。
ESTABLISHED:表示連接已經建立,可以進行數據傳輸。
FIN_WAIT_1:主動關閉連接的一方等待對方返回ACK包。若Socket在ESTABLISHED狀態下主動關閉連接並向對方發送FIN包(表示己方不再有數據需要發送),則進入FIN_WAIT_1狀態,等待對方返回ACK包,此後還能讀取數據,但不能發送數據。在正常情況下,無論對方處於何種狀態,都應該馬上返回ACK包,所以FIN_WAIT_1狀態一般很難見到。
FIN_WAIT_2:主動關閉連接的一方收到對方返回的ACK包後,等待對方發送FIN包。處於FIN_WAIT_1狀態下的Socket收到了對方返回的ACK包後,便進入FIN_WAIT_2狀態。由於FIN_WAIT_2狀態下的Socket需要等待對方發送的FIN包,所有常常可以看到。若在FIN_WAIT_1狀態下收到對方發送的同時帶有FIN和ACK的包時,則直接進入TIME_WAIT狀態,無須經過FIN_WAIT_2狀態。
TIME_WAIT:主動關閉連接的一方收到對方發送的FIN包後返回ACK包(表示對方也不再有數據需要發送,此後不能再讀取或發送數據),然後等待足夠長的時間(2MSL)以確保對方接收到ACK包(考慮到丟失ACK包的可能和迷路重覆數據包的影響),最後回到CLOSED狀態,釋放網路資源。
CLOSE_WAIT:表示被動關閉連接的一方在等待關閉連接。當收到對方發送的FIN包後(表示對方不再有數據需要發送),相應的返回ACK包,然後進入CLOSE_WAIT狀態。在該狀態下,若己方還有數據未發送,則可以繼續向對方進行發送,但不能再讀取數據,直到數據發送完畢。
LAST_ACK:被動關閉連接的一方在CLOSE_WAIT狀態下完成數據的發送後便可向對方發送FIN包(表示己方不再有數據需要發送),然後等待對方返回ACK包。收到ACK包後便回到CLOSED狀態,釋放網路資源。
CLOSING:比較罕見的例外狀態。正常情況下,發送FIN包後應該先收到(或同時收到)對方的ACK包,再收到對方的FIN包,而CLOSING狀態表示發送FIN包後並沒有收到對方的ACK包,卻已收到了對方的FIN包。有兩種情況可能導致這種狀態:其一,如果雙方幾乎在同時關閉連接,那麼就可能出現雙方同時發送FIN包的情況;其二,如果ACK包丟失而對方的FIN包很快發出,也會出現FIN先於ACK到達。

 

2.TCP連接的關閉流程:
建立TCP連接需要三次握手,而關閉連接則需要四次握手,並且分為主動關閉和被動關閉。這是由於TCP連接是全雙工的,我關了你的連接,並不等於你關了我的連接,因此雙方都必須單獨進行關閉。當一方完成它的數據發送任務後可以發送FIN包來終止這個方向的連接,表明自己不再有數據需要發送;收到FIN包的那一方雖然不能再讀取數據,但仍能發送數據。以Client主動關閉連接為例:
Client向Server發送FIN包,表示Client主動關閉連接,然後進入FIN_WAIT_1狀態,等待Server返回ACK包。此後Client不能再向Server發送數據,但能讀取數據。
Server收到FIN包後向Client發送ACK包,然後進入CLOSE_WAIT狀態,此後Server不能再讀取數據,但可以繼續向Client發送數據。Client收到Server返回的ACK包後進入FIN_WAIT_2狀態,等待Server發送FIN包。
Server完成數據的發送後,將FIN包發送給Client,然後進入LAST_ACK狀態,等待Client返回ACK包,此後Server既不能讀取數據,也不能發送數據。
Client收到FIN包後向Server發送ACK包,然後進入TIME_WAIT狀態,接著等待足夠長的時間(2MSL)以確保Server接收到ACK包,最後回到CLOSED狀態,釋放網路資源。Server收到Client返回的ACK包後便回到CLOSED狀態,釋放網路資源。
  TCP連接的建立到關閉,需要經歷以下狀態遷移(假定Client發起連接,並主動關閉連接):
Client
  CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
Server
  CLODES -> LISTEN -> SYN_RECEIVED -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED


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

-Advertisement-
Play Games
更多相關文章
  • 測試環境:Window Server 2008 CMD返回錯誤: 亂碼 解決方法: 該問題一般是由於系統環境變數沒有配置好引起的. 檢查以下兩個環境變數配置: 重新執行 安裝命令: rabbitmq-service.bat remove rabbitmq-service.bat install ra
  • 基礎篇:(學習能力取決於你的基礎扎不扎實) 第一步 掌握一門.NET面向對象語言,C#或VB.NET 我強烈反對在沒系統學過一門面向對象(OO)語言的前提下去學ASP.NET。 ASP.NET是一個全面向對象的技術,不懂OO,那絕對學不下去! 第二步 對.NET Framework類庫有一定的瞭解
  • JSON(全稱為JavaScript Object Notation) 是一種輕量級的數據交換格式。它是基於JavaScript語法標準的一個子集。 JSON採用完全獨立於語言的文本格式,可以很容易在各種網路、平臺和程式之間傳輸。JSON的語法很簡單,易於人閱讀和編寫,同時也易於機器解析和生成。 J
  • 當頁面進行回發時,如點擊按鈕,以上事件都會重新執行一次,這時的執行順序為: 1. OnPreInit2. OnInit3. OnInitComplete4. OnPreLoad5. Page_Load6. OnLoad7. Button_Click8. OnLoadComplete9. OnPreR
  • 在js語法中,var關鍵字使用與否,都能聲明變數。但是創建一個對象並同時賦值給變數時,在IE9中,var不能省;但是Chrome中正常。 <html> <head> <script type="text/javascript"> function startTime() { var today=ne
  • 博客園,我又回來啦!以下是我的畢業設計整個過程,我會不間斷的發到這裡,也算是養成一個好習慣吧,下麵是我的開題報告: 畢業設計開題報告 題 目 基於物聯網平臺的校園環境監測系統 學生姓名 韓雪東 學號 20122761 班級 信1201-1班 專業 電腦科學與技術 承擔指導任務單位 信息學院 導師姓
  • 很早之前就開始關註.net跨平臺,最近正好測試了下用EF6連接mysql,於是就想直接把網站扔進Linux。查了很多資料,鼓搗了兩個晚上,終於成功。 這裡我使用的是budgetvm的1G openvz vps,centos7 64位。原本按照普遍的做法編譯mono,各種失敗,之後在官網上看到了官方推
  • 1.php作為一種弱類型語言,不需要顯式的指明變數的類型,但是php變數也是有類型的,php變數包含以下8種變數(三大類) a.標量類型:boolean,integer,float(double),string b.複合類型:array,object c.特殊類型:resource,null 2.p
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...