【问题标题】:UDP multicast packet caught by tcmp dump but not received by sockettcmp 转储捕获但套接字未接收到的 UDP 多播数据包
【发布时间】:2017-02-13 04:40:04
【问题描述】:

我正在研究大数据。为此,我开发了一个网络,其中有几个节点交换 UDP 单播和多播数据包。有 33792 字节的 UDP 数据包和 37 字节的 Ack 数据包。 MTU 设置为 1500。一切正常,可以说交换了 300 到 5000 个数据包。然后突然有些机器收到了这个数据包(我可以用tcmpdump -i any -vvv -XX -e -s 64 > dump.txt 2>&1看到它)。但是应用程序套接字没有接收到它(选择不会唤醒)。

我正在使用 TTL 设置为 1 的 IPv4 套接字,即本地网络。

在尝试解决了几个晚上之后,我最终设置:

sudo sysctl -w  net.core.wmem_max=134217728
sudo sysctl -w  net.core.rmem_max=134217728
sudo sysctl -w  net.ipv4.udp_mem=1638400 1638400 1638400
sudo sysctl -w  net.core.somaxconn=4096
sudo sysctl -w  net.core.netdev_max_backlog=262144
sudo sysctl -w  net.core.optmem_max=134217728
sudo sysctl -w  net.ipv4.udp_rmem_min=65535
sudo sysctl -w  net.ipv4.udp_wmem_min=65535

The client sockets set SO_SNDBUF to 134217728 (128 M), and server socket sets SO_RCVBUF to same value.

但看起来问题仍然没有解决。有什么想法吗??? ....TIA

【问题讨论】:

  • 嗯? '被tcpdump 捕获',但'用tcpdump 看不到','被套接字接收',但'套接字没有接收'?下定决心。
  • 感谢您的建议。我已经编辑了问题。
  • 您使用的是哪个操作系统? “某台机器收到数据包”是什么意思?这是与使用应用程序套接字运行应用程序的机器不同的机器吗?

标签: sockets udp multicast tcpdump


【解决方案1】:

实际上它似乎解决了这个问题。任何想要详细了解(优点/缺点/权衡)我设置的 sysctl 值的人都非常欢迎。

【讨论】:

    【解决方案2】:

    您必须加入多播组才能可靠地接收多播数据包。

    在 UN*X 上,这是通过类似的方式完成的

    struct ip_mreq mreq;
    setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
    

    陷阱是,如果某些设置不正确(或无法正常工作,例如交换机),您将能够接收多播流量一段时间,然后突然停止。因此,当您收到数据包时,您“不能”得出“一切正常”的结论。

    另外:您网络中所有潜在的透明基础架构(例如 2 级交换机 == 普通交换机)都需要支持您的操作系统正在使用的 IGMP 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2015-11-28
      • 2015-11-26
      • 2013-03-23
      • 2022-11-02
      • 2017-09-09
      • 2018-02-27
      相关资源
      最近更新 更多