| 普通小包 | < MSS
| 无关
| 全部
| 空 | CPU 缓存亲和性 (Cache Locality) 对于几百字节的数据,memcpy 的开销远小于分配物理页 (struct page) 和建立 DMA 映射的开销。 |
| 标准大包 | ≈ MTU
| 支持 | 全部
| 空 | 内存分配效率 内核 kmalloc 分配一个 2KB 的 Slab 非常快。为了 1.4KB 的负载去动用 frags 机制属于“杀鸡用牛刀”。 |
TSO / GSO
| > MTU
| 支持 | 仅协议头
| 负载 (Payload)
| 避免拷贝 (Avoid Copy) 数据量太大,拷贝到线性区太耗 CPU。内核只构建头部,剩下的数据直接以 Page 形式挂载,让网卡 TSO 引擎去切分。 |
TSO / GSO
| > MTU | 不支持
| 全部
| 空 | 硬件强迫 (Hardware Constraint) 网卡不支持分散读取,内核被迫申请 huge contiguous memory (Order > 0)。风险: 容易因内存碎片导致申请失败(OOM)。 |
零拷贝
| 任意大小 (sendfile, splice, MSG_ZEROCOPY) | 必须支持 | 仅协议头 | 负载 (Payload)
| 极致性能 用户显式要求“零拷贝”。内核直接引用文件系统在内存中的 Page Cache 页,绝对不执行 CPU 数据拷贝。 |
接收方向
| 高性能接收
| N/A | 仅协议头 | 负载
| CPU 预取优化 网卡硬件把头剥离出来让 CPU 分析,数据单独放。防止 CPU 在分析协议头时,Cache 被无关的数据塞满。 |
| RAW Socket | 用户构造包 | 无关 | 全部 | 空 | 实现简单 用户态 buffer 通常是通过 copy_from_user 一次性拷入内核申请的线性区。 |