我有一个简单的客户端/服务器设置。服务器在 C 中,查询服务器的客户端是 Java。
我的问题是,当我通过连接发送带宽密集型数据(例如视频帧)时,它会丢弃多达一半的数据包。我确保我在服务器端正确地分段了 udp 数据包(udp 的最大有效负载长度为 2^16)。我验证了服务器正在发送数据包(printf sendto() 的结果)。但是 java 似乎没有得到一半的数据。
此外,当我切换到 TCP 时,所有视频帧都通过了,但延迟开始增加,在几秒钟的运行时间后增加了几秒钟的延迟。
有什么明显的我遗漏的吗?我就是想不通。
最佳答案
获取像Wireshark这样的网络工具这样您就可以看到线路上发生了什么。
UDP 不会尝试重新传输,因此如果数据包在某处丢失,则由程序来处理丢失的问题。 TCP 将努力按顺序将所有数据包交付给程序,丢弃重复数据并自行请求丢失的数据包。如果您看到高延迟,我敢打赌您也会看到 TCP 的大量数据包丢失,这将显示为来自服务器的重新传输。如果您没有看到 TCP 重传,则可能是客户端处理数据的速度不够快,无法跟上。
关于Java 丢弃了一半的 UDP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440869/