【发布时间】:2017-09-05 20:06:13
【问题描述】:
我正在使用 python 工具在一个 VM 中生成数据包,并在我的程序中捕获它们,该程序作为另一个 VM 中的 linux 进程运行。这两个虚拟机都是 ubuntu 并且它们在同一个子网上运行。我注意到一些数据包在我的程序中被丢弃。了解数据包丢弃位置的最佳工具是什么?
我看到 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
【问题讨论】:
-
就其本质而言,UDP 是不可靠的。数据包可能会从任何地方丢弃。您必须嗅探网络流量,例如使用 Wireshark,以查看它是否位于发送端、接收端以及介于两者之间的任何位置。 UDP packet drops by linux kernel 的可能重复项。最有可能的是,接收方接收数据包的速度不如发送方发送数据包的速度快,因此接收缓冲区会填满并丢弃数据包。
-
@Jim 如 netstat 输出所示,接收器 VM 中接收到数据包,但接收缓冲区在应用程序可以使用之前已满
标签: c sockets ubuntu network-programming udp