我一直在使用UDP进行C#Networking的一些工作。我做得很好,但需要解决几个基本问题,我在测试时遇到了问题:
我是否正确理解数据报将在另一端完成或根本不收到。 IE它是一个全有或全无的东西。由于数据包丢失,没有机会得到碎片数据报?
因此,我只需要确认每个数据报,而不是确保我的数据报是<每个1500字节和ACK?
我看过很多地方,但数据报和底层数据包之间的差异似乎有很多混淆......
谢谢你的帮助!
答案 0 :(得分:2)
由于数据包丢失,不可能出现碎片数据报?
我认为这是正确的:片段化和片段重组由UDP下面的协议层处理,即它由“IP”层处理,如果它无法将数据包片段重新组合成数据报,则会出错(对于例如,在RFC 792)中搜索“fragment”。
http://www.pcvr.nl/tcpip/udp_user.htm#11_5说,
“目的地的IP层执行重组。目标是使传输层(TCP和UDP)对分段和重组是透明的,除了可能的性能下降之外。”
答案 1 :(得分:1)
正如您现在可能的16位UDP长度字段表示您可以发送总共65535个字节。但是,理论上数据(sizeof(IP Header)+ sizeof(UDP Header))= 65535-(20 + 8)= 65507字节。
但这并不意味着所有使用UDP的应用程序都会将此数据量作为示例DNS数据包限制发送到512字节。这是因为您没有从服务器获取任何ACK数据包。这是数据包可能在网络中丢失的一个原因(数据包传输问题和丢失)。其次,中间节点可以将数据报封装在另一个协议内,作为IPSEC或其他协议的例子。
对于UDP,没有ACK数据包,因此在您的情况下,如果底层应用程序使用UDP,您将看不到任何ACK数据包。其次,某些服务器根据应用程序将其大小限制为最大UDP数据包,因此如果您有从客户端到服务器的数据传输,您应该看到相同的字节,例如512字节。继续回到wireshark。通常,source使请求和目标发回X字节UDP数据报。
这些链接可能对您的问题有用:
答案 2 :(得分:-1)
我是否正确理解数据报将在另一端完成或根本不收到。 IE它是一个全有或全无的东西。由于数据包丢失,没有机会得到碎片数据报?
这是正确的。
因此,我只需要确认每个数据报,而不是确保我的数据报是<每个1500字节和ACK?
我不明白这个问题。您需要确认每个数据报,无论其大小如何,和应该使它们成为< 1500字节,因此它们不会碎片化。否则,如果它反复出现碎片并且片段反复丢失,您可能永远无法传输任何特定的数据报。