将多个IP地址与一个端点匹配

时间:2017-12-03 15:42:15

标签: c linux sockets networking ipv6

我的情况如下:

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

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

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

Peer 2 gets a response via 3 Paths

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

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

如果不可能,我的下一个问题是如何选择一个好的身份证明。每个主机的id不必是唯一的,而是每个会话只有每个主机。一个简单的随机数可能会在两个对等体之间产生冲突,如果我不需要,这是我不想处理的情况。 id也应该很短,不要太过膨胀。

感谢任何意见/答案。

1 个答案:

答案 0 :(得分:2)

  

我的问题是,是否有任何方法可以将所有响应与单个端点匹配而不在响应数据包中嵌入某种ID?

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

  

如果不可能,我的下一个问题是如何选择一个好的身份证明。 id不必是每个主机唯一,而是每个会话只有每个主机。

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

值得注意的是,虽然MAC地址可能不是保证是唯一的,但有效保证:只要(a)所有客户共享至少一个公共网络和(b)您使用该网络上的接口的MAC地址,然后它将是唯一的或您将遇到更大的问题,因为您的一个或多个客户将无法参与网络。