我的问题分为两部分:
我知道以太网帧的“数据”部分可以是 46~1500 字节。考虑到 20 字节的 IP 报头 + 20 字节的 TCP 报头,TCP 段的最小“数据”大小应该是
(46-20-20) = 6 bytes
。考虑到 8 字节的 UDP 报头,UDP 段的最小“数据”大小应该是(46-8-20) = 18 bytes
。那么,有人能解释一下为什么应用程序数据大小的下限会变成 6 字节或 18 字节这样的高值,而不是 1 字节这样的小值吗?我相信我遗漏了一些东西。我找到了一些解释[1][2]IP 数据包的最小大小应为 64 字节。我认为上述链接中的解释是正确的。那么,为什么以太网帧的最小“数据”大小不是
(64-20-20) = 24 bytes
?
有人能更清楚地解释一下吗?
答案1
以太网的最小帧大小规定为 64 字节(如您的参考资料中所述)。
DMAC + SMAC + EtherType + Payload + CRC
6 + 6 + 2 + 46 + 4 = 64
在第 4 层(TCP 或 UDP)中,“长度”涵盖第 4 层报头,并在 IP 报头中进行跟踪。
这意味着,对于 UDP,预期的最小值为 8 个字节(对于其报头)。而对于 TCP,预期的最小值为 20 个字节(最小 TCP 报头)。
你似乎错过的部分开始了现在以太网
数据长度至少需要 46 字节,而 IP 长度则不必是46-20
1000 字节。它可以比 46 字节小得多。
因此,如果我们有一个 8 字节 UDP 数据包,其中没有任何数据,则其 IP 长度将是 ,20+8
但以太网有效负载长度仍将是46
字节。字节空洞会怎样18
?它会被填充,以使以太网帧在线上以64
字节为单位(原因您已经知道)。
[Eth: DMAC + SMAC + EtherType + [IP: Hdr + [UDP: Hdr + 0data ]] + PAD + CRC ]
底线:您所指的application data size
基于此64
字节以太网要求没有最低期望。PAD
将弥补任何差异。
答案2
简短回答:
TCP 段的数据部分的最小长度为零。UDP 数据报的数据部分的最小长度为零。
如果 IP 堆栈需要将小于 46 字节的数据报传送到以太网,以太网会通过添加填充字节将其填充到 46 字节。IP 报头有自己的长度字段(TCP 和 UDP 报头也有),因此这些协议永远不会混淆,并尝试将链路层填充解释为其自身有效负载的一部分。
附加信息:
以太网只是 IP 可以运行的众多数据链路层协议之一。由于传统技术原因,以太网的最小数据包长度为 64 字节(这样就可以在最大直径以太网上可靠地检测到“冲突”,而当时以太网是 CSMA/CD,可能会发生冲突——现代以太网到处都使用交换机,并且在所有段上都是全双工的,因此 CSMA/CD 和冲突几乎已成为过去)。
由于我们经常在以太网上使用 IP,因此很容易忘记以太网和 IP 是两个独立机构创建的两种独立网络技术。由 IEEE(电气和电子工程师协会)制定的以太网标准化设计用于处理除 IP 之外的未知数量的网络(第 3 层)协议,而由 IETF(互联网工程任务组)创建的 IP 设计用于处理除以太网之外的未知数量的数据链路(第 2 层)协议。IP 不会因为一种流行的链路层协议而改变其最小或最大数据报大小。如果链路层协议不喜欢它收到的微小数据报,它必须对其进行填充。相反,如果 IP 不喜欢当前数据链路提供的 MTU,它必须进行分段。