网络传输的过程

一次网络传输是数据从发送端应用进程到接收端应用进程的完整旅程,跨越网络协议栈的各个层次。以一次 HTTP 请求为例:

flowchart TD APP["应用层: HTTP 请求\n(TLS 加密可选)"] TRAN["传输层: TCP/UDP\n(端口寻址, 分段, 可靠性)"] NET["网络层: IP\n(主机寻址, 路由)"] LINK["链路层: 以太网/WiFi\n(帧封装, MAC 地址)"] PHYS["物理层: 光纤/网线/电波"] APP --> TRAN --> NET --> LINK --> PHYS

分层模型

层次代表协议职责
应用层HTTP/HTTPS、DNS、SMTP为应用提供网络服务
传输层TCP、UDP端到端进程通信、端口管理、流量/拥塞控制、差错检测
网络层IP、ICMP主机寻址、分组转发与路由
链路层以太网、Wi-Fi帧封装、MAC 寻址
物理层比特级物理传输

一次 HTTP 请求的完整过程

  1. DNS 解析:应用层发起域名解析,将域名转换为 IP 地址(走 UDP 53 端口查询)。
  2. TCP 三次握手:建立可靠的传输连接,同步双方的初始序列号。
    sequenceDiagram participant C as Client participant S as Server C->>S: SYN (seq=x) S->>C: SYN+ACK (seq=y, ack=x+1) C->>S: ACK (ack=y+1)
  3. TLS 握手(HTTPS):协商密钥,建立加密通道。
  4. HTTP 请求发送:应用数据被交给传输层。
  5. 传输层处理
    • TCP 将数据流按 MSS 分段,加上序列号、校验和,交给网络层;通过确认与重传保证可靠性。
    • UDP 不加可靠性机制,只做简单封装,交由网络层尽力传输。
  6. 网络层处理:IP 加上源/目的 IP 地址,路由到目标网络。
  7. 链路层封装:以太网帧加上 MAC 地址,通过物理介质传输,沿途经过交换机(链路层转发)、路由器(网络层转发)。
  8. 接收端逐层解封装,最终由应用层处理 HTTP 响应。

TCP vs UDP

特性TCPUDP
连接面向连接(三次握手)无连接
可靠性可靠:确认、重传、排序尽力而为,不保证送达
流量/拥塞控制
传输单位字节流(按 MSS 分段)数据报(应用自己分片)
首部开销20~60 字节8 字节
典型应用HTTP、FTP、SSH、SMTPDNS、音视频通话、游戏、QUIC(基于UDP)

连接建立与复用

每次连接建立都要付出握手延迟的代价,优化方向一是减少握手往返,二是尽量复用已有连接

握手延迟的构成

减少握手往返

连接复用

技术原理效果
HTTP keep-alive同一 TCP 连接上串行发送多个 HTTP 请求,避免反复握手避免握手开销,但仍有队头阻塞
连接池客户端维护一组空闲连接循环复用消除建连延迟,控制并发
HTTP/2 多路复用单条 TCP 连接上并行交错传输多个流(frame 级交错)复用连接 + 并行请求
HTTP/3 (QUIC)单个 QUIC 连接内多路复用多个流,无队头阻塞进一步降低延迟

实践要点

MTU 与 MSS

MTU(Maximum Transmission Unit):链路层一次能承载的最大数据单元,即 IP 报文的最大长度。常见值:以太网 1500 字节、PPP 1492、巨型帧(Jumbo Frame)9000 字节。

MSS(Maximum Segment Size):TCP 一次能发送的最大数据段,由 MTU 推导:

MSS = MTU - IP首部(20) - TCP首部(20)
    = 1500 - 40 = 1460 字节(以太网典型值)

为什么 MTU 重要

PMTUD(Path MTU Discovery)

巨型帧

TCP 可靠性机制与选项

TCP 的可靠性由一系列机制共同保证,合理的选项配置直接影响传输效率。

核心机制

Nagle 与延迟权衡

调优参数(sysctl)

# 超时重传相关
net.ipv4.tcp_syn_retries     # SYN 重传次数
net.ipv4.tcp_synack_retries
net.ipv4.tcp_retries1/2      # 放弃连接前的重传次数

# 可靠性选项
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1

# 延迟 ACK(0 关闭)
net.ipv4.tcp_ack_delay = 0

带宽-延迟积 (BDP)

BDP(Bandwidth-Delay Product)= 带宽 × RTT,表示"管道中能容纳的数据量"。

BDP = 带宽 × 往返时延
例: 1 Gbps × 100 ms = 12.5 MB(即至少需要 12.5MB 的在途数据才能跑满带宽)

为什么 BDP 重要

实践要点

# 估算某个连接的 BDP(需要多大缓冲)
# 例如 RTT=100ms, 带宽=1Gbps → 需要 12.5MB 缓冲

# 适当增大 socket 缓冲区(默认往往偏小)
sysctl -w net.core.rmem_max=134217728   # 128MB
sysctl -w net.core.wmem_max=134217728
sysctl -w net.ipv4.tcp_rmem='4096 87380 134217728'
sysctl -w net.ipv4.tcp_wmem='4096 65536 134217728'

# 查看实际吞吐: iperf3 或 bmon
iperf3 -c <server> -R -t 30

TCP 拥塞控制

网络拥塞会导致丢包和延迟增大。拥塞控制的目标是在不压垮网络的前提下尽量利用带宽,通过调节拥塞窗口 cwnd(发送端允许在途的数据量)实现。

核心机制

cwnd 决定发送速率;有效吞吐 ≈ cwnd / RTT
在途数据 = min(cwnd, 接收端窗口 rwnd, 网络容量)
flowchart TD START["连接建立"] --> SS["慢启动: cwnd 指数增长"] SS -->|"cwnd >= ssthresh"| CA["拥塞避免: 线性增长"] CA -->|"丢包/超时"| DROP["降低 cwnd 与 ssthresh"] DROP --> SS SS -->|"丢包/超时"| DROP

主要算法

算法特点适用场景
Tahoe丢包即重置为 1,过于激进早期参考实现
Reno快速重传+快速恢复,乘法减半经典实现,对随机丢包敏感
NewReno改进多丢包处理长肥管道改进
CUBIC基于时间三次函数探测,带宽增长更快、更公平Linux 默认算法,高带宽高延迟网络
BBR基于带宽与延迟测量而非丢包,不把丢包当拥塞信号高吞吐长肥网络,Wi-Fi/蜂窝等丢包率高的链路

Ubuntu 安装与配置 BBR 实战

BBR 从 Linux 4.9 起合入内核,Ubuntu 16.04 之后的内核均自带,一般无需编译内核,但 BBR 常以模块形式编译(CONFIG_TCP_CONG_BBR=m),首次使用前需要加载。以下以 Ubuntu 为例:

# 1. 检查内核版本(需 >= 4.9)
uname -r

# 2. 加载 tcp_bbr 模块(常见坑:不加载则 bbr 不可用)
sudo modprobe tcp_bbr

# 3. 验证已注册的拥塞控制算法(出现 bbr 即成功)
sysctl net.ipv4.tcp_available_congestion_control

# 4. 启用 BBR
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

# 5. 验证生效
sysctl net.ipv4.tcp_congestion_control   # 输出 bbr

持久化配置(重启后仍生效),写入 /etc/sysctl.d/99-bbr.conf

net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

然后 sudo sysctl --system 加载。其中 default_qdisc = fq(fq fair queueing)是 BBR 官方推荐配套的排队规则——BBR 依靠 pacing 平滑发包,fq 能提供每流带宽估算与 pacing 支持,二者配合效果最佳。

故障排查:若步骤 4 报 invalid argument,通常有两种原因——① 模块未加载(回到步骤 2);② 内核太老不支持(需升级内核)。用 sysctl net.ipv4.tcp_available_congestion_control 查看当前内核实际支持的算法列表即可定位。

相关参数调优(sysctl)

# 调整 socket 缓冲区(影响 rwnd 上限,配合窗口缩放)
net.core.rmem_max
net.core.wmem_max
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem

# 初始拥塞窗口(部分发行版通过 ip route 设置 initcwnd)
ip route change default via <gw> dev <dev> initcwnd 20

# 启用 ECN
net.ipv4.tcp_ecn = 1

QUIC 协议

QUIC 是 Google 设计、IETF 标准化的新一代传输协议,基于 UDP 实现,是 HTTP/3 的底层传输协议,旨在解决 TCP+TLS 的固有问题。

解决的核心问题

  1. 连接建立延迟
    • TCP+TLS 1.3 最快需要 1-RTT(握手)+ 1-RTT(TLS)= 1~2 RTT
    • QUIC 首次连接 1-RTT,复用连接 0-RTT(客户端可立即发送数据)。
  2. 队头阻塞(Head-of-Line Blocking)
    • HTTP/2 在单个 TCP 连接上多路复用多个流,但 TCP 是字节流——一个包丢失会导致后续所有流的数据阻塞等待重传。
    • QUIC 每个流独立交付,丢包只影响该流,其他流不受影响。
  3. 传输层与加密耦合
    • TCP 由内核实现,无法快速迭代;QUIC 在用户态实现,内置 TLS 1.3,可像应用一样升级部署。
  4. 连接迁移
    • TCP 以四元组(源/目的 IP+端口)标识连接,切换网络(Wi-Fi→4G)会导致连接断开重建。
    • QUIC 使用 64 位连接 ID 标识连接,IP 变化不影响连接,可无缝迁移。

QUIC 结构

flowchart TD HTTP3["HTTP/3 语义"] QCRYPTO["QUIC 加密层 (TLS 1.3)"] QTRAN["QUIC 传输层\n(多路复用流, 可靠性, 拥塞控制)"] UDP["UDP"] QCRYPTO --> QTRAN --> UDP HTTP3 --> QCRYPTO

QUIC vs TCP+TLS

维度TCP + TLSQUIC
底层TCP(内核态)UDP(用户态)
握手1~2 RTT0~1 RTT
队头阻塞有(字节流)无(多流独立)
连接迁移不支持(IP 变即断)支持(连接 ID)
加密可选、后加内置、强制
迭代部署慢(内核升级)快(用户态升级)

实践与注意

gRPC / HTTP/2 传输

gRPC 是 Google 开源的 RPC 框架,基于 HTTP/2,广泛用于微服务内部通信。它不是一个新传输协议,但把 HTTP/2 的传输特性用到了极致,其效率机制值得单独讨论。

HTTP/2 的传输特性

流控窗口与 BDP 的关系

HTTP/2 的流控窗口与 TCP 的 rwnd 类似,都限制"在途数据量"。默认 64KB 的初始窗口在长肥管道(高 BDP)下会成为吞吐瓶颈

有效吞吐 ≈ min(HTTP/2 流控窗口, TCP cwnd/rwnd) / RTT

连接管理(gRPC 实践)

机制作用对应传输优化点
连接池复用已建立的 HTTP/2 连接避免反复握手(对应「连接建立与复用」)
预连接 / 预热启动时提前建立连接消除首个请求的握手延迟
Keepalive周期性发送 ping 保持连接活跃防止中间设备(LB/防火墙)超时回收空闲连接
Backoff 重试指数退避 + 抖动控制重连频率避免重连风暴,节省资源

效率考量

与 REST 对比

维度REST/HTTP/1.1gRPC/HTTP/2
数据格式JSON(文本、冗余)Protobuf(二进制、紧凑)
连接利用短连接或串行复用多路复用、帧级并行
头部开销每请求完整重复HPACK 压缩,只传增量
流式通信不支持(可轮询)支持 unary/server-stream/bidi-stream

数据路径优化(内核与网卡)

传输效率不仅取决于协议,还取决于数据在内核-网卡路径上的搬运方式。减少拷贝、合并报文、并行队列都能显著提升吞吐。

零拷贝

传统路径:应用缓冲 → 内核缓冲 → 网卡,数据被多次复制。零拷贝技术让数据尽量少地被复制:

技术原理适用
sendfile()内核直接在文件与 socket 间传输,不经用户空间静态文件服务(Nginx)
splice()通过管道在内核中移动数据通用内核间搬运
mmap + send用户态零拷贝写入应用自定义路径
MSG_ZEROCOPY允许用户态缓冲直接交给网卡,避免拷贝高吞吐发送场景

网卡卸载(Offload)

中断与队列调优

# 查看网卡队列数与中断绑定
lspci | grep -i ethernet
cat /proc/interrupts | grep eth
# 查看/调整 ring buffer
ethtool -g eth0
ethtool -G eth0 rx 4096 tx 4096
# 合并中断(coalesce),降低中断频率换取吞吐
ethtool -C eth0 rx-usecs 50

高性能数据面

应用层与 HTTP 层优化

传输效率最终由应用层决定能压榨多少。数据体积与传输次数是两大抓手。

数据压缩

HTTP 缓存

增量同步与协议精简

网络架构层面

端到端效率还受网络路径与部署方式影响。

CDN 与 Anycast

链路聚合与多路径

网络测量与诊断

总结

网络传输效率的优化贯穿协议栈各层,可从"减少延迟、降低开销、利用满带宽"三个方向入手:

参考