c - 将多个 IP 地址匹配到一个端点

标签 c linux sockets networking ipv6

我的情况是这样的:

(我不知道这是否相关,但以下所有内容都/应该在 linux 机器上使用 c 完成。)

我正在使用 IPv4 广播数据包和 IPv6 多播数据包在我的本地网络中进行对等发现。从另一个对等点接收到广播/多播数据包的对等点会发回一个响应信号,表明他们在线。

因为我在所有接口(interface)上进行广播并且同时使用 IPv4 和 IPv6,所以我从一个端点(一个 IPv4 和一个 IPv6)得到至少两个响应。如果可以通过多个接口(interface)(例如 wifi + 以太网)访问另一个端点,我可能会从单个端点获得更多响应。

Peer 2 gets a response via 3 Paths

在此示例中,对等点 2 在其 WiFi 和以太网卡上广播 IPv4 数据包并使用其 WiFi 卡发送 IPv6 多播数据包后,从对等点 1 获得了三个响应。对等点 2 现在有 3 个来自具有不同 IP 的同一主机的响应。

我的问题是,是否有任何方法可以将所有这些响应匹配到一个端点,而无需在响应数据包中嵌入某种 ID?

如果这不可能,我的下一个问题是如何选择一个好的标识。每个主机的 ID 不必是唯一的,但每个 session 的每个主机都必须唯一。一个简单的随机数可能会在两个对等点之间造成冲突,如果不需要的话,我不想处理这种情况。 id 也应该很短,以免数据包膨胀太多。

我很感激任何评论/回答。

最佳答案

My question is if there is any way to match all those responses to a single endpoint without embedding some kind of id in the response packets?

如果不在数据包中嵌入某种标识(或在 TCP session 开始时执行某种身份验证交换,在这种情况下,您不会),就无法将来自不同地址的多条消息关联到同一源主机只要它是已建立连接的一部分,就不需要在每个数据包中包含标识符。

If this is not possible my next question would be how to pick a good identification. The id does not have to be unique per host but only per host per session.

使用网络接口(interface)的 MAC 地址作为客户端标识符。这将为您提供一个六字节的客户端标识符,每个主机都是唯一的。使用“eth0 的 MAC 地址”或“编号最小的接口(interface)的 MAC 地址”等规则来一致地选择值。

可能值得注意的是,虽然可能无法保证 MAC 地址是唯一的,但有效可以保证:只要 (a) 您的所有客户端共享至少一个公共(public)网络,并且 (b) 您使用该网络上接口(interface)的 MAC 地址,那么它要么是唯一的,要么您将有更大的问题需要处理,因为您的一个或多个客户端将无法参与网络。

关于c - 将多个 IP 地址匹配到一个端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47620037/

相关文章:

c - 如何将数据添加到txt文件的新行

linux - 将文件从给定的 'x'(起始)偏移量复制到给定的 'y'(结束)偏移量的工具

linux - 启动终端并在重启后从 systemd 执行脚本

java - 套接字编程

c++ Socket选择接收问题

python - 套接字Python 3 UDP ConnectionResetError : [WinError 10054] An existing connection was forcibly closed by the remote host

c - libnet.h 没有那个文件或目录

c - 在 C 中维护指向两个相关类型的指针数组

C 打印第一个百万斐波那契数

linux - Linux 上的 Docker 桌面使用大量内存