《UNIX網絡編程卷1:套接字聯網API》第2章 傳輸層:TCP、UDP和SCTP

《UNIX網絡編程卷1:套接字聯網API》第2章 傳輸層:TCP、UDP和SCTP


2.1 傳輸層的核心作用與協議選型

傳輸層是網絡協議棧中承上啟下的核心層,直接決定應用的通信質量。其主要職責包括:

  • 端到端通信:屏蔽底層網絡細節,為應用提供邏輯通信通道;
  • 可靠性保障(TCP/SCTP):通過確認、重傳、擁塞控制等機制確保數據完整;
  • 多路復用與分用:通過端口號區分不同應用進程;
  • 流量控制:防止發送方壓垮接收方緩沖區。

協議選型黃金法則

  • TCP:需要可靠傳輸、數據順序性的場景(如文件傳輸、HTTP);
  • UDP:低延遲、容忍丟包、強調實時性的場景(如視頻會議、DNS查詢);
  • SCTP:多宿主容災、多流并發、消息邊界保留的場景(如5G核心網信令)。

2.2 TCP協議深度解析
2.2.1 TCP頭部結構與字段詳解

TCP頭部由20字節固定部分和可變選項組成,其結構如下(圖2-1):

 0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Sequence Number                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Acknowledgment Number                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Data |           |U|A|P|R|S|F|                               |
| Offset| Reserved  |R|C|S|S|Y|I|            Window             |
|       |           |G|K|H|T|N|N|                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Checksum            |         Urgent Pointer        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options (可變長度)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

關鍵字段解析

  • 序列號(Sequence Number):32位,標識數據段的第一個字節的編號;
  • 確認號(Acknowledgment Number):32位,期望收到的下一個字節的編號;
  • 窗口大小(Window):16位,接收方的可用緩沖區大小(流量控制核心);
  • 標志位
    • SYN:發起連接;
    • ACK:確認數據;
    • FIN:關閉連接;
    • RST:強制重置連接;
    • URG:緊急指針有效。
2.2.2 TCP連接管理:三次握手與四次揮手
  1. 三次握手建立連接(圖2-2):

    客戶端                            服務器|-------- SYN(seq=100) ------->||<-- SYN+ACK(seq=300, ack=101)--||-------- ACK(ack=301) -------->|
    
    • 序列號隨機化:防止歷史報文干擾(RFC 6528);
    • 半連接隊列:服務器在SYN_RCVD狀態維護未完成握手隊列。
  2. 四次揮手終止連接(圖2-3):

    主動關閉方                        被動關閉方|-------- FIN(seq=200) ------->||<-------- ACK(ack=201)--------||<-------- FIN(seq=500)--------||-------- ACK(ack=501) ------->|
    
    • TIME_WAIT狀態:主動關閉方等待2MSL(最大報文段生存時間),防止舊報文干擾新連接;
    • 孤兒連接:被動關閉方在CLOSE_WAIT狀態需及時關閉。

代碼示例:TCP服務器監聽連接

int listenfd = Socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ); // LISTENQ通常設置為SOMAXCONN
2.2.3 流量控制與擁塞控制
  1. 流量控制

    • 滑動窗口協議:接收方通過窗口字段通告可用緩沖區大小;
    • 零窗口探測:發送方定時發送1字節數據,避免死鎖。
  2. 擁塞控制

    • 慢啟動(Slow Start):窗口指數增長至閾值;
    • 擁塞避免(Congestion Avoidance):窗口線性增長;
    • 快速重傳(Fast Retransmit):收到3個重復ACK立即重傳;
    • 快速恢復(Fast Recovery):避免窗口重置為1。

內核參數調優(Linux示例):

# 調整接收緩沖區大小
sysctl -w net.ipv4.tcp_rmem='4096 87380 6291456'
# 啟用BBR擁塞控制算法
sysctl -w net.ipv4.tcp_congestion_control=bbr

2.3 UDP協議特性與編程實踐
2.3.1 UDP頭部結構

UDP頭部僅8字節(圖2-4):

 0      7 8     15 16    23 24    31  
+--------+--------+--------+--------+
|    源端口      |    目的端口       |
+--------+--------+--------+--------+
|      長度      |     校驗和       |
+--------+--------+--------+--------+
|           數據(若有)            |
+-----------------------------------+

核心特點

  • 無連接:無需握手,直接發送數據報;
  • 無可靠性保證:不重傳、不排序、不擁塞控制;
  • 數據報邊界保留:每個sendto對應一個完整報文。
2.3.2 UDP編程核心挑戰
  1. 報文丟失處理:需應用層實現超時重傳與確認機制;
  2. 亂序處理:為每個報文添加序列號;
  3. MTU限制:避免IP分片(通常限制為1472字節,1500-20-8)。

代碼示例:UDP時間服務器

int sockfd = Socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);Bind(sockfd, (SA*)&servaddr, sizeof(servaddr));char buff[MAXLINE];
struct sockaddr_in cliaddr;
socklen_t len = sizeof(cliaddr);for (;;) {int n = Recvfrom(sockfd, buff, MAXLINE, 0, (SA*)&cliaddr, &len);time_t ticks = time(NULL);snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));Sendto(sockfd, buff, strlen(buff), 0, (SA*)&cliaddr, len);
}
2.3.3 UDP的適用場景
  • 實時音視頻傳輸(如WebRTC):容忍丟包,但要求低延遲;
  • DNS查詢:單次請求響應,無連接開銷;
  • 廣播/多播通信:向多個接收者高效發送數據。

2.4 SCTP協議:下一代傳輸協議
2.4.1 SCTP核心特性
  • 多宿主(Multi-homing):一個端點可綁定多個IP地址,提升容災能力;
  • 多流(Multi-streaming):獨立的數據流避免隊頭阻塞;
  • 消息邊界保留:基于消息而非字節流;
  • 四次握手關聯建立:抵御SYN洪泛攻擊。
2.4.2 SCTP關聯建立與關閉
  1. 四次握手建立關聯(圖2-5):

    客戶端                            服務器|-------- INIT(隨機數A) ------->||<------- INIT-ACK(隨機數B)-----||------- COOKIE-ECHO(加密Cookie)>||<------- COOKIE-ACK ------------|
    
    • 狀態Cookie:服務器不保存狀態,防止DDoS攻擊。
  2. 優雅關閉關聯

    主動關閉方                        被動關閉方|-------- SHUTDOWN -------------->|<------- SHUTDOWN-ACK -----------||<------- SHUTDOWN-COMPLETE ------|
    

代碼示例:SCTP單流服務器

int listenfd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);struct sockaddr_in servaddr;
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(9999);Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));struct sctp_event_subscribe events;
bzero(&events, sizeof(events));
events.sctp_data_io_event = 1; // 啟用數據IO事件
Setsockopt(listenfd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(events));Listen(listenfd, LISTENQ);

2.5 協議對比與選型指南
特性TCPUDPSCTP
連接方式面向連接無連接面向關聯
可靠性可靠不可靠可靠
數據邊界
傳輸模式字節流數據報消息流
多路徑支持是(多宿主)
典型應用HTTP、FTP、SSHDNS、QUIC、實時音視頻5G信令、VoLTE

選型建議

  • 嵌入式設備:優先UDP(資源占用低),復雜場景用TCP;
  • 高可用服務:SCTP多宿主特性提升容災能力;
  • 實時系統:UDP+應用層協議(如RTSP)。

2.6 實戰:多協議時間服務器
2.6.1 TCP時間服務器

(代碼參考第1章示例)

2.6.2 UDP時間服務器
#include "unp.h"
#include <time.h>int main() {int sockfd = Socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in servaddr;bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(9999);Bind(sockfd, (SA*)&servaddr, sizeof(servaddr));char buff[MAXLINE];struct sockaddr_in cliaddr;socklen_t len;for (;;) {len = sizeof(cliaddr);Recvfrom(sockfd, buff, MAXLINE, 0, (SA*)&cliaddr, &len);time_t ticks = time(NULL);snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));Sendto(sockfd, buff, strlen(buff), 0, (SA*)&cliaddr, len);}
}
2.6.3 SCTP時間服務器
#include "unp.h"
#include <netinet/sctp.h>
#include <time.h>int main() {int sockfd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);struct sockaddr_in servaddr;bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(9999);Bind(sockfd, (SA*)&servaddr, sizeof(servaddr));struct sctp_event_subscribe events;bzero(&events, sizeof(events));events.sctp_data_io_event = 1;Setsockopt(sockfd, IPPROTO_SCTP, SCTP_EVENTS, &events, sizeof(events));Listen(sockfd, LISTENQ);struct sockaddr_in cliaddr;char buff[MAXLINE];for (;;) {socklen_t len = sizeof(cliaddr);int connfd = Accept(sockfd, (SA*)&cliaddr, &len);time_t ticks = time(NULL);snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));Write(connfd, buff, strlen(buff));Close(connfd);}
}

2.7 調試工具與性能分析
2.7.1 Wireshark抓包分析
  • TCP流追蹤:右鍵報文 → Follow → TCP Stream;
  • UDP過濾udp.port == 9999
  • SCTP關聯分析sctp.association_id
2.7.2 網絡性能測試
  • TCP吞吐量測試
    # 服務器端
    iperf3 -s
    # 客戶端
    iperf3 -c 192.168.1.100 -t 30
    
  • UDP丟包率測試
    iperf3 -u -c 192.168.1.100 -b 100M -t 20
    

2.8 本章小結與進階習題

小結:本章深入解析了TCP、UDP、SCTP的協議機制與編程實踐,通過對比分析指導協議選型,為復雜網絡應用開發奠定基礎。

習題

  1. 實現SCTP多流客戶端,驗證不同流的獨立性;
  2. 使用UDP實現可靠文件傳輸協議(含ACK與超時重傳);
  3. 分析TCP BBR與CUBIC擁塞控制算法的差異,編寫測試報告。

付費用戶專屬資源

  • 完整多協議時間服務器代碼工程;
  • Wireshark抓包文件(標注關鍵字段);
  • 擴展閱讀:《SCTP在5G核心網中的實踐》。

通過本章學習,讀者將掌握傳輸層協議的核心原理,并能夠根據場景需求選擇最佳協議,設計高效可靠的網絡應用。

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

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

相關文章

Eclipse 創建 Java 類

Eclipse 創建 Java 類 引言 Eclipse 是一款功能強大的集成開發環境(IDE),被廣泛用于 Java 開發。本文將詳細介紹如何在 Eclipse 中創建 Java 類,包括配置開發環境、創建新項目、添加類以及編寫類代碼等步驟。 配置 Eclipse 開發環境 1. 安裝 Eclipse 首先,您需要在您…

汽車安全確認等級-中國等保

1、概念解析 網絡安全保證等級&#xff08;Cybersecurity Assurance Level&#xff09;通常指在不同標準或框架下&#xff0c;根據系統或數據的敏感性、重要性以及潛在風險劃分的等級&#xff0c;用于指導組織采取相應的安全防護措施。以下是幾個常見的網絡安全保證等級體系及…

藍橋杯練習day2:執行操作后的變化量

題意 存在一種僅支持 4 種操作和 1 個變量 X 的編程語言&#xff1a; X 和 X 使變量 X 的值 加 1 –X 和 X-- 使變量 X 的值 減 1 最初&#xff0c;X 的值是 0 給你一個字符串數組 operations &#xff0c;這是由操作組成的一個列表&#xff0c;返回執行所有操作后&#xff…

【機器學習chp14 — 2】生成式模型—變分自編碼器VAE(超詳細分析,易于理解,推導嚴謹,一文就夠了)

目錄 二、變分自編碼器 VAE 1、自編碼器 AE &#xff08;1&#xff09;自編碼器的基本結構與目標 1.1 編碼器-解碼器結構 1.2 目標函數&#xff1a;重構誤差最小化 &#xff08;2&#xff09;自編碼器與 PCA 的對比 2.1 PCA 與線性降維 2.2 非線性映射的優勢 &#xf…

Linux 一步部署DHCP服務

#!/bin/bash #腳本作者和日期 #author: PEI #date: 20250319 #檢查root權限 if [ "$USER" ! "root" ]; then echo "錯誤&#xff1a;非root用戶&#xff0c;權限不足&#xff01;" exit 0 fi #防火墻與高級權限 systemctl stop firewa…

【RHCE】awk文本處理

目錄 基本介紹 命令格式 awk基本使用 命令行讀取程序腳本 數據字段變量 腳本中使用多個命令 文件中讀取程序 處理數據前運行腳本&#xff08;BEGIN&#xff09; 處理數據后運行腳本&#xff08;END&#xff09; awk高級用法 變量 內建變量 自定義變量 數組 定義…

Vue3 核心特性解析:Suspense 與 Teleport 原理深度剖析

Vue3 核心特性解析&#xff1a;Suspense 與 Teleport 原理深度剖析 一、Teleport&#xff1a;突破組件層級的時空傳送 1.1 實現原理圖解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

工業界處理 Atomic 操作的優化策略

在產業界&#xff0c;處理 atomic 操作 時&#xff0c;通常會根據具體情境選擇不同的策略&#xff0c;主要取決于以下三個因素&#xff1a; 內存一致性需求&#xff1a;是否需要確保 所有線程&#xff08;threads&#xff09; 都能看到最新的變量值。性能需求&#xff1a;是否…

Python功能完美的寶庫——內置的強大“武器庫”builtins

builtins模塊包含了Python大量的內置對象&#xff08;函數、異常和類型等&#xff09;&#xff0c;她是Python的內置武器庫&#xff0c;堪稱功能完美的寶庫。 筆記模板由python腳本于2025-03-19 08:16:27創建&#xff0c;本篇筆記適合喜歡探究python的coder翻閱。 【學習的細節…

三分鐘掌握視頻分辨率修改 | 在 Rust 中優雅地使用 FFmpeg

前言 在視頻處理領域&#xff0c;調整視頻分辨率是一個繞不過去的需求。比如&#xff0c;你可能需要將一段視頻適配到手機、平板或大屏電視上&#xff0c;或者為了節省存儲空間和網絡帶寬而壓縮視頻尺寸。然而&#xff0c;傳統的FFmpeg命令行工具雖然功能強大&#xff0c;但復…

PyTorch 深度學習實戰(17):Asynchronous Advantage Actor-Critic (A3C) 算法與并行訓練

在上一篇文章中&#xff0c;我們深入探討了 Soft Actor-Critic (SAC) 算法及其在平衡探索與利用方面的優勢。本文將介紹強化學習領域的重要里程碑——Asynchronous Advantage Actor-Critic (A3C) 算法&#xff0c;并展示如何利用 PyTorch 實現并行化訓練來加速學習過程。 一、A…

【深度學習】多目標融合算法(五):定制門控網絡CGC(Customized Gate Control)

目錄 一、引言 二、CGC&#xff08;Customized Gate Control&#xff0c;定制門控網絡&#xff09; 2.1 技術原理 2.2 技術優缺點 2.3 業務代碼實踐 2.3.1 業務場景與建模 2.3.2 模型代碼實現 2.3.3 模型訓練與推理測試 2.3.4 打印模型結構 三、總結 一、引言 上一…

在線pdf處理網站合集

1、PDF24 Tools&#xff1a;https://tools.pdf24.org/zh/ 2、PDF派&#xff1a;https://www.pdfpai.com/ 3、ALL TO ALL&#xff1a;https://www.alltoall.net/ 4、CleverPDF&#xff1a;https://www.cleverpdf.com/cn 5、Doc Small&#xff1a;https://docsmall.com/ 6、Aconv…

網絡編程-實現客戶端通信

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/select.h>#define MAX_CLIENTS 2 // 最大客戶端連接數 #define BUFFER_SI…

力扣100二刷——圖論、回溯

第二次刷題不在idea寫代碼&#xff0c;而是直接在leetcode網站上寫&#xff0c;“逼”自己掌握常用的函數。 標志掌握程度解釋辦法?Fully 完全掌握看到題目就有思路&#xff0c;編程也很流利??Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答???Sl…

【大模型實戰篇】多模態推理模型Skywork-R1V

1. 背景介紹 近期昆侖萬維開源的Skywork R1V模型&#xff0c;是基于InternViT-6B-448px-V2_5以及deepseek-ai/DeepSeek-R1-Distill-Qwen-32B 通過強化學習得到。當然語言模型也可以切換成QwQ-32B。因此該模型最終的參數量大小為38B。 該模型具備多模態推理能力&#xf…

識別并脫敏上傳到deepseek/chatgpt的文本文件中的護照信息

本文將介紹一種簡單高效的方法解決用戶在上傳文件到DeepSeek、ChatGPT&#xff0c;文心一言&#xff0c;AI等大語言模型平臺過程中的護照號識別和脫敏問題。 DeepSeek、ChatGPT&#xff0c;Qwen&#xff0c;Claude等AI平臺工具快速的被接受和使用&#xff0c;用戶每天上傳的文…

數據驅動進化:AI Agent如何重構手機交互范式?

如果說AIGC拉開了內容生成的序幕&#xff0c;那么AI Agent則標志著AI從“工具”向“助手”的跨越式進化。它不再是簡單的問答機器&#xff0c;而是一個能夠感知環境、規劃任務并自主執行的智能體&#xff0c;更像是虛擬世界中的“全能員工”。 正如行業所熱議的&#xff1a;“大…

【AI News | 20250319】每日AI進展

AI Repos 1、XianyuAutoAgent 實現了 24 小時自動化值守的 AI 智能客服系統&#xff0c;支持多專家協同決策、智能議價和上下文感知對話&#xff0c;讓我們店鋪管理更輕松。主要功能&#xff1a; 智能對話引擎&#xff0c;支持上下文感知和專家路由階梯降價策略&#xff0c;自…

nginx中間件部署

中間件部署流程 ~高級權限賬戶安裝必要的插件 -> 普通權限賬戶安裝所需要的服務 -> 高級權限賬戶開啟并設置開機自啟所安裝的服務 -> iptables放行所需要的服務 普通權限賬戶安裝NGINX中間件 1、擁有高級權限的賬戶安裝必要的插件 sudo yum install -y gcc-c make…