如果我在c#中发送0个有效载荷数据,udp数据包的大小是多少?

Sya*_*hya 10 c# udp header udpclient packet

我已经计算出使用udp的2个端点之间的碎片之前的最大数据是1472(其他端点可能不同).这表明mtu是1500字节,每个数据包的头开销是28bytes.可以安全地假设如果我发送0字节数据(有效载荷),传输的实际数据是28字节?我正在做一些bencchmark,所以对我来说知道频道中发生了什么至关重要.谢谢.

dtb*_*dtb 29

  • 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)中,该数据包将嵌入以太网帧(8字节前导序列)中.这会将26个字节的数据添加到IP数据包中,但不会计入MTU.

因此,您不能假设UDP数据报将导致传输特定数量的字节.

  • @thang 通过 IPv6 为 48 字节或通过 IPv4 为 28 字节。 (3认同)
  • 我有点困惑.你是说即使mtu为1500bytes,实际的数据包数据也可能超过1500字节(+26)?如果我不知道实际发送了多少数据,怎么能进行准确的测量?无论如何,我知道有多少数据被实际转移? (2认同)

AK.*_*AK. 7

如果未选择任何选项,则典型的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报头+ UDP报头+有效负载> 1500)则数据包被分段.


Dam*_*mon 6

假设如果我发送 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 数据报,您可能会惊讶于发送和接收的“数据”数量是您可能天真地期望的三倍。