隐含的问题是:如果Linux send()在套接字的发送缓冲区已满时阻塞了调用,为什么会有丢包?
更多细节:我在C中编写了一个小实用程序,以尽可能快地将UDP数据包发送到单播地址和端口.我每次发送一个1450字节的UDP有效载荷,第一个字节是一个计数器,每个数据包递增1.我在具有1Gb nic(=非常慢)的台式PC上的VirtualBox内部的Fedora 20上运行它.
然后我写了一个小实用程序来读取来自给定端口的UDP数据包,该端口检查数据包的计数器与其自己的计数器,如果它们不同(即1个或更多数据包丢失)则打印一条消息.我在Fedora 20 bi-xeon服务器上运行它,它具有1Gb以太网网络(=超快速).它确实显示了许多丢失的数据包
两台机器都在本地网络上.我不确切知道它们之间的跳数,但我不认为它们之间有超过2个路由器.
我试过的事情:
send().如果我设置1ms的延迟,则不再丢失数据包.延迟100us将开始丢失数据包.setsockopt().这没有任何区别......请赐教!