我一直在使用UDP做一些C#网络方面的工作。我进展得很好,但我需要一些基本问题的答案,我有问题要测试:
我是正确的理解,数据报将收到完整的另一端或根本没有。这是一件全部或完全没有的事.没有可能因为丢包而导致数据报支离破碎?
因此,我只需要每个数据报ACK,而不是确保我的数据报是< 1500字节和ACK每一个?
我看过很多地方,但是数据报和底层数据包之间的区别似乎很混乱.
谢谢你的帮助!
发布于 2012-12-08 14:26:09
没有可能因为丢包而导致数据报支离破碎?
我相信这是正确的:碎片和片段重组是由UDP下面的协议层处理的,也就是说,它是由"IP“层处理的,如果它不能将数据包碎片重新组装成数据报(例如,在RFC 792中搜索”片段“),则会出错。
5说,
“目的地的IP层执行重组。目的是使碎片和重新组装对传输层(TCP和UDP)透明,除非可能出现性能下降。”
发布于 2012-12-08 14:26:20
正如您现在可能看到的那样,16位UDP长度字段指示您可以发送总计65535字节。但是,理论上数据可以是= 65535-(20+8) = 65507字节。
但这并不意味着所有使用UDP的应用程序都将发送此数量的数据作为示例,DNS数据包限制为512字节。这是因为您没有从服务器获得任何ACK数据包。这是数据包可能在网络中丢失的原因之一(数据包传输问题和丢失)。其次,中间节点可以将数据报封装在另一个协议中,例如IPSEC或其他协议。
对于UDP,不存在ACK数据包,因此在您的示例中,如果底层应用程序使用UDP,则不应该看到任何ACK数据包。其次,一些服务器将它们的大小限制在最大UDP数据包上,这取决于应用程序,因此,如果您从客户端到服务器之间进行数据传输,您应该看到相同的字节,例如512字节。去和回来在wireshark。大多数情况下,源发出请求,目标发送X字节UDP数据报。
这些链接可能对您的问题有好处:
发布于 2012-12-08 22:58:02
我是正确的理解,数据报将收到完整的另一端或根本没有。这是一件全部或完全没有的事.没有可能因为丢包而导致数据报支离破碎?
这是正确的。
因此,我只需要每个数据报ACK,而不是确保我的数据报是< 1500字节和ACK每一个?
我不明白这个问题。您需要对每个数据报进行ACK,而不管它的大小如何,并且应该使它们小于1500字节,这样它们就不会变得支离破碎。否则,您可能根本无法传输任何特定的数据报,如果它反复变得支离破碎,一个片段重复丢失。
https://stackoverflow.com/questions/13778172
复制相似问题