试图找出确切的 TCP 开销成本

网络工程 通讯协议 带宽
2021-07-15 17:36:56

对应这个话题:

https://stackoverflow.com/questions/3613989/what-of-traffic-is-network-overhead-on-top-of-http-s-requests

最大段大小(不包括 TCP 或 IP 标头)通常在层之间协商为 MTU 的大小减去标头大小。对于以太网 MTU 通常配置为 1500 字节。TCP 报头是 160 位,或 20 字节。IPv4 报头的固定部分是 160 位,也就是 20 字节。... . 因此:

  • 用于基于 TCP/IPv4 的 HTTP

开销 = TCP + IP = 40 字节

有效载荷 = 1500 - 40 = 1460 字节

开销 % = 2% (40 * 100 / 1460)

这是在 TCP 模式下使用默认 Debian 发行版的 100 Mbit 和 1Gbit iperf 结果:

[  5] local 10.0.51.1 port 5001 connected with 10.0.51.20 port 45009
[  5]  0.0-10.0 sec   112 MBytes  94.1 Mbits/sec
[  4] local 10.0.51.1 port 5001 connected with 10.0.51.94 port 35065
[  4]  0.0-10.0 sec  1.10 GBytes   941 Mbits/sec

通过将 MTU 提高到 9000,我可以将其降低到近 2% 的开销:

[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec  1.14 GBytes   982 Mbits/sec

但它不应该更少吗?

overhead = TCP + IP = 40 bytes
payload = 9000 - 40 = 8960 bytes
overhead % = 0.4% (40 * 100 / 8960)

为什么实际的“带宽损失”明显大于理论值?如果公式缺少有价值的东西?

2个回答

以太网数据包 1.5k

1500 - 20 B (IPv4) - 20 B (TCP+校验和) = 1460 B DATA (和 40 B 开销)

添加 40 B + 14 B(以太网)+ 4 B(FCS)+ 12 B(帧间间隙)+ 8 B(前导码)= 78 B 开销

78 / 1460 * 100 = 5.34% 开销

1460 / ( 1460 + 78) * 100 = 94.93%吞吐量/货物吞吐量

1,000,000,000(1Gbit) * 94.93% = 949Mbit/s (0.949Gbit/s)

您测量的 941Mbit/s 给出了 (949 - 941) / 949 * 100 = 0.84%理论和实际之间的误差


巨型数据包 9k - 理论最大值

(9000-40) / ( 9000 - 40 + 78 ) *100 = 99.14%  (Overhead 0.86%)  

1,000,000,000(1Gbit) * 99.14% = 991Mbit/s (0.99Gbit/s)

开销通常根据数据大小计算这样,该数字与效率值相匹配。

对于以太网上的 TCP over IPv4,您有(没有标头选项):

  • L1 开销 - 前导码,IPG:8+12 = 20
  • L2 开销 - 以太网报头,FCS = 18
  • L3 开销 - IPv4 标头 = 20
  • L4 开销 - TCP 标头 = 20

L3最大数据包大小 1500导致总 L1 数据大小为 1500+18+20 = 1538 字节,最大 L4 有效载荷大小为 1500-20-20 = 1460 字节

  • 开销:78/1538 *100% = 5.07%
  • 效率:1460/1538 *100% = 94.93%

使用9k 巨型帧(非 802.3),您将获得

  • 开销:78/9038 *100% = .86%
  • 效率:8960/9038 *100% = 99.14%

这些是理论上的最佳情况值。在现实生活中,您还会有一些硬件和操作系统开销会略微影响效率值。卸载和多核中断控制等功能可以减少处理开销并使您更接近理论数据(与更高速度的 NIC 更相关)。正如 Pieter 已经指出的那样,您测量的那些看起来非常逼真。