計算機網絡---傳輸控制協議Transmission Control Protocol(TCP)

一、TCP的定位與核心特性

TCP(Transmission Control Protocol,傳輸控制協議)是TCP/IP協議棧中傳輸層的核心協議,與UDP(用戶數據報協議)共同承擔端到端數據傳輸功能。其設計目標是在不可靠的IP網絡上提供可靠、有序、面向連接的字節流服務,是互聯網中絕大多數應用(如HTTP、FTP、SMTP等)的基礎。

與UDP相比,TCP的核心特性差異如下:

  • 面向連接:通信前需通過“三次握手”建立連接,結束后需“四次揮手”釋放連接;UDP無連接。
  • 可靠傳輸:通過序號、確認、重傳等機制確保數據不丟失、不重復、按序到達;UDP不保證可靠性。
  • 字節流服務:將應用層數據視為連續字節流,無消息邊界;UDP保留消息邊界。
  • 流量控制與擁塞控制:通過滑動窗口避免接收方緩沖區溢出,通過擁塞算法避免網絡擁塞;UDP無此類機制。
  • 適用于場景:對可靠性要求高(如文件傳輸、網頁加載);UDP適用于實時性要求高(如視頻通話、游戲)。
二、TCP報文結構

TCP報文由首部數據兩部分組成,首部最小20字節,最大60字節(含選項字段)。各字段含義如下:

字段長度(字節)含義
源端口/目的端口2/2標識發送端和接收端的應用進程(如HTTP默認80端口)。
序號(Sequence Number)4本報文數據段第一個字節的序號(用于按序重組和去重)。
確認號(Acknowledgment Number)4期望接收的下一字節序號(僅當ACK=1時有效,即確認已收到序號≤(確認號-1)的數據)。
數據偏移(Header Length)4位表示TCP首部長度(以32位字為單位,最小值5(20字節),最大值15(60字節))。
保留位6位預留未來使用,目前需設為0。
控制位(Flags)6位共6個標志位:URG(緊急指針有效)、ACK(確認號有效)、PSH(推數據至應用層)、RST(重置連接)、SYN(同步序號,建立連接)、FIN(終止連接)。
窗口大小(Window)2字節接收窗口(rwnd),告知發送方可接收的字節數(流量控制核心字段)。
校驗和(Checksum)2字節用于檢測報文段在傳輸中是否損壞(覆蓋偽首部、TCP首部、數據)。
緊急指針(Urgent Pointer)2字節當URG=1時有效,指示緊急數據在報文段中的偏移量(緊急數據優先處理)。
選項(Options)0-40字節可選字段,如MSS(最大報文段長度)、SACK(選擇確認)、Window Scale(窗口擴大因子)等。
三、TCP連接管理

TCP是“面向連接”的協議,連接管理包含建立連接(三次握手)釋放連接(四次揮手) 兩個過程,通過控制位(SYN、ACK、FIN)實現。

1. 三次握手(建立連接)

三次握手的目標是:① 確保雙方收發能力正常;② 協商初始序號(ISN);③ 同步連接狀態。流程如下:

  • 第一次握手:客戶端 → 服務器
    發送SYN報文(SYN=1,ACK=0),攜帶客戶端初始序號ISN_c(如x)。此時客戶端進入SYN_SENT狀態。

  • 第二次握手:服務器 → 客戶端
    服務器收到SYN后,回復SYN+ACK報文(SYN=1,ACK=1),攜帶服務器初始序號ISN_s(如y),并確認客戶端序號(確認號=ISN_c+1=x+1)。此時服務器進入SYN_RCVD狀態。

  • 第三次握手:客戶端 → 服務器
    客戶端收到SYN+ACK后,發送ACK報文(ACK=1),確認服務器序號(確認號=ISN_s+1=y+1)。此時客戶端進入ESTABLISHED狀態;服務器收到ACK后也進入ESTABLISHED狀態,連接建立。

在這里插入圖片描述

為何需要三次握手?

  • 防止“過期連接請求”干擾:若客戶端的SYN報文因網絡延遲到達服務器,服務器會誤以為是新連接并回復SYN+ACK。若僅兩次握手,服務器會直接建立連接并等待數據,但客戶端已丟棄該過期請求,導致服務器資源浪費。三次握手通過客戶端的最終ACK,確保雙方確認“當前連接有效”。

用最簡單的例子解釋為什么需要三次握手:
A: 喂,能聽見嗎?
B: 能聽見,你能聽見我嗎?
A: 能聽見。

在這里插入圖片描述

2. 四次揮手(釋放連接)

TCP支持“半關閉”(一方關閉發送后仍可接收數據),因此釋放連接需四次交互:

  • 第一次揮手:客戶端 → 服務器
    客戶端主動關閉,發送FIN報文(FIN=1,ACK=1),表示不再發送數據(但可接收),攜帶序號u(最后發送字節的序號+1)。客戶端進入FIN_WAIT_1狀態。

  • 第二次揮手:服務器 → 客戶端
    服務器收到FIN后,回復ACK報文(ACK=1),確認號=u+1,告知客戶端“已收到關閉請求”。服務器進入CLOSE_WAIT狀態,客戶端進入FIN_WAIT_2狀態(等待服務器剩余數據)。

  • 第三次揮手:服務器 → 客戶端
    服務器發送完剩余數據后,發送FIN報文(FIN=1,ACK=1),攜帶序號v(服務器最后發送字節的序號+1),確認號=u+1(與第二次揮手一致)。服務器進入LAST_ACK狀態。

  • 第四次揮手:客戶端 → 服務器
    客戶端收到FIN后,回復ACK報文(ACK=1),確認號=v+1,客戶端進入TIME_WAIT狀態;服務器收到ACK后進入CLOSED狀態。客戶端等待2MSL(最大報文段壽命,通常為1-2分鐘)后,也進入CLOSED狀態,釋放連接。

在這里插入圖片描述

四次揮手:
A:再見
B:收到
B:再見
A:收到

關鍵細節

  • 為何四次揮手? 第二次揮手(ACK)和第三次揮手(FIN)無法合并,因為服務器可能還有數據需發送(半關閉狀態)。
  • TIME_WAIT狀態:持續2MSL(確保最后一個ACK被服務器收到;防止舊報文干擾新連接)。若服務器未收到ACK,會重發FIN,客戶端需在TIME_WAIT內處理。
3. TCP狀態機

連接管理的狀態轉換可通過狀態機描述,核心狀態包括:

  • 客戶端:CLOSEDSYN_SENTESTABLISHEDFIN_WAIT_1FIN_WAIT_2TIME_WAITCLOSED
  • 服務器:CLOSEDLISTENSYN_RCVDESTABLISHEDCLOSE_WAITLAST_ACKCLOSED

異常狀態:RST(重置連接,用于處理錯誤,如連接不存在時強制關閉)。

四、TCP可靠傳輸機制

TCP通過多重機制確保數據“可靠傳輸”(不丟失、不重復、按序到達),核心包括序號與確認超時重傳快速重傳與恢復選擇確認(SACK) 等。

1. 序號與確認機制
  • 序號:每個字節數據分配唯一序號(初始為ISN,后續按字節遞增)。例如,若ISN=100,發送50字節數據,序號為100-149,下一個序號為150。
  • 確認號:采用“累計確認”,表示“已正確接收序號≤(確認號-1)的所有數據”,期望接收確認號對應的字節。例如,收到序號100-149的數據,確認號為150。
2. 超時重傳

當發送方未在規定時間內收到確認,會重傳該數據,關鍵是超時時間(RTO) 的計算:

  • RTO需動態調整(基于RTT,往返時間):
    • 樣本RTT(SampleRTT):單次報文往返時間;
    • 平滑RTT(SRTT):SRTT = (1-α)×SRTT + α×SampleRTT(α通常為0.125);
    • RTT偏差(RTTVAR):RTTVAR = (1-β)×RTTVAR + β×|SampleRTT - SRTT|(β通常為0.25);
    • 最終RTO = SRTT + 4×RTTVAR(確保97%的RTT落在RTO內)。
3. 快速重傳與快速恢復
  • 快速重傳:當發送方收到3個重復確認(確認號相同),無需等待超時,立即重傳未被確認的報文(推斷該報文已丟失)。
  • 快速恢復:重傳后不執行慢啟動(避免網絡擁塞加劇),而是將擁塞窗口(cwnd)設為慢啟動閾值(ssthresh),直接進入擁塞避免階段。
4. 選擇確認(SACK)

累計確認的缺陷:若中間報文丟失,后續報文即使到達也無法被單獨確認。SACK通過選項字段告知發送方“已接收的非連續數據塊”,發送方僅重傳丟失部分。例如,接收方收到1-100、201-300,SACK會標記這兩個區間,發送方僅重傳101-200。

五、流量控制

流量控制用于防止發送方速率超過接收方處理能力,基于“滑動窗口機制”,通過接收窗口(rwnd)實現。

1. 滑動窗口原理
  • 發送窗口:發送方可發送但未確認的數據范圍,大小由接收窗口(rwnd)和擁塞窗口(cwnd)共同決定(發送窗口=min(rwnd, cwnd))。
  • 接收窗口:接收方緩沖區剩余空間(rwnd = 接收緩沖區大小 - 已接收未讀取數據量),通過TCP報文的“窗口大小”字段告知發送方。

窗口分為三部分:

  • 已發送且確認:序號≤已確認序號;
  • 已發送未確認:序號在已確認序號+1 至 發送窗口左沿-1;
  • 未發送但可發送:序號在發送窗口左沿 至 發送窗口右沿-1;
  • 不可發送:序號≥發送窗口右沿。
2. 窗口動態調整
  • 接收方隨緩沖區使用情況更新rwnd(若緩沖區滿,rwnd=0);
  • 發送方根據rwnd調整發送窗口:若rwnd=0,發送方停止發送,定期發送“零窗口探測報文”(1字節),接收方回復新的rwnd后恢復發送。
六、擁塞控制

擁塞控制用于防止發送方速率超過網絡承載能力(避免網絡擁塞導致丟包),核心是通過調整擁塞窗口(cwnd) 控制發送速率,涉及四大算法:慢啟動、擁塞避免、快重傳、快恢復。

1. 核心參數
  • 擁塞窗口(cwnd):發送方根據網絡擁塞狀態動態調整的窗口(初始為1MSS);
  • 慢啟動閾值(ssthresh):cwnd增長的臨界點(初始為較大值,如65535字節)。
2. 算法流程
  • 慢啟動:cwnd從1MSS開始,每收到一個確認(或每經過一個RTT),cwnd翻倍(指數增長),直到cwnd達到ssthresh,進入擁塞避免階段。
  • 擁塞避免:cwnd每經過一個RTT增加1MSS(線性增長),降低擁塞風險。
  • 擁塞處理
    • 若超時重傳(嚴重擁塞):ssthresh = cwnd/2,cwnd重置為1MSS,重新慢啟動;
    • 若收到3個重復確認(輕度擁塞):觸發快重傳,ssthresh = cwnd/2,cwnd = ssthresh,進入擁塞避免(快恢復)。
七、其他重要特性
  1. 面向字節流:TCP將應用數據視為連續字節流,無消息邊界,應用層需自行處理數據分割(如通過長度字段或分隔符)。
  2. 最大報文段長度(MSS):TCP報文段最大數據部分長度(MSS = MTU - IP首部長度 - TCP首部長度,以太網中通常為1460字節),在三次握手的SYN報文中協商。
  3. Nagle算法:減少小報文數量(如連續發送多個1字節數據),規則是:未確認數據時,僅當數據達MSS或收到確認,才發送。可通過TCP_NODELAY選項關閉(適用于實時性場景,如SSH)。
  4. 延遲確認:接收方不立即回復ACK,而是延遲500ms(或在發送數據時一并確認),減少ACK數量。若500ms內收到新數據,會合并確認。
八、常見問題與優化
  1. 粘包問題:TCP字節流無邊界,導致應用層收到的數據可能合并(粘包)或拆分。解決方法:

    • 固定長度:每個消息固定大小;
    • 分隔符:用特殊字符(如\r\n)分隔消息;
    • 長度前綴:消息頭部包含長度字段。
  2. TIME_WAIT積累:高并發場景下,大量TIME_WAIT狀態連接會占用端口。優化方案:

    • 開啟SO_REUSEADDR:允許端口快速復用;
    • 縮短TIME_WAIT時長(如調整net.ipv4.tcp_fin_timeout)。
  3. 擁塞控制優化:傳統算法(如Reno)在高帶寬延遲網絡(如衛星鏈路)效率低,現代算法如BBR(基于帶寬和延遲)、CUBIC(基于三次函數增長)可提升性能。


TCP是互聯網可靠傳輸的基石,通過三次握手建立連接、四次揮手釋放連接,結合序號確認、超時重傳、SACK等機制確保可靠性,通過滑動窗口實現流量控制,通過慢啟動、擁塞避免等算法實現擁塞控制。理解TCP的核心機制,對網絡編程、性能優化及問題排查至關重要。其設計兼顧了可靠性與效率,是計算機網絡中最復雜且應用最廣泛的協議之一。

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

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

相關文章

week1-[分支嵌套]公因數

week1-[分支嵌套]公因數 題目描述 給定 444 個正整數 a,b,c,ka,b,c,ka,b,c,k。如果 a,b,ca,b,ca,b,c 都是 kkk 的倍數,那么稱 kkk 是 a,b,ca,b,ca,b,c 的公因數。否則如果某兩個數都是 kkk 的倍數,那么稱 kkk 是這兩個數的公因數。問 kkk 是哪些數的公因…

C#枚舉/結構體講一講

先展示一段簡單代碼// 定義枚舉 public enum thisday {吃飯,不吃 }// 定義結構體 public struct person {public string name;public int age;public thisday zhuangtai; // 使用枚舉類型作為字段 }static void Main(string[] args) {// 創建結構體實例person thisperson;thisp…

C++-setmap詳解

Cset&map 1. 序列式容器和關聯式容器 1.1 序列式容器 序列式容器按照線性順序存儲元素,元素的位置取決于插入的時間和位置,與元素的值無關。 主要特點:元素按插入順序存儲可以通過位置(索引)直接訪問元素不自動排序…

解決程序連不上RabbitMQ:Attempting to connect to/access to vhost虛擬主機掛了的排錯與恢復

前言:在分布式系統里,RabbitMQ作為消息中間件,是服務間通信的關鍵紐帶。但實際使用中,程序連接RabbitMQ失敗的情況時有發生。本文結合真實報錯,細致呈現從問題發現到解決的完整排錯思路,還會深入講解Rabbit…

K8S中如何配置PDB(Pod Disruption Budget)

1. PDB 核心概念作用:控制自愿中斷(如節點升級、縮容)期間,應用的最小可用副本數或最大不可用比例。關鍵參數:minAvailable:必須保持運行的 Pod 數量(如 2 或 50%)。maxUnavailable&…

從 0 到 1:用 MyCat 打造可水平擴展的 MySQL 分庫分表架構

一、為什么要分庫分表? 單機 MySQL 的極限大致在:維度經驗值單表行數≤ 1 000 萬行(B 樹三層)單庫磁盤≤ 2 TB(SSD)單機 QPS≤ 1 萬(InnoDB)當業務繼續增長,數據量和并發…

電池模組奇異值分解降階模型

了解如何將奇異值分解 (SVD) 降階模型 (ROM) 應用于電池模塊熱模擬。挑戰隨著電池模塊在電動汽車和儲能系統中的重要性日益提升,其熱性能管理也成為一項重大的工程挑戰。高功率密度會產生大量熱量,如果散熱不當,可能導致電池性能下降、性能下…

《Python函數:從入門到精通,一文掌握函數編程精髓》

堅持用 清晰易懂的圖解 代碼語言,讓每個知識點變得簡單! 🚀呆頭個人主頁詳情 🌱 呆頭個人Gitee代碼倉庫 📌 呆頭詳細專欄系列 座右銘: “不患無位,患所以立。” Python函數:從入門到…

【記錄貼】STM32 I2C 控制 OLED 卡死?根源在 SR1 與 SR2 的讀取操作

問題描述最近在復用以前STM32F407控制OLED的代碼,移植到STM32F103 上,使用硬件 I2C 通信方式。按照常規流程,先發送 OLED 的從機地址,OLED 有正常應答,但當發送第一個控制命令(0xAE)前的控制字節…

【AI驅動的語義通信:突破比特傳輸的下一代通信范式】

文章目錄1 語義通信簡介1.1 基本概念:什么是語義通信?語義通信的核心目標1.2 基本結構:語義通信系統結構語義通信系統的通用結構組成語義通信系統的結構關鍵模塊1.3 基于大模型的語義通信關鍵技術🧠語義通信系統中AI大模型的設計建…

網絡原理-HTTP

應用層自定義協議自定義協議是指根據特定需求設計的通信規則,用于設備或系統間的數據交換。其核心在于定義數據結構、傳輸方式及處理邏輯。協議結構示例典型的自定義協議包含以下部分:頭部(Header):標識協議版本、數據…

ROS配置debug指南

一. 安裝插件 下面的這一個插件過期了需要用下面的這一個插件來替換:二. 設置CMakeLists.txt的編譯模式 set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAG…

微軟正式將GPT-5接入Microsoft Copilot Studio(國際版)

微軟宣布正式在Microsoft Copilot Studio(國際版)中集成GPT-5,推動智能體構建能力實現突破性升級。此次更新不僅為企業用戶帶來更高效的響應速度、更精準的語境理解能力,還通過增強的邏輯推理功能,顯著提升了AI交互的深…

微算法科技(NASDAQ:MLGO)通過蟻群算法求解資源分配的全局最優解,實現低能耗的區塊鏈資源分配

隨著區塊鏈網絡規模的不斷擴大和業務需求的日益復雜,資源分配問題逐漸成為制約其發展的關鍵因素之一。傳統的區塊鏈資源分配方法往往存在效率低下、能耗過高、難以達到全局最優解等問題。高能耗不僅增加了運營成本,還對環境造成了較大的壓力。因此&#…

深入淺出JVM:Java虛擬機的探秘之旅

深入淺出JVM:Java虛擬機的探秘之旅一、JVM 初相識:揭開神秘面紗 在 Java 的世界里,JVM(Java Virtual Machine,Java 虛擬機)就像是一個神秘的幕后大 boss,掌控著 Java 程序運行的方方面面。你可以…

Nginx學習筆記(八)—— Nginx緩存集成

🗄🗄 Nginx緩存集成 📌📌 一、緩存核心價值 #mermaid-svg-CNji1KUDOsF8MwoY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CNji1KUDOsF8MwoY .error-icon{fill:#5522…

httpx 設置速率控制 limit 時需要注意 timeout 包含 pool 中等待時間

假設通過 httpx.Client 設置 limit 速率控制后,同時發起多個請求訪問 youtube。并且由于科學原因一直連接不上 假設一共 4 個連接,max_connection2,timeout5s。 默認會發生的情況不是前兩個連接 tcp 握手 timeout,后兩個連接再發起…

【網絡】TCP/UDP總結復盤

1.UDP的格式2.TCP的格式3.TCP是來解決什么問題的?答:解決IP層的不可靠傳輸問題,可能數據包丟失、損壞、重復等為上層應用層提高可靠有序的數據傳輸服務通過校驗和、確認應答機制、序列號來解決不可靠傳輸和無序性問題通過流量控制--->>…

Nginx 配置中,root 和 alias 區別

在 Nginx 配置中,root 和 alias 都用于定義文件路徑,但它們的行為有重要區別,特別是 路徑拼接方式 和 末尾斜杠 (/) 的影響。1. root 和 alias 的區別 (1) root 指令 作用:root 會將 location 的 URI 拼接到 root 路徑后面&#x…

基于vue.js的無縫滾動

方法一&#xff1a;基于requestAnimationFrame demo <template><h-page-container class"hoem-page"><h1>無縫滾動</h1><h2>垂直方向</h2><div class"container1"><AutoScroll :data"list" :item-…