UDP组播数据包由tcmp转储捕获但未被套接字接收

时间:2017-02-13 04:40:05

标签: sockets udp multicast tcpdump

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

我正在使用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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

在UN * X上,用

之类的东西完成
struct ip_mreq mreq;
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

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

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