2017-09-05 43 views
0

我正在使用python工具在一个虚拟机中生成数据包,并将它们捕获到我的程序中,作为另一个虚拟机中的Linux进程运行。这两个虚拟机都是ubuntu,它们在同一个子网上运行。我注意到一些数据包在我的程序中丢失了。知道数据包丢弃的最佳工具是什么?如何理解UDP数据包在我的ubuntu C程序中丢失的位置

我发现netstat输出中的RcvbufErrors随着我发送新数据包而增加。

# netstat -us 
IcmpMsg: 
    InType0: 14 
    InType3: 1493 
    InType5: 204 
    InType8: 54 
    InType13: 5 
    InType17: 5 
    OutType0: 54 
    OutType3: 645946 
    OutType8: 584 
    OutType14: 5 
Udp: 
    7686124 packets received 
    646545 packets to unknown port received. 
    33928069 packet receive errors 
    7157259 packets sent 
    RcvbufErrors: 33928069 
    IgnoredMulti: 345772 
UdpLite: 
IpExt: 
    InMcastPkts: 4 
    InBcastPkts: 363522 
    InOctets: 13243409806 
    OutOctets: 8445992434 
    InMcastOctets: 144 
    InBcastOctets: 114457552 
    InNoECTPkts: 100191590 
    InECT0Pkts: 143 
+1

UDP本身就是不可靠的。数据包可能会从任何地方掉落。您必须嗅探网络流量,例如Wireshark,以查看它是否位于发送端,接收端以及它们之间的任何位置。 [可能由linux内核丢弃UDP数据包的重复](https://stackoverflow.com/questions/10899937/)。最有可能的是,接收方不会像发送方发送数据包那样快速接收数据包,因此接收缓冲区会填满并丢弃数据包。 –

+0

@Jim在netstat输出显示接收缓冲区时收到数据包,但接收缓冲区在应用程序可以使用之前变满。 – Adel

回答

0

好吧,如果你认为你需要找出其中一些数据包会被丢弃,这可能不是因为你已经知道至少RcvbufErrors数字还在不断增长是有益的。这意味着NIC能够将数据包传送到内核,但后者无法将数据包传送到应用程序,显然,因为固定大小的接收缓冲区比应用程序可以读取数据的速度快得多(或者只是冲洗它)。

所以,我想说这样的结果只会给人一种糟糕的应用程序设计印象。也许,您应该考虑一些很好的技术来增强应用程序中的数据包捕获,以便每秒捕获/检查/丢弃更多数据包。一个很好的例子是PACKET_MMAP Rx环,其具有exhaustive description并广泛用于基于libpcap的应用。后一方面使用wiresharktcpdump而不是您的手工应用程序来检查实际捕获率等确实是合理的。

+0

我可以通过使用setsockopt和SO_RCVBUF选项来增加接收缓冲区的大小,并通过一个更大的值的大小,但在应用程序中仍然存在一些瓶颈。感谢您的评论。 – Adel