TCP, 三次握手, 四次揮手, 滑動窗口, 快速重傳, 擁塞控制, 半連接隊列, RST, SYN, ACK

目錄

  • TCP 是什么:面向連接 + 可靠 + 字節流
  • 三次握手:為什么不是兩次
  • 四次揮手與 TIME_WAIT:誰等誰
  • 序列號/確認號與去重、排序、確認
  • 重傳機制:超時重傳與快速重傳
  • 滑動窗口與流量控制
  • 擁塞控制:慢啟動/擁塞避免/快重傳/快恢復
  • 保活機制與長連接
  • 半連接隊列、全連接隊列與 SYN 攻擊
  • RST 的語義:什么時候會被動斷開
  • 常見高頻面試問答(含易錯點)
  • 抓包與排錯清單
  • 參考與延伸閱讀

在這里插入圖片描述

TCP 是什么:面向連接 + 可靠 + 字節流

  • 面向連接:通信前需要建立連接(三次握手)。
  • 可靠交付:通過序列號、確認號、校驗和、重傳、窗口等保證不丟、不重、按序到達(應用層“看起來”按序)。
  • 字節流:沒有消息邊界,數據是連續字節流,分段與拼包在傳輸層完成。

簡圖(字節流與按序):

[App 寫入字節] => [TCP 分段 seq=100..] => [網絡] => [TCP 重組、去重、排序] => [App 讀到連續字節]

三次握手:為什么不是兩次

三次握手的目標:

  • 交換初始序列號(ISN)并建立雙向通信能力。
  • 讓客戶端和服務端都“確認”對方的收發能力都正常。

流程(簡化):

CLOSE -> SYN-SENT --SYN(x)--> LISTEN
SYN-RCVD <--SYN(y),ACK(x+1)-- LISTEN
ESTABLISHED --ACK(y+1)--> ESTABLISHED

為什么不能兩次?

  • 若兩次握手,服務端無法判斷當前請求是否“歷史連接”重放;第三次 ACK 讓客戶端基于上下文確認“我確實與這個服務端建立了當前連接”,避免“僵尸連接”占用資源。

我常用的比喻:

  • 第一次:我能發(SYN)。
  • 第二次:我能收能發(SYN+ACK)。
  • 第三次:我也能收(ACK),雙方都齊活。

注:半連接隊列記錄“收到 SYN 尚未完成握手”的請求;若第三次 ACK 不到,條目會因超時被清理。


四次揮手與 TIME_WAIT:誰等誰

為什么“揮手”通常是四次?

  • 關閉是“單向”的:一方 FIN 只表示“我不再發了”,對方讀到 FIN 但仍可繼續發送,故需要兩對報文確保雙方各自完成“發送通道”的關閉。

典型序列:

(主動關閉)  FIN -> ACK    (被動方進 CLOSE_WAIT)...對方數據發送完...FIN -> ACK    (主動方進 TIME_WAIT)

TIME_WAIT 的意義:

  • 等 2MSL,確保:
    • 最后的 ACK 若丟失,對方重發 FIN,我還能重發 ACK;
    • 舊連接的遲到報文不會影響未來新的同四元組連接。

調優提示:

  • 服務端側可讓“短連接風格”的一方盡量成為被動關閉者,降低其 TIME_WAIT 壓力(視業務/棧實現)。

序列號/確認號與去重、排序、確認

我面試常用“翻書”比喻:

能力解決的問題類比
序列號(seq)去重與排序頁碼防重排
確認號(ack)成功到達的確認勾選“已讀”
窗口(win)節流與并行度讀寫節拍

發送端維護已發送未確認的數據集合,接收端通過累計 ACK 告知“我已經連續收到哪一位點前的所有字節”。


重傳機制:超時重傳與快速重傳

  • 超時重傳(RTO):發送后啟動定時器,超時無 ACK 則重發;RTO 自適應基于 RTT 與抖動(通常 > RTT 的一定倍數)。
  • 快速重傳:收到 3 個重復 ACK(如 ACK=101,101,101),判定某段可能丟了,提前重傳,減少等待 RTO 的成本。

要點:

  • 重傳報文的 seq 與原始相同,可能合并為更大段(取決于實現)。
  • 局部亂序也會觸發重復 ACK,但不等同于丟包;擁塞控制會進一步介入(見下)。

滑動窗口與流量控制

  • 接收窗口(rwnd):接收端緩沖可用空間,通過報文通告給發送端,防止“接收方處理不過來”。
  • 發送窗口(swnd):發送端根據 min(cwnd, rwnd) 決定實際并發在途數據量。
  • 零窗口探測:若 rwnd=0,發送端定期發探測報文,等待窗口開放。

可視化(簡略):

|--- 已確認 ---|--- 已發送未確 ---|--- 可發送窗口 ---|^ base            ^ nextSeq

擁塞控制:慢啟動/擁塞避免/快重傳/快恢復

  • cwnd:擁塞窗口,代表“網絡可能承受的并發在途量”的猜測值。
  • 慢啟動:從 1 MSS 開始指數增長,閾值 ssthresh 之前翻倍,之后線性增加(擁塞避免)。
  • 快重傳/快恢復:
    • 3 次重復 ACK 觸發:ssthresh = cwnd/2cwnd = ssthreshssthresh + 3*MSS(依實現),進入快速恢復,避免回到 1 MSS 的冷啟動。
  • 超時:說明更嚴重擁塞,通常將 cwnd 置 1 MSS,重新慢啟動。

保活機制與長連接

  • KeepAlive:長時間無數據時周期性發送探測包;若多次無響應,判定連接死亡并關閉。默認關/開與探測周期依 OS 而異,可配置。
  • 應用層心跳:例如 HTTP/2、WebSocket 自帶 ping/pong,更靈活。

半連接隊列、全連接隊列與 SYN 攻擊

  • 半連接隊列(SYN 隊列):收到 SYN,發送 SYN+ACK,等待第三次握手的 ACK。若超時未到達則過期剔除。
  • 全連接隊列(Accept 隊列):三次握手完成的連接,等待應用層 accept() 取走。
  • 防護思路:
    • SYN Cookies、縮短 SYN/ACK 重傳與過期時間、增大隊列。
    • 使用負載均衡/防火墻清洗異常 SYN 洪泛。

RST 的語義:什么時候會被動斷開

  • RST 表示“連接非法/不存在或異常狀態”,常見觸發:
    • 目標端口無進程監聽;
    • 應用層提前關閉 socket,仍收到對端數據;
    • 抓包/半開異常導致狀態機不同步。
  • 面試提示:用 RST 終止連接不會進入 TIME_WAIT(與 FIN 流程不同)。

常見高頻面試問答(含易錯點)

  1. 為什么是三次握手不是兩次?
  • 需要確認“雙方收發能力”,并防歷史連接的重放,占用資源。
  1. 為什么揮手要四次?
  • 關閉是單向的,兩個方向分別 FIN/ACK。
  1. TIME_WAIT 為什么在主動關閉方?
  • 負責兜住最后 ACK 丟失與舊報文消散。
  1. 3 個重復 ACK 一定是丟包嗎?
  • 不一定,可能亂序;但為降低時延會觸發快速重傳并調整擁塞窗口。
  1. rwndcwnd 誰說了算?
  • 實際可發窗口取兩者較小值:min(cwnd, rwnd)
  1. 半連接隊列爆了怎么辦?
  • 開啟 SYN Cookies、調大隊列、縮短重試、前置抗 DDoS。
  1. 為什么 TCP 是字節流,UDP 是報文?
  • TCP 為可靠按序的連續字節,UDP 不保證順序、丟失可見,保留消息邊界。

抓包與排錯清單

  • 觀察三次握手:過濾 tcp.flags.syn==1 && tcp.flags.ack==0
  • 快速重傳:看是否出現 3 次重復 ACK 與 Dup ACK 標記。
  • RTO 觸發:同一 seq 的報文重發,時間間隔接近 RTO。
  • 零窗口:Window Size Value = 0 與周期性探測包。
  • 擁塞事件:[TCP Previous segment not captured][Retransmission]、窗口驟降。

Wireshark 過濾示例:

# 僅看 TCP 握手
tcp.flags.syn==1 || tcp.flags.fin==1 || tcp.flags.reset==1
# 指定四元組
ip.addr==A && ip.addr==B && tcp.port in {PORT1,PORT2}

參考與延伸閱讀

  • RFC 793、RFC 5681:TCP 規范與擁塞控制
  • 《Linux高性能服務器編程》《TCP/IP 詳解 卷一》
  • Wireshark 官方文檔與實踐

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

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

相關文章

CentOS 7.2 虛機 ssh 登錄報錯在重啟后無法進入系統

文章目錄前言1. 故障描述2. 故障診斷3. 故障原因4. 解決方案總結前言 上周幫用戶處理了一個 linux 虛擬機在重啟后無法正常進入操作系統的故障&#xff0c;覺得比較有意思&#xff0c;在這里分享給大家。 1. 故障描述 事情的起因是一臺系統版本為 CentOS 7.2 的 VMware 虛擬機…

《從使用到源碼:OkHttp3責任鏈模式剖析》

一 從使用開始0.依賴引入implementation ("com.squareup.okhttp3:okhttp:3.14.7")1.創建OkHttpClient實例方式一&#xff1a;直接使用默認配置的Builder//從源碼可以看出&#xff0c;當我們直接new創建OkHttpClient實例時&#xff0c;會默認給我們配置好一個Builder …

安裝3DS MAX 2026后,無法運行,提示缺少.net core的解決方案

今天安裝了3DS MAX 2026&#xff08;俗稱3DMAX&#xff09;&#xff0c;安裝完畢后死活運行不了。提示如下&#xff1a; 大意是找不到所需的.NET Core 8庫文件。后來搜索了下&#xff0c;各種文章說.NET CORE和.NET FRAMEWORK不是一個東西。需要單獨下載安裝。然后根據提示&…

FastAPI + LangChain 和 Spring AI + LangChain4j

FastAPI+LangChain和Spring AI+LangChain4j這兩個技術組合進行詳細對比。 核心區別: 特性維度 FastAPI + LangChain (Python棧) Spring AI + LangChain4j (Java棧) 技術棧 Python生態 (FastAPI, LangChain) Java生態 (Spring Boot, Spring AI, LangChain4j) 核心設計哲學 靈活…

Apache 2.0 開源協議詳解:自由、責任與商業化的完美平衡-優雅草卓伊凡

Apache 2.0 開源協議詳解&#xff1a;自由、責任與商業化的完美平衡-優雅草卓伊凡引言由于我們優雅草要推出收銀系統&#xff0c;因此要采用開源代碼&#xff0c;卓伊凡目前看好了一個產品是apache 2.0協議&#xff0c;因此我們有必要深刻理解apache 2.0協議避免觸犯版權問題。…

自學嵌入式第37天:MQTT協議

一、MQTT&#xff08;消息隊列遙測傳輸協議Message Queuing Telemetry Transport&#xff09;1.MQTT是應用層的協議&#xff0c;是一種基于發布/訂閱模式的“輕量級”通訊協議&#xff0c;建構于TCP/IP協議上&#xff0c;可以以極少的代碼和有限的帶寬為連接遠程設備提供實時可…

RabbitMQ--延時隊列總結

一、延遲隊列概念 延遲隊列&#xff08;Delay Queue&#xff09;是一種特殊類型的隊列&#xff0c;隊列中的元素需要在指定的時間點被取出和處理。簡單來說&#xff0c;延時隊列就是存放需要在某個特定時間被處理的消息。它的核心特性在于“延遲”——消息在隊列中停留一段時間…

Java 提取 PDF 文件內容:告別手動復制粘貼,擁抱自動化解析!

在日常工作中&#xff0c;我們經常需要處理大量的 PDF 文檔&#xff0c;無論是提取報告中的關鍵數據&#xff0c;還是解析合同中的重要條款&#xff0c;手動復制粘貼不僅效率低下&#xff0c;還極易出錯。當面對海量的 PDF 文件時&#xff0c;這種傳統方式更是讓人望而卻步。那…

關鍵字 const

Flutter 是一個使用 Dart 語言構建的 UI 工具包&#xff0c;因此它完全遵循 Dart 的語法和規則。Dart 中的 const 是語言層面的特性&#xff0c;而 Flutter 因其聲明式 UI 和頻繁重建的特性&#xff0c;將 const 的效能發揮到了極致。Dart 中的 const&#xff08;語言層面&…

Ubuntu22.04中使用cmake安裝abseil-cpp庫

Ubuntu22.04中使用cmake安裝abseil-cpp庫 關于Abseil庫 Abseil 由 Google 的基礎 C 和 Python 代碼庫組成&#xff0c;包括一些正支撐著如 gRPC、Protobuf 和 TensorFlow 等開源項目并一起 “成長” 的庫。目前已開源 C 部分&#xff0c;Python 部分將在后續開放。 Abseil …

FreeRTOS項目(序)目錄

這章是整個專欄的目錄&#xff0c;負責記錄這個小項目的開發日志和目錄。附帶總流程圖。 目錄 項目簡介 專欄目錄 開發日志 總流程圖 項目簡介 本項目基于STM32C8T6核心板和FreeRTOS&#xff0c;實現一些簡單的功能。以下為目前已實現的功能。 &#xff08;1&#xff09…

Python 多任務編程:進程、線程與協程全面解析

目錄 一、多任務基礎&#xff1a;并發與并行 1. 什么是多任務 2. 兩種表現形式 二、進程&#xff1a;操作系統資源分配的最小單位 1. 進程的概念 2. 多進程實現多任務 2.1 基礎示例&#xff1a;邊聽音樂邊敲代碼 2.2 帶參數的進程任務 2.3 進程編號與應用注意點 2.3.…

ADSL技術

<摘要> ADSL&#xff08;非對稱數字用戶線路&#xff09;是一種利用傳統電話線實現寬帶上網的技術。其核心原理是頻率分割&#xff1a;將一根電話線的頻帶劃分為語音、上行數據&#xff08;慢&#xff09;和下行數據&#xff08;快&#xff09;三個獨立頻道&#xff0c;從…

信號衰減中的分貝到底是怎么回事

問題&#xff1a;在一個低通濾波中&#xff0c;經常會看到一個值-3dB&#xff08;-3分貝&#xff09;&#xff0c;到底是個什么含義&#xff1f; 今天我就來粗淺的講解這個問題。 在低通濾波器中&#xff0c;我們說的 “截止頻率”&#xff08;或叫 - 3dB 點&#xff09;&…

工具分享--IP與域名提取工具2.0

基于原版的基礎上新增了一個功能點:IP-A段過濾&#xff0c;可以快速把內網192、170、10或者其它你想要過濾掉的IP-A段輕松去掉&#xff0c;提高你的干活效率&#xff01;&#xff01;&#xff01; 界面樣式預覽&#xff1a;<!DOCTYPE html> <html lang"zh-CN&quo…

如何通過日志先行原則保障數據持久化:Redis AOF 和 MySQL redo log 的對比

在分布式系統或數據庫管理系統中&#xff0c;日志先行原則&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是確保數據一致性、持久性和恢復能力的重要機制。通過 WAL&#xff0c;系統能夠在發生故障時恢復數據&#xff0c;保證數據的可靠性。在這篇博客中&#x…

臨床研究三千問——臨床研究體系的3個維度(8)

在上周的文章中&#xff0c;我們共同探討了1345-10戰策的“臨床研究的起點——如何提出一個犀利的臨床與科學問題”。問題固然是靈魂&#xff0c;但若沒有堅實的骨架與血肉&#xff0c;靈魂便無所依歸。今天&#xff0c;我們將深入“1345-10戰策”中的“3”&#xff0c;即支撐起…

AI+預測3D新模型百十個定位預測+膽碼預測+去和尾2025年9月7日第172彈

從今天開始&#xff0c;咱們還是暫時基于舊的模型進行預測&#xff0c;好了&#xff0c;廢話不多說&#xff0c;按照老辦法&#xff0c;重點8-9碼定位&#xff0c;配合三膽下1或下2&#xff0c;殺1-2個和尾&#xff0c;再殺4-5個和值&#xff0c;可以做到100-300注左右。(1)定位…

萬字詳解網絡編程之socket

一&#xff0c;socket簡介1.什么是socketsocket通常也稱作"套接字"&#xff0c;?于描述IP地址和端?&#xff0c;是?個通信鏈的句柄&#xff0c;應用程序通常通過"套接字"向?絡發出請求或者應答?絡請求。?絡通信就是兩個進程間的通信&#xff0c;這兩…

維度躍遷:當萬物皆成電路,智能將從“擁有”變為“存在”

我們習以為常的電子世界&#xff0c;其本質是一個由電路構成的精密宇宙。而一場從二維到三維的終極變革&#xff0c;正在悄然醞釀&#xff0c;它將徹底顛覆我們創造和交互的方式。一、電子世界的本質&#xff1a;一切都是電路 在深入未來之前&#xff0c;我們首先要理解當下。電…