对于网络测试,我正在发送价值5兆字节的小数据报(每个UDP有效负载大小为50字节,不含报头),并测试服务器可以多快地接收所有〜100000数据包。
伪代码如下所示:
服务器(尽快恢复,下载速度> 50mbps):
bind("20.30.40.50", 5000)
while (true)
recv_next_udp() // negligible overhead
if (count++ % 100000 == 0)
break
print "100000 * 50 bytes = 5 megabytes recv"
客户端(发送速度最快,上传速度> 20mbps):
while (true)
send_udp_now("20.30.40.50", 5000)
if (count++ % 100000 == 0)
break
print "100000 * 50 bytes = 5 megabytes sent"
如果我发送到localhost
或127.0.0.1
:我收到了所有数据报,并且都按预期完成了它们的消息。
如果我绑定并发送到公共地址:我只会收到约40%的数据报(其中约40000个),而丢失约60%。
Q:如果客户端说所有数据报均已发送,则netstat -s
表示所有数据报均已发送且没有丢弃,服务器显示没有数据报因以下原因丢失或丢弃:内部缓冲区或读取速度慢:如何找到丢包的原因和位置?
根据netstat
,使用最大化的操作系统缓冲区不是问题,而且我很难相信路由器和交换机的缓冲区小于5 MB。如果我放慢发送速度,并在每次发送之间添加短暂的延迟,则不会丢失数据包。