網絡編程——TCP和UDP詳細講解

文章目錄

  • TCP/UDP全面詳解
    • 什么是TCP和UDP?
    • TCP如何保證可靠性?
      • 1. 序列號(Sequence Number)
      • 2. 確認應答(ACK)
      • 3. 超時重傳(Timeout Retransmission)
      • 4. 窗口控制(Sliding Window)
      • 5. 快速重傳(Fast Retransmit)
    • 三次握手(建立連接)
    • 四次揮手(斷開連接)
    • 為什么是三次握手?為什么是四次揮手?
      • 三次握手的原因
      • 四次揮手的原因
    • TCP和UDP特點
    • TCP擁塞控制
      • 一、慢啟動(Slow Start)
        • 舉例:
      • 二、擁塞避免(Congestion Avoidance)
        • 舉例:
      • 三、超時重傳與慢啟動重啟
      • 處理方法:
    • 四、快速重傳與快速恢復(Fast Retransmit & Fast Recovery)
      • 快速重傳行為:
      • 快速恢復行為:
    • 擁塞控制減慢增長速度的條件總結
      • 擁塞控制會減慢增長速度的時機:
    • TCP/IP 數據鏈路層的交互過程簡述
    • TCP 和 UDP 如何區分?
    • UDP 中的 `connect()` 函數原理
      • `connect()` 的作用:
    • TCP連接中的 TIME_WAIT 狀態詳解
      • 一、TIME_WAIT 狀態如何產生?
      • 二、TIME_WAIT 的兩個核心作用
        • 1. 確保連接的可靠關閉
        • 2. 避免舊連接干擾新連接
      • 三、TIME_WAIT 的副作用與優化
        • ? 解決方法:
    • TCP的模型

TCP/UDP全面詳解

什么是TCP和UDP?

TCP(Transmission Control Protocol)叫傳輸控制協議,是面向連接可靠傳輸的協議。
UDP(User Datagram Protocol)叫用戶數據報協議,是無連接盡最大努力交付的協議。

一句話總結:

  • TCP可靠但慢,像寄快遞(要簽收、確認收貨)
  • UDP快速但可能丟失,像發傳單(發了就發了,收不收無所謂)

TCP如何保證可靠性?

TCP為了確保數據能安全、完整送到對方,設計了很多機制,主要有:

1. 序列號(Sequence Number)

每發送一段數據,TCP都會打個"編號"。
比如發送第一包數據編號1001,第二包編號2001,接收方按照編號順序排列,避免了丟包、亂序問題。

2. 確認應答(ACK)

接收方收到數據后,會回一條確認信息(ACK),告訴發送方:“我收到了!下一包從xxxx開始發。”
如果發送方遲遲收不到確認,就會懷疑數據丟了。

3. 超時重傳(Timeout Retransmission)

如果一定時間(超時)還沒收到確認,發送方就自動重發
一般超時時間 = 2 × RTT(往返時延)+ 偏差值。

4. 窗口控制(Sliding Window)

為了提高速度,TCP可以同時發多包,不需要一包一確認。
窗口大小定義了一次可以連續發送多少數據而不用等確認

小例子:
窗口大小=3,發送方可以連續發第1包、第2包、第3包數據,不用等第1包的確認就發第2包!

5. 快速重傳(Fast Retransmit)

如果連續收到3個相同的ACK(比如一直提示1001未收到),發送方立刻重發缺失的數據段,而不用等超時。


三次握手(建立連接)

  1. 客戶端發送SYN報文,請求建立連接(SYN=1,seq=J)。
  2. 服務器收到后,發送SYN+ACK報文,表示接受(SYN=1,ACK=1,seq=K,ack=J+1)。
  3. 客戶端再回一個ACK報文,確認連接建立(ACK=1,ack=K+1)。

三次握手后,雙方就可以正式通信了。
在這里插入圖片描述

特別感謝@frozendure繪制的圖片。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

四次揮手(斷開連接)

  1. 客戶端發FIN報文,請求斷開(主動關閉)。
  2. 服務器收到后,回ACK確認(被動關閉)。
  3. 服務器數據發完后,也發FIN報文。
  4. 客戶端收到FIN后,回ACK確認,進入TIME_WAIT等待一段時間后徹底關閉。

小圖示:
在這里插入圖片描述


為什么是三次握手?為什么是四次揮手?

三次握手的原因

  • 防止陳舊連接(老舊、失效的請求包)誤建立連接。
  • 確保雙方收發能力正常
    如果只兩次握手,可能因為網絡延遲,服務器誤認為客戶端還想建立新連接,導致資源浪費。假設兩次握手時,A發出的第一個請求連接報文段在某一網絡節點長時間滯留,以致延誤到連接釋放后才到達B。B收到失效的連接請求報文段后,認為是A又發出一次新的連接請求。于是向A發送確認報文段,同意建立連接,此時在假定兩次握手的前提下,連接建立成功。這樣會導致B的資源白白浪費
    假設兩次握手時,A發出一個請求報文段,但發送過后A就因為問題而導致下線。之后B收到了A發來的請求連接報文段,給A發送確認報文段,同意建立連接,此時在假定兩次握手的前提下,連接建立成功。這樣會導致B的資源白白浪費
  • 第一次握手(客戶端發送SYN):保證客戶端能夠發送數據。
  • 第二次握手(服務器發送SYN-ACK):保證服務器能夠接收并發送數據。
  • 第三次握手(客戶端發送ACK):保證客戶端能夠接收數據。

四次揮手的原因

  • TCP是全雙工,發送和接收需要分別關閉
  • 一方關閉發送,不代表另一方立即也關閉發送,因此需要兩次FIN和兩次ACK,確保雙方都完成通信。

TCP和UDP特點

項目TCPUDP
是否連接面向連接(需三次握手)無連接
可靠性可靠,具備確認應答、重傳機制不可靠,盡力而為
傳輸速度較慢(因連接建立和狀態維護)較快(無需連接、開銷小)
傳輸單位字節流(Stream)數據報(Datagram)
是否順序保證順序到達不保證順序
占用資源較多(需維護連接狀態)較少
安全性容易受到SYN洪水攻擊等較少攻擊面
優點可靠性高、順序到達快速、資源開銷小
缺點速度慢、資源占用高、易被攻擊不可靠、易丟包、亂序
適用場景要求高可靠性,能容忍延遲要求實時性強,容忍丟包
應用實例文件傳輸(FTP)、發送郵件(SMTP)、網頁瀏覽(HTTP)視頻通話(VoIP)、在線視頻直播、網絡游戲、廣播

TCP擁塞控制

在 TCP 通信中,如果發送端窗口設置過大,會在短時間內發送大量數據,這可能導致中間路由器和接收端緩沖區被擠爆,進而引發丟包、重傳等問題。TCP 擁塞控制是指通過動態調整數據發送速率,避免過多的數據包涌入網絡,從而引起網絡擁堵甚至網絡癱瘓的一種機制。

因此,TCP 引入了擁塞控制窗口(cwnd),并采用如下四種主要算法動態調整窗口大小:


一、慢啟動(Slow Start)

  • 初始化擁塞窗口 cwnd = 1(以 MSS 為單位)。
  • 每收到一個確認應答(ACK),就將 cwnd 翻倍(即指數增長)。
  • 每經過一個 RTT,cwnd *= 2。
舉例:
  1. 第一個 RTT:cwnd = 1
  2. 第二個 RTT:cwnd = 2
  3. 第三個 RTT:cwnd = 4
  4. 第四個 RTT:cwnd = 8

? 優點:快速提高網絡利用率
? 缺點:指數增長可能迅速導致擁塞


二、擁塞避免(Congestion Avoidance)

當 cwnd 達到慢啟動閾值 ssthresh(一般初始值為 65536 字節),就不再使用慢啟動的指數增長,而是進入擁塞避免階段。

  • 每經過一個 RTT,僅將 cwnd 加 1(線性增長)。
  • 防止窗口增長過快引發網絡擁塞。
舉例:
  1. cwnd = 64,到達 ssthresh
  2. 后續每次 ACK,cwnd = cwnd + 1/cwnd ≈ 每 RTT 增加 1

三、超時重傳與慢啟動重啟

如果出現報文段超時未收到 ACK,TCP 認為網絡出現擁塞。

處理方法:

  1. ssthresh 設置為當前 cwnd 的一半;
  2. 將 cwnd 設為 1;
  3. 重新進入慢啟動階段

🔁 這是 TCP 的自我修復機制,避免持續擁塞。


四、快速重傳與快速恢復(Fast Retransmit & Fast Recovery)

如果收到 3 個重復的 ACK(即 ACK 重復了 3 次),TCP 認為某個報文段丟失。

快速重傳行為:

  • 立即重傳丟失的段,而不是等待超時。

快速恢復行為:

  • ssthresh = 當前 cwnd / 2;
  • cwnd = ssthresh + 3(體現網絡尚可);
  • 進入擁塞避免階段(不再重回慢啟動);

? 快速恢復保持了中等的發送速率,防止性能大幅下降。


擁塞控制減慢增長速度的條件總結

擁塞控制會減慢增長速度的時機:

  1. cwnd 超過 ssthresh
    • 進入擁塞避免階段,從指數增長變為線性增長。
  2. 發生超時重傳
    • 表明網絡嚴重擁塞,立即進入慢啟動(cwnd 重置為 1)。
  3. 收到 3 個重復 ACK
    • 進入快速重傳,cwmd 縮減并進入擁塞避免。

TCP/IP 數據鏈路層的交互過程簡述

當 IP 層向數據鏈路層(如以太網)傳遞數據時:

  1. 查找 ARP 緩存:查找目標 IP 對應的 MAC 地址;
  2. 若存在,直接封裝 MAC 地址;
  3. 若不存在,發起 ARP 廣播請求;
  4. 接收到 IP 匹配的設備返回自己的 MAC 地址;
  5. 使用該 MAC 地址封裝鏈路層幀,完成數據發送。

TCP 和 UDP 如何區分?

傳輸層協議由 IP 協議頭中的 Protocol 字段決定:

  • TCP:值為 6
  • UDP:值為 17

操作系統根據協議和端口號,將報文傳遞給對應的應用程序。


UDP 中的 connect() 函數原理

connect() 的作用:

  1. 記錄對端 IP 與端口號
  2. 發送數據時不再需要 sendto() 指定地址,可以使用 write()、send();
  3. 接收數據時只接受來自該對端的數據
  4. 可接收異步錯誤信息
  5. 丟棄來自其他地址的包

? 用于長期通信(如 TFTP)或希望使用 TCP 接口風格的場景。


TCP連接中的 TIME_WAIT 狀態詳解

一、TIME_WAIT 狀態如何產生?

  1. 主動關閉連接的一方(client)發送最后一個 ACK 后進入 TIME_WAIT
  2. 保持 2 * MSL 時間后釋放連接;
  3. MSL(Maximum Segment Lifetime):報文段在網絡中的最大生存時間。

二、TIME_WAIT 的兩個核心作用

1. 確保連接的可靠關閉
  • 若最后一個 ACK 丟失,server 會重發 FIN;
  • client 能在 TIME_WAIT 狀態中接收該 FIN,并再次回復 ACK;
  • 保證被動關閉方正常結束連接。
2. 避免舊連接干擾新連接
  • 如果不等待,可能使用相同四元組快速建立新連接;
  • 網絡中仍存在舊連接的數據包,可能被誤接收,導致數據錯亂;
  • 2MSL 等待時間保證舊數據失效。

三、TIME_WAIT 的副作用與優化

  • 占用端口資源;
  • 影響服務器重啟;
? 解決方法:

設置套接字選項 SO_REUSEADDR,允許 TIME_WAIT 狀態的端口被重復綁定。

TCP的模型

四層TCP/IP模型如下,包括應用層、網絡層、數據鏈路層、物理層
在這里插入圖片描述
在這里插入圖片描述

特別感謝@frozendure繪制的圖片和說明。

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

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

相關文章

性能測試工具篇

文章目錄 目錄1. JMeter介紹1.1 安裝JMeter1.2 打開JMeter1.3 JMeter基礎配置1.4 JMeter基本使用流程1.5 JMeter元件作用域和執行順序 2. 重點組件2.1 線程組2.2 HTTP取樣器2.3 查看結果樹2.4 HTTP請求默認值2.5 JSON提取器2.6 用戶定義的變量2.7 JSON斷言2.8 同步定時器&#…

rabbitMQ如何確保消息不會丟失

rabbitmq消息丟失的三種情況 生產者將消息發送到RabbitMQ的過程中時,消息丟失。消息發送到RabbitMQ,還未被持久化就丟失了數據。消費者接收到消息,還未處理,比如服務宕機導致消息丟失。 解決方案 生產者發送過程中,…

Beetle-RP2350 擴展板設計

Beetle-RP2350 擴展板設計 本文介紹了 DFRobot Beetle RP2350 開發板的擴展板設計,包括參數特點、效果展示、原理圖、實物驗證、工程測試等,為 RP2350 系列產品的開發提供了便捷。 PCB 工程詳見:Beetle-RP2350擴展板 - 立創開源硬件平臺 . …

2025年一加7pro刷twpr / magisk / kali nethunter教程+資源下載+避坑指南

從二手市場500淘了一個一加7pro 12+256 ,根據網上教程刷機但很多坑,折騰一周后搞定,記錄下給后人避坑 資源下載:鏈接:https://pan.quark.cn/s/c16b972509f2 提取碼:mUW7 本文是主流程+避坑指南,沒有基礎的需要手把手教學的shell都不會的就別看了,直接放棄或者tb找人花錢…

java HashMap,高效 哈希

java HashMap 有獨特的設計。 哈希表數組的每個位置是一個哈希桶&#xff0c;里面由鏈表或紅黑樹實現。&#xff08;> 8 或 < 6 的變化時&#xff0c;避免頻繁切換&#xff09; 容量&#xff08;capacity&#xff09;&#xff1a; 哈希表中桶&#xff08;bucket&#xf…

【業務領域】計算機網絡基礎知識

《計算機網絡方面有哪些書籍值得推薦&#xff1f;》 知乎掃盲貼&#xff1a; 《網絡是怎么鏈接的》 初識RDMA技術——RDMA概念&#xff0c;特點&#xff0c;協議&#xff0c;通信流程 采樣 》 存儲 》傳輸 》處理 》反應 傳感器 存儲器 接口 算法/cpu 機器

List--鏈表

一、鏈表 1.1 什么是List&#xff1f; 在C語言中&#xff0c;我們需要使用結構體struct來進行List(鏈表&#xff09;的實現&#xff1a; struct ListNode {DataType Data;//DataType是任意類型的變量定義struct ListNode* next;//指向下一個結點的指針變量 }; 與之前的vect…

tensor 的計算操作

1、創建tensor 常見創建 tensor 的方法 函數 作用 torch.Tensor(*size) 通過指定尺寸&#xff0c;生成一個 值全為 0 的 tensor torch.tensor(*list) 直接通過指定數據&#xff0c;生成tensor&#xff0c;支持 List、Numpy數組 torch.eye(row, column) 按照指定的行列數…

【Java面試題04】MySQL 篇

文章目錄 一、前言&#x1f680;&#x1f680;&#x1f680;二、MySQL 篇&#xff1a;??????1、MySQL 是如何實現事務的? 后序還在更新中~~~三、總結&#xff1a;&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&#x1f680; ?? 你每一…

UDP/TCP協議知識及相關機制

一.UDP協議 UDP是一種無連接、不可靠、面向報文、全雙工傳輸層的協議~ 1.無連接 &#xff1a; 知道對端的端口號和IP可以直接傳輸&#xff0c;不需要建立連接 2..不可靠&#xff1a;沒有確認機制&#xff0c;沒有重傳機制&#xff0c;不知道數據包能否能正確到達對端&#xff0…

【AI面試準備】語言模型、語音、多模態等模型能力評估指標和能力邊界

面試崗位提出這個要求:掌握語言模型、語音、多模態等模型能力評估指標和能力邊界。 以下是針對語言模型、語音模型、多模態模型能力評估指標與能力邊界的結構化總結,結合高頻面試考點和實際應用場景: 目錄 **一、語言模型(LLM)評估與邊界**1. **核心評估指標**2. **能力邊…

優雅關閉服務:深入理解 SIGINT / SIGTERM 信號處理機制

目錄 為什么需要優雅關閉&#xff1f; 什么是 SIGINT 和 SIGTERM&#xff1f; 如何實現優雅關閉&#xff08;以 C 為例&#xff09; 示例代碼&#xff08;gRPC 服務 Boost 信號監聽&#xff09;&#xff1a; 優雅關閉時的清理內容通常包括&#xff1a; 與 SIGKILL 的區別…

容器化-Docker-集群

一、Docker 集群基礎概念? 1、什么是 Docker 集群? Docker 集群是由多個 Docker 主機組成的集合,這些主機通過網絡連接在一起,共同管理和運行容器。在集群中,我們可以將容器服務均勻地分布到各個節點上,實現負載均衡和資源的高效利用。Docker 集群的核心組件包括管理器…

關于kafka

1.為什么需要消息隊列 舉個經典的例子。 你是一個網購達人&#xff0c;經常在網上購物。快遞小哥到了你的小區后&#xff0c;立刻給你打電話說&#xff1a;“你的快遞到了&#xff0c;請馬上來取。” 但你是一個合格的牛馬&#xff0c;在上班&#xff0c;不方便取快遞&#…

微服務即時通信系統(十二)---入口網關子服務

目錄 功能設計 模塊劃分 業務接口/功能示意圖 服務實現流程 網關HTTP接口 網關WebSocket接口 總體流程 服務代碼實現 客戶端長連接管理封裝(connectionManage.hpp) proto文件的編寫 身份鑒權proto 事件通知proto 各項請求的URL的確定 服務端完成入口網關服務類…

存儲器層次結構:理解計算機記憶的金字塔

存儲器層次結構&#xff1a;理解計算機記憶的金字塔 在計算機系統中&#xff0c;“速度”與“成本”常常處于對立面。為了在速度與成本之間取得平衡&#xff0c;計算機體系結構采用了一種名為“存儲器層次結構&#xff08;Memory Hierarchy&#xff09;”的設計思想。本文將通…

HTTP 錯誤 500.19 - Internal Server Error

1.HTTP 錯誤 500.19 - Internal Server Error NetCore項目托管到IIS后&#xff0c;報錯如下&#xff1a; 原因是因為IIS中沒有安裝AspNetCoreModuleV2導致的&#xff0c; 1.打開IIS 2.選中服務器根節點&#xff0c;找到模塊&#xff0c;雙擊進入&#xff0c;確認模塊中是否存…

【c++】【STL】stack詳解

目錄 stack類的作用什么是容器適配器stack的接口構造函數emptysizetoppushpopswap關系運算符重載 stack類的實現 stack類的作用 stack是stl庫提供的一種容器適配器&#xff0c;也就是我們數據結構中學到的棧&#xff0c;是非常常用的數據結構&#xff0c;特點是遵循LIFO&#…

K8s學習與實踐

一、Kubernetes 核心原理 1. Kubernetes 設計哲學 Kubernetes&#xff08;k8s&#xff09;是一個開源的容器編排平臺&#xff0c;旨在自動化容器化應用的部署、擴展和管理。其核心設計圍繞以下目標&#xff1a; 聲明式配置&#xff1a;用戶描述期望狀態&#xff08;如 YAML …

Umi-OCR項目(1)

最近接觸到了一個項目&#xff0c;我在想能不能做出點東西出來。 目標&#xff1a;識別一張帶表格的圖片&#xff0c;要求非表格內容和表格內容都要識別得很好&#xff0c;并且可視化輸出為word文檔。 下面是第一步的測試代碼&#xff0c;測試是否能夠調用ocr能力。 import re…