我正在使用两台计算机和一个应用程序来发送和接收UDP数据包。该应用程序没有流量控制,也禁用了ICMP。经常出现以下情况:当我通过该应用程序将文件作为UDP数据包发送时,有两个数据包的顺序改变,从而导致数据包丢失。
我已经禁用了所有防火墙,并且两台计算机之间没有连接任何硬件交换机(它们直接相连)。
是否有方法可以确保Winsock和send()
以相同的方式发送数据包?
或者是操作系统在处理数据包的时候会排序?
还是需要网络设备配置?
我正在使用两台计算机和一个应用程序来发送和接收UDP数据包。该应用程序没有流量控制,也禁用了ICMP。经常出现以下情况:当我通过该应用程序将文件作为UDP数据包发送时,有两个数据包的顺序改变,从而导致数据包丢失。
我已经禁用了所有防火墙,并且两台计算机之间没有连接任何硬件交换机(它们直接相连)。
是否有方法可以确保Winsock和send()
以相同的方式发送数据包?
或者是操作系统在处理数据包的时候会排序?
还是需要网络设备配置?
UDP是一种轻量级协议,它的设计不处理诸如数据包排序之类的事情。如果您想要稳健的数据包传递和排序,TCP是更好的选择。
UDP通常用于网络应用程序中,其中数据包丢失可接受或优于TCP重新请求数据包时产生的延迟,因此UDP通常用于媒体流传输。
如果您只能使用UDP,则需要开发一种识别乱序数据包并对其进行重新排序的方法。
UDP不保证数据包按顺序到达(甚至不能保证数据包能够到达)。如果您需要更高的可靠性,最好使用TCP。或者,您可以在数据报中添加序列标记,并在另一端重新排列它们,但为什么要重复造轮子呢?
试图创建自己的TCP包装器是没有意义的。我们喜欢UPD的速度,而这只会减慢事情的进展。如果您设计协议使每个UDP数据报独立于其他数据报,则可以克服您的问题。只要头数据包先到达,我们的数据包可以以任何顺序到达。头部指示了应该到达多少数据包。此帖子创建十年后,UPD已变得更加可靠。不要尝试。
没有流量控制(ICMP已禁用)。
您可以使用UDP实现自己的流量控制:
请参见滑动窗口协议以获取更多详细信息。
[这将是您发送的数据包中的序列号之外的内容。]
malloc()
一个足够大的缓冲区来容纳整个消息变得非常容易。然后,一点数学就可以告诉我这个数据包在消息中的确切位置。一旦消息缓冲区被填满...我就知道我收到了整个消息。如果收到一个不属于这个唯一消息ID的数据包,那么我们就知道这是失败的,并且我们可能永远也无法获得旧消息的其余部分。