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

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

  • 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数据报将导致传输特定数量的字节。

如果未选择任何选项,则典型的IP标头为20个字节。 UDP标头是8个字节。 通过以太网,帧大小为14字节(标题)+ 4字节(预告片)。 根据您捕获这些数据包的方式,您可能需要考虑或不考虑帧大小。

没有以太网(IP + UDP)= 20 + 8 = 28字节
以太网= 18 + 28 = 46字节

C#中的UdpClient类将从第5层开始返回数据包,因此您不必考虑上述情况。

更新:
1500字节MTU在IP层强制执行。 这意味着分段时,IP层以下的数据包大小无关紧要。

这意味着:
以太网帧字节(固定)= 18
IP头(分钟)= 20
UDP标头(固定)= 8
最大。 允许的有效载荷没有碎片= 1472
导线上的总字节数=(上面的总和)1518字节
(您可以使用Wireshark等工具计算剩余的字节数)

如果(IP报头+ UDP报头+有效负载> 1500)则数据包被分段。

IP开销是20字节,UDP是8字节,所以是的,28字节。

http://en.wikipedia.org/wiki/User_Datagram_Protocol

如果您正在进行内部测试,请不要忘记以太网开销

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