四次揮手詳解

文章目錄

  • 一、四次揮手各狀態
    • FIN_WAIT_1
    • CLOSE_WAIT
    • FIN_WAIT_2
    • LAST_ACK
    • TIME_WAIT
    • CLOSE
  • 二、雙方同時調用close(),FIN_WAIT_1狀態后進入CLOSING狀態
    • CLOSING狀態
  • 三、TIME_WAIT狀態詳解
    • (1) TIME_WAIT狀態下的2MSL是什么
      • MSL (報文最大生存時間)
      • 為什么TIME__WAIT狀態必須停留兩倍MSL時間
    • (2) TIME_WAIT存在的意義
    • (3) 為什么會出現大量的TIME_WAIT狀態
    • (4) TIME_WAIT狀態的影響
      • 解決方法
  • 四、HTTP中一般服務端是請求斷開方

在這里插入圖片描述
由于TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務后就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

一、四次揮手各狀態

FIN_WAIT_1

當主動關閉方在ESTABLISHED狀態時發送一個FIN,用來關閉數據傳送,此時即進入到FIN_WAIT_1狀態。

CLOSE_WAIT

處于ESTABILSHED狀態的服務器收到FIN包,將發回一個ACK,確認序號為收到的序號加1。
CLOSE_WAIT: 這種狀態表示在等待關閉。當對方發送FIN報文給自己,系統會回應一個ACK報文給對方,此時則進入到CLOSE_WAIT狀態。如果還有數據發送給對方則可以在數據發送結束后再發送FIN報文來結束連接,所以這個狀態是被斷開方再等待自己數據發送結束后斷開連接

FIN_WAIT_2

處于FIN_WAIT_1狀態時,當接收到對方回應的ACK報文后,則進入到FIN_WAIT_2狀態

LAST_ACK

被動關閉一方在發送FIN報文后,最后等待對方的ACK報文期間處于LAST_ACK狀態

TIME_WAIT

time_wait 是「主動關閉 TCP 連接」一方的狀態,可能是==「客服端」的,也可能是「服務器端」==的;
當TCP的一端發起主動關閉(收到 FIN 請求),即第3次握 手完成后,發送了第四次握手的ACK包后(最后的 ACK 是由「主動關閉連接」的一端發出的),就進入了TIME_WAIT狀態。

CLOSE

當被動方收到ACK報文后,也即可以進入到CLOSED可用狀態了。

二、雙方同時調用close(),FIN_WAIT_1狀態后進入CLOSING狀態

在這里插入圖片描述

CLOSING狀態

CLOSING: 當發送FIN報文后進入fin_wait_1狀態,過后并沒有收到對方的ACK報文,反而也收到了對方的FIN報文。就是雙方幾乎在同時close一個SOCKET,然后就出現了雙方同時發送FIN報文的情況,表示雙方都正在關閉SOCKET連接。
closing狀態收到ack報文以后即直接進入time_wait狀態

三、TIME_WAIT狀態詳解

(1) TIME_WAIT狀態下的2MSL是什么

MSL (報文最大生存時間)

任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。(IP 報文)
RFC 793中規定MSL為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。

為什么TIME__WAIT狀態必須停留兩倍MSL時間

等待2MSL時間主要目的是怕最后一個 ACK包對方沒收到,那么對方在超時后將重發第三次握手的FIN包,主動關閉端接到重發的FIN包后,可以再發一個ACK應答包。

當連接處于2MSL等待階段時,任何遲到的報文段都將被丟棄。

(2) TIME_WAIT存在的意義

可靠的實現 TCP 全雙工連接的終止:
四次揮手關閉 TCP 連接過程中,最后的 ACK 是由「主動關閉連接」的一端發出的,如果這個 ACK 丟失,則,對方會重發 FIN 請求,因此,在「主動關閉連接」的一段,需要維護一個 time_wait 狀態,處理對方重發的 FIN 請求;

假設發起主動關閉方發送的ACK (4次交互的最后一個包)在網絡中丟失,那么由于TCP的重傳機制,被動關閉方需要重發FIN(第三次揮手),在該FIN到達主動發起方之前,client必須維護這條連接的狀態(盡管它已調用過close),具體而言,就是這條TCP連接對應的(源IP,源端口)資源不能被立即釋放或重新分配。直到對端重發的FIN達到,client也重發ACK后,該TCP連接才能恢復初始的CLOSED狀態。如果主動方不進入TIME_WAIT以維護其連接狀態,則當被動方重發的FIN達到時,主動方的TCP傳輸層會以RST包響應對方,這會被對方認為有錯誤發生(而事實上,這是正常的關閉連接過程,并非異常)。

處理延遲到達的報文:
由于路由器可能抖動,TCP 報文會延遲到達,為了避免「延遲到達的 TCP 報文被誤認為是「新 TCP 連接」的數據,則,需要在允許新創建 TCP 連接之前,保持一個不可用的狀態,等待所有延遲報文的消失,一般設置為 2 倍的 MSL(報文的最大生存時間),解決「延遲達到的 TCP 報文」問題。

TCP是流式的,所有包到達的順序是不一致的,依靠序列號由TCP協議棧做順序的拼接;假設如果一個新連接建立后舊連接的seq=1000包到達對端,可能會頂替掉新連接的seq=1000,造成錯誤

(3) 為什么會出現大量的TIME_WAIT狀態

大量的短連接存在
TCP 四次揮手關閉連接機制中,為了保證 ACK 重發和丟棄延遲數據,設置 time_wait 為 2 倍的 MSL(報文最大存活時間)

(4) TIME_WAIT狀態的影響

time_wait 狀態下,TCP 連接占用的端口,無法被再次使用, 要等到2MSL時間結束,才可繼續使用,而TCP 端口數量上限是 6.5w(65535,16 bit)
大量 time_wait 狀態存在,會導致新建 TCP 連接會出錯,address already in use : connect 異常

解決方法

  • 服務器端允許 time_wait 狀態的 socket 被重用
  • 縮減 time_wait 時間,設置為 1 MSL(即,2 mins)

四、HTTP中一般服務端是請求斷開方

在HTTP1.1協議中,有個 Connection 頭,Connection有兩個值,close和keep-alive,這個頭就相當于客戶端告訴服務端,服務端你執行完成請求之后,是關閉連接還是保持連接,保持連接就意味著在保持連接期間,只能由客戶端主動斷開連接。還有一個keep-alive的頭,設置的值就代表了服務端保持連接保持多久。

HTTP默認的Connection值為close,那么就意味著關閉請求的一方幾乎都會是由服務端這邊發起的。那么這個服務端產生TIME_WAIT過多的情況就很正常了

雖然HTTP默認Connection值為close,但是,現在的瀏覽器發送請求的時候一般都會設置Connection為keep-alive了。所以,也有人說,現在沒有必要通過調整參數來使TIME_WAIT降低了。

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

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

相關文章

【嵌入式 Linux 音視頻+ AI 實戰項目】瑞芯微 Rockchip 系列 RK3588-基于深度學習的人臉門禁+ IPC 智能安防監控系統

前言 本文主要介紹我最近開發的一個個人實戰項目,“基于深度學習的人臉門禁 IPC 智能安防監控系統”,全程滿幀流暢運行。這個項目我目前全網搜了一圈,還沒發現有相關類型的開源項目。這個項目只要稍微改進下,就可以變成市面上目前…

java: framework from BLL、DAL、IDAL、MODEL、Factory using oracle

oracel 21c sql: -- 創建 School 表 CREATE TABLE School (SchoolId CHAR(5) NOT NULL,SchoolName NVARCHAR2(500) NOT NULL,SchoolTelNo VARCHAR2(8) NULL,PRIMARY KEY (SchoolId) );CREATE OR REPLACE PROCEDURE addschool(p_school_id IN CHAR,p_school_name IN NVARCHAR2,p…

解決錯誤:CondaHTTPError: HTTP 000 CONNECTION FAILED for url

解決錯誤:CondaHTTPError: HTTP 000 CONNECTION FAILED for url 查看channels:vim ~/.condarcshow_channel_urls: true channels:- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/…

Apache APISIX 快速入門

文章目錄 apisix 快速入門什么是apisix有了 NGINX 和 Kong,為什么還需要 Apache APISIX?軟件架構基于 Nginx 開源版本,而 Nginx 并不支持動態配置,為什么 Apache APISIX 聲稱自己可以實現動態配置? 安裝配置 APISIX配置…

2025嵌入式高頻面試題解析

一、概述 到了年初,是求職者最活躍的時間。本文梳理了嵌入式高頻面試題,幫助求職者更好地準備面試,同時也為技術愛好者提供深入學習嵌入式知識的參考。 二、C 語言基礎 2.1 指針與數組 問題 1:指針和數組的區別是什么&#xf…

1.攻防世界 baby_web

題目描述這里有提示,初始頁面 進入題目頁面如下 很簡潔的頁面只有一行HELLO WORLD ctrlu查看了源碼也沒有信息 用burp suite抓包,并發送到重放器 根據提示(初始頁面)修改訪問index.php文件 index.php index.php 是一種常見的…

什么是三層交換技術?與二層有什么區別?

什么是三層交換技術?讓你的網絡飛起來! 一. 什么是三層交換技術?二. 工作原理三. 優點四. 應用場景五. 總結 前言 點個免費的贊和關注,有錯誤的地方請指出,看個人主頁有驚喜。 作者:神的孩子都在歌唱 大家好…

【機器學習】數據預處理之數據歸一化

數據預處理之數據歸一化 一、摘要二、數據歸一化概念三、數據歸一化實現方法3.1 最值歸一化方法3.2 均值方差歸一化方法 一、摘要 本文主要講述了數據歸一化(Feature Scaling)的重要性及其方法。首先通過腫瘤大小和發現時間的例子,說明了不同…

【AIGC】語言模型的發展歷程:從統計方法到大規模預訓練模型的演化

博客主頁: [小????????] 本文專欄: AIGC | ChatGPT 文章目錄 💯前言💯語言模型的發展歷程:從統計方法到大規模預訓練模型的演化1 統計語言模型(Statistical Language Model, SLM):統…

高效知識管理與分類優化指南:從目錄設計到實踐應用

摘要 本文旨在幫助讀者在信息爆炸時代構建高效的知識管理體系,提供了知識收藏目錄、瀏覽器書簽和電腦文件夾的優化分類方案。知識收藏目錄方案包括工作與項目、記錄與日常、知識管理等八大類,具有邊界清晰、擴展靈活、貼合實際場景等優勢。瀏覽器書簽分類…

OpenAI 實戰進階教程 - 第十二節 : 多模態任務開發(文本、圖像、音頻)

適用讀者與目標 適用讀者:已經熟悉基礎的 OpenAI API 調用方式,對文本生成或數據處理有一定經驗的計算機從業人員。目標:在本節中,你將學會如何使用 OpenAI 提供的多模態接口(圖像生成、語音轉錄等)開發更…

Java面試題2025-JVM

JVM 1.為什么需要JVM,不要JVM可以嗎? 1.JVM可以幫助我們屏蔽底層的操作系統 一次編譯,到處運行 2.JVM可以運行Class文件 2.JDK,JRE以及JVM的關系 3.我們的編譯器到底干了什么事? 僅僅是將我們的 .java 文件轉換成了…

Deepseek的MLA技術原理介紹

DeepSeek的MLA(Multi-head Latent Attention)技術是一種創新的注意力機制,旨在優化Transformer模型的計算效率和內存使用,同時保持模型性能。以下是MLA技術的詳細原理和特點: 1. 核心思想 MLA技術通過低秩聯合壓縮技術,將多個注意力頭的鍵(Key)和值(Value)映射到一…

QML初識

目錄 一、關于QML 二、布局定位和錨點 1.布局定位 2.錨點詳解 三、數據綁定 1.基本概念 2.綁定方法 3.數據模型綁定 四、附加屬性及信號 1.附加屬性 2.信號 一、關于QML QML是Qt框架中的一種聲明式編程語言,用于描述用戶界面的外觀和行為;Qu…

java項目之美妝產品進銷存管理系統的設計與開發源碼(ssm+mysql)

項目簡介 美妝產品進銷存管理系統的設計與開發實現了以下功能: 美妝產品進銷存管理系統的設計與開發的主要使用者分為管理員登錄后修改個人的密碼。產品分類管理中,對公司內的所有產品分類進行錄入,也可以對產品分類進行修改和刪除。產品管…

Python(pymysql包)操作MySQL【增刪改查】

下載pymysql: pip install pymysql 在MySQL中創建數據庫:unicom create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci;use unicom; 在unicom中創建數據表:admin create table admin(id int not null primary key auto_i…

日志2025.2.9

日志2025.2.9 1.增加了敵人揮砍類型 2.增加了敵人的死亡狀態 在敵人身上添加Ragdoll,死后激活布偶模式 public class EnemyRagdoll : MonoBehaviour { private Rigidbody[] rigidbodies; private Collider[] colliders; private void Awake() { rigidbodi…

HTTP無狀態的概念以及對后端服務的設計會產生的影響

HTTP無狀態(Statelessness) 是指每個HTTP請求都是獨立的,服務器不會記住或依賴于前一個請求的任何信息。每次請求的處理都與其他請求沒有直接關系。也就是說,服務器在處理請求時,不會存儲關于客戶端狀態的信息。 一、HTTP無狀態的具體含義 ①每個請求獨立:每個請求包含了…

操作系統—進程與線程

補充知識 PSW程序狀態字寄存器PC程序計數器:存放下一條指令的地址IR指令寄存器:存放當前正在執行的指令通用寄存器:存放其他一些必要信息 進程 進程:進程是進程實體的運行過程,是系統進行資源分配和調度的一個獨立單位…

python:面向對象案例烤雞翅

自助烤雞翅的需求: 1.烤雞翅的時間和對應的狀態: 0-4min :生的 4-7min:半生不熟 7-12min:熟了 12min以上:烤糊了 2.添加調料: 客戶根據自己的需求添加 定義烤雞翅的類、屬性和方法,顯示對象的信息 …