空 UDP 数据报的大小是多少?那么空 TCP 数据包呢?
我只能找到有关 MTU 的信息,但我想知道这些信息的“基本”大小是多少,以便估计其上的协议的带宽消耗。
TCP:
以太网帧的大小 - 24 字节
IPv4 标头的大小(无任何选项)- 20 字节
TCP 标头的大小(无任何选项)- 20 字节
携带带有空 TCP 段的 IP 数据包的以太网帧的总大小 - 24 + 20 + 20 = 64 字节
UDP:
以太网帧的大小 - 24 字节
IPv4 标头的大小(无任何选项)- 20 字节
UDP 标头大小 - 8 字节
携带 IP 数据包和空 UDP 数据报的以太网帧的总大小 - 24 + 20 + 8 = 52 字节
编辑:上面错误地将以太网帧字节指定为 24B。相反,它是 18(或 VLAN 标记以太网为 22)。 8B 前导码不是最小 64B 帧的一部分。所以最小的IPv4+TCP数据包是18+20+20=58字节,最小的IPv4+UDP数据包是18+20+8=46字节。在这些情况下,需要以太网填充来填充高达 64B 的帧(TCP 示例为 6B 填充,UDP 示例为 18B)
Himanshus 的回答是完全正确的。
查看以太网帧的结构时可能会产生误导[请参阅进一步阅读],如果没有有效负载,以太网帧的最小大小将为 18 字节:Dst Mac(6) + Src Mac(6) + Length ( 2) + Fcs(4),添加 IPv4 (20) 和 TCP (20) 的最小大小,总共为 58 个字节。
还没有提到的是,以太网帧的最小有效负载是 46 字节,因此 IPv4 和 TCP 的 20+20 字节是不够的有效负载!这意味着必须填充 6 个字节,这就是总共 64 个字节的来源。
18(最小以太网“标头”字段)+ 6(填充)+ 20(IPv4)+ 20(TCP)= 64 字节
希望这能让事情变得更清楚。
进一步阅读:
如果您打算计算带宽消耗并将其与网络的最大速率(例如 1Gb/s 或 10Gb/s)相关联,则有必要(如 Useless 所指出的)在层添加 以太网帧开销1为Felix等人计算出的数字,即
即每个数据包总共消耗了 20 个字节。
如果你正在寻找软件的视角(毕竟,Stack Overflow 是针对软件问题的),那么框架不包括 FCS、填充和帧符号开销,答案是 54:
这种情况发生在 TCP ack 数据包的情况下,因为 ack 数据包没有 L4 选项。
至于硬件和中间路由器通常对主机软件隐藏的FCS、填充、成帧符号、隧道等......软件实际上只关心额外的开销,因为它们对吞吐量的影响。正如其他答案所指出的,FCS 在帧中添加了 4 个字节,使其成为 58 个字节的帧。因此,需要 6 字节的填充才能达到 64 字节的最小帧大小。以太网控制器添加了额外的 20 字节帧符号,这意味着数据包在线路上至少占用 84 字节时间(或 672 比特时间)。例如,1Gbps 链路可以每 672ns 发送一个数据包,相当于大约 1.5MHz 的最大数据包速率。此外,中间路由器可以添加各种标签和隧道标头,进一步增加网络内部点(尤其是公共网络骨干网)的最小 TCP 数据包大小。
但是,考虑到软件可能与其他软件共享带宽,可以合理地假设这个问题不是询问总线路带宽,而是询问主机软件需要生成多少字节。主机依靠以太网控制器(例如这个 10Mbps 一个 或这个 100Gbps 一个)来添加 FCS、填充和帧符号,并依靠路由器来添加标签和隧道(虚拟化卸载控制器,例如在第二个链路中,有一个集成的隧道引擎,旧的控制器依赖于单独的路由器盒)。因此,主机软件生成的最小 TCP 数据包为 54 字节。