【问题标题】:How to understand where the UDP packets are dropped in my ubuntu C program如何了解 UDP 数据包在我的 ubuntu C 程序中丢弃的位置
【发布时间】: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


【解决方案1】:

好吧,如果您认为您需要找出在哪里某些数据包被丢弃,这可能没有用,因为您已经知道至少RcvbufErrors图在成长。这意味着 NIC 能够将数据包传递给内核,但后者无法将数据包传递给应用程序,显然,因为固定大小的接收缓冲区比应用程序读取数据的速度更快(或者只是冲洗它)。

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

【讨论】:

  • 我可以通过使用带有 SO_RCVBUF 选项的 setsockopt 并传递更大的 size 值来增加接收缓冲区大小来显着提高性能,但应用程序中仍然存在一些瓶颈。感谢您的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多