我在设置数据报包上的TTL时遇到问题.我在将数据包发送到multicastSocket之前调用数据包上的setTTL(...)方法但是如果我使用ethereal捕获数据包,则TTL字段始终设置为0
我是网络新手.我理解多播的概念,但想知道它在开放/公共互联网上是否可靠?
这似乎是一种边缘情况,不同的主干或ISP可能会故意破坏以减少路由器负载或通常将网络分段以用于实际的高使用率应用.
我的恐惧合理吗?
PS后续问题: 应用程序多播的最佳教程?
我试图弄清楚如何使用IPV6进行相当于IPV4的广播.
我正在创建一个非阻塞的IPV6 UDP套接字.
从侧面广播我实际上只是在端口12346上执行sendto"FF02 :: 1".
在听力方面,我发现我需要加入小组,所以我做了以下事情:
ipv6_mreq membership;
memset( &membership.ipv6mr_multiaddr, 0, sizeof( in6_addr ) );
membership.ipv6mr_multiaddr.u.Word[0] = htons( 0xff02 );
membership.ipv6mr_multiaddr.u.Word[7] = htons( 0x0001 );
membership.ipv6mr_interface = 0;
if( enable )
{
if ( 0 != setsockopt( m_Socket, SOL_SOCKET, IPV6_JOIN_GROUP, (char*)&membership, sizeof( ipv6_mreq ) ) )
{
DisplayError();
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
但是setsockopt总是返回"WSAENOPROTOOPT".为什么?任何人都可以帮我这个吗?我完全失去了.
编辑:我将级别更改为"IPPROTO_IPV6"但现在我得到了"WSAEINVAL".
要在我的非默认NIC(dvb)上接收多播,请执行以下操作:
此时,接收所需多播数据包的唯一方法是在路由表中添加一条规则,通过dvb到达发送方所在的网络(另一个网络),就像dvb需要回复多播发送方一样; 让我们说一种源发送器组播模式.谁知道发生了什么事?这个问题让我讨厌,因为原则上我不知道发送者的ip.
我有一个带有两个NIC(eth0和eth1)的linux服务器,并且在"ip route"中将eth0设置为默认值.现在我想在eth1上接收多播数据包.我在路由表中添加了"224.0.20.0/24 dev eth1 proto static scope link",并按如下方式连接:
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
// port 12345, adress INADDR_ANY
bind(sock, &bind_addr, sizeof(bind_addr));
// multicast address 224.0.20.100, interface address 10.13.0.7 (=eth1)
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imreq, sizeof(imreq));
Run Code Online (Sandbox Code Playgroud)
根据ip maddr它在正确的接口上连接到该组,并tshark -i eth1显示我实际上正在获取多播数据包.
但是,我在呼叫时没有收到任何数据包recvfrom(sock).如果我将"ip route default"设置为eth1(而不是eth0),我会通过recvfrom获取数据包.这是我的代码或我的网络设置的问题,这样做的正确方法是什么?
(更新)解决方案: caf暗示这可能是同样的问题; 确实:做完之后echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter我现在可以收到组播数据包了!
我想一劳永逸地学习.连接多播套接字的步骤是什么?我知道你有绑定到一个本地接口(你需要的IP和端口是什么?),那么我知道你要加入一个组(你需要IP:再次端口要加入的地址和网络接口! !! ??)然后最后你可以离开小组.
有经验的人可以澄清这些地址的全部内容吗?我将在下面列出:
这里的组播组在哪里以及是什么?
我注意到定义IPv6多播的大多数操作系统定义了两组套接字选项; IPV6_ADD_MEMBERSHIP/ IPV6_DROP_MEMBERSHIP和IPV6_JOIN_GROUP/ IPV6_LEAVE_GROUP.每当我找到它们时,它们都被记录为同义词,并采用相同的选项值.事实上,有些人甚至可以#define指出另一个人的意思; 例如
#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP
Run Code Online (Sandbox Code Playgroud)
这里有什么不同,或者只是历史包袱 - 两个同名的名字?
我正在尝试将所有传入的TCP数据包转发到多个IP地址.
建立:
A - 10.10.10.10
B - 10.10.10.11
C - 10.10.10.12
D - 10.10.10.13
Run Code Online (Sandbox Code Playgroud)
我希望B,C和D接收(在端口8000上)A端口12345上的所有传入数据包.理想情况下,我希望A做到这一点.
我可以在A上使用此规则转发到一台机器:
iptables -t nat -A PREROUTING -p tcp --dport 12345 -j REDIRECT --to 10.10.10.11:8000
Run Code Online (Sandbox Code Playgroud)
我也可以使用TEE选项克隆数据包:
iptables -t mangle -A PREROUTING -p tcp --dport 8000 -d 10.10.10.11 -j TEE --gateway 10.10.10.12
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都还可以.问题是C将接收目的地IP为B而不是C的数据包.此外,我不知道如何转发到D和/或更多其他目的地.
如何使用iptables规则将A端口12345上的所有传入数据包发送到所有其他计算机(B,C和D)到端口8000?
Camel中的wireTap和多播的默认行为似乎相似.这两者都有助于以不同的方式处理相同的消息.那么wireTap和组播之间的主要区别是什么?
我有一个包含多台计算机的网络,每台计算机都有多个网络接口和一个目标。我正在开发一个积极使用多播的应用程序。总的来说,一切都按预期进行。除了我无法在通过第二个网络接口发送的同一台计算机上接收多播的那一刻之外。网络上的其他计算机可以通过任何网络接口接收多播。是否可以通过一个接口发送多播并通过同一网络中的另一个接口接收多播?如果是这样,我在哪里犯了错误:在客户端代码中,在收件人代码中,还是在系统设置中?
典型机器配置:
$ ifconfig
enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.230 netmask 255.255.255.0 broadcast 192.168.88.255
enp10s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.229 netmask 255.255.255.0 broadcast 192.168.88.255
wlp6s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.48 netmask 255.255.255.0 broadcast 192.168.88.255
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
Run Code Online (Sandbox Code Playgroud)
路由表:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.88.1 0.0.0.0 UG 100 0 0 enp0s31f6
0.0.0.0 192.168.88.1 0.0.0.0 UG 101 0 0 enp10s0
0.0.0.0 192.168.88.1 0.0.0.0 UG 600 …Run Code Online (Sandbox Code Playgroud) multicast ×10
sockets ×4
linux ×3
networking ×3
udp ×3
ipv6 ×2
java ×2
routing ×2
apache-camel ×1
c ×1
c++ ×1
iptables ×1
jms ×1
link-local ×1
multihomed ×1
oracle ×1
ttl ×1