我已经计算出使用 udp 的 2 个端点之间的分段之前的最大数据是 1472(其他端点可能会有所不同)。这表明 mtu 为 1500 字节,每个数据包的标头开销为 28 字节。假设如果我发送 0 字节数据(有效负载),实际传输的数据是 28 字节,是否安全?我正在做一些基准测试,所以了解频道中发生了什么对我来说至关重要。
4 回答
MTU 是可以在不分片的情况下传输的 IP 数据包的最大大小。
IPv4 要求路径 MTU 至少为 576 字节,IPv6 至少为 1280 字节。
以太网的 MTU 为 1500 字节。
一个IP包由两部分组成:包头和有效载荷。
IPv4 标头的大小至少为20 字节,IPv6 标头的大小至少为40 字节。
IP 数据包的有效负载通常是 TCP 段或 UDP 数据报。
UDP 数据报由 UDP 报头和传输的数据组成。
UDP 报头的大小为 8 个字节。
这意味着以空 UDP 数据报作为有效负载的 IP 数据包至少需要28 (IPv4) 或 48 (IPv6) 字节,但可能需要更多字节。
另请注意,在以太网的情况下,IP 数据包将另外包装在 MAC 数据包(14 字节标头 + 4 字节 CRC)中,该 MAC 数据包将嵌入以太网帧(8 字节前导序列)中。这将 26 字节的数据添加到 IP 数据包,但不计入 MTU。
因此,您不能假设 UDP 数据报会导致传输特定数量的字节。
如果没有选择任何选项,典型的 IP 报头是 20 个字节。UDP 标头为 8 个字节。在以太网上,帧大小为 14 字节(标头)+ 4 字节(尾标)。根据您捕获这些数据包的方式,您可能需要也可能不需要考虑帧大小。
不带以太网 (IP + UDP) = 20 + 8 = 28 字节
带以太网 = 18 + 28 = 46 字节
C# 中的 UdpClient 类将从第 5 层开始返回数据包,因此您不必考虑上述情况。
更新:
在 IP 层强制执行 1500 字节 MTU。这意味着 IP 层以下的数据包大小在分段时是微不足道的。
这转换为:
以太网帧字节(固定)= 18
IP 标头(最小)= 20
UDP 标头(固定)= 8
最大。没有碎片的允许有效负载 = 1472
线路上的总字节数 =(以上总和)1518 字节
(您可以使用 Wireshark 之类的工具计算离开的字节数)
如果 (IP header + UDP header + Payload > 1500) 则数据包被分段。
假设如果我发送 0 字节数据(有效负载)是否安全,实际传输的数据是 28 字节
不
(是的......因为它通常没有真正的区别,只要它是“安全的”)
虽然无负载无选项 UDP/IPv4 数据报确实是 28 个字节(或网络术语中的“八位字节”),但这绝不是一个安全的假设。
然而,在大多数情况下,它是无关紧要的。交换机和路由器通常转发小数据包的速度与大数据包的转发速度完全相同(或者,差异可以忽略不计)。您可能会看到差异的唯一场合是您的带宽账单(您需要为线路上的所有位付费,而不仅仅是为您使用的位付费!)。
IPv4 可能附加了多达 40 个八位字节的“选项”,并且 IPv4 可能被封装在 IPv6 中(甚至在您不知道的情况下)。两者都可以大大增加数据报的大小,从而以一种相当明显的方式传输数据。
此外,数据报将进一步封装在链路层,既增加了前导码和报头数据,又具有最小的帧长度。同样,附加标头的存在非常明显,除了最大尺寸外,有效负载还具有最小尺寸这一事实鲜为人知。
以太网和 ATM 是两个广泛使用的标准,可能会妨碍您在此处的假设(但其他链路层类似)。
以太网帧的最小大小为 64 字节,并用零填充到此大小。在存在 802.1Q (VLAN) 的情况下,这意味着以太网帧的最小有效负载为 42 个八位字节,否则为 46 个八位字节。
因此,通过“普通”以太网发送一个长度为零的 UDP/IPv4 数据报会将 18 个零字节附加到有效负载中。你永远看不到它们,但它们就在那里,它们会出现在你的账单上。
类似地,ATM 信元(与“帧”相同,它们出于某种原因使用不同的字)总是 53 字节,带有 48 字节的零填充有效负载。因此,零负载 UDP 图将导致添加 20 个零字节,而零长度 UDP/IPv6 数据报将保持其原始大小(大小正好为 48 个字节),假设中间没有其他封装,例如 PPPoE。
最后,请注意,可能需要发送和接收额外的数据包才能发送您的数据包。例如,您的以太网卡可能必须执行 ARP(或 NDP)才能发送您的数据报。当您发送多个数据报时,缓存结果可以摊销这一点,但如果您只发送一个UPD 数据报,您可能会惊讶地发现,与您可能天真的预期相比,发送和接收的“数据”数量大约是其三倍。
IP 开销是 20 字节,UDP 是 8 字节,所以是的,28 字节。
http://en.wikipedia.org/wiki/User_Datagram_Protocol
如果您正在进行内部测试,请不要忘记以太网开销