辅助接口tap0上的通信问题

我通过ipv6使用UDP作为通信栈。

我有networking客户端在辅助虚拟接口tap0上运行。 它为应该运行在相同的接口但是不同的链路范围ipv6地址的服务器生成消息。 我可以在wireshark上看到客户端生成的正确消息。
现在我没有准备好服务器代码,但是我正在使用netcat作为服务器的替代品来testing接收消息,我已经完成了如下操作:

nc -l -6 -vvv -u fe80::d4b2:dcff:fe59:6d2%tap0 61616

fe80 :: d4b2:dcff:fe59:6d2是服务器端链路范围ipv6地址。 tap0上的Wireshark跟踪清楚地显示了生成的数据包是上面提到的ipv6地址和端口,但netcat不能接收任何数据包。 ifconfig显示我有上面的IP分配给tap0。 而且,如果我执行下面的命令,我可以在netcat(服务器)上接收数据包。

nc -6 -vvv -u fe80::d4b2:dcff:fe59:6d2%tap0 61616 < raw_message_file

奇怪的是,发送上面的netcat“raw_message_file”并不是tap0上运行的wireshark捕获的。 ping之后也不被wireshark捕获。

ping6 -I tap0 fe80::d4b2:dcff:fe59:6d2

即使在明确指定netcat和ping的接口的情况下,这个数据包是不是可以在该接口上接收/发送?

PS1:客户端代码打开虚拟接口tap0。 过了一段时间后,它将消息发送到服务器上,这个服务器应该是用一些不同但固定的IPv6在该接口上监听的。
PS2:我觉得我的描述有点混乱, 请问问题,如果有的话?

编辑:本地主机上的tcpdump显示netcat和ping正在通过本地主机接口。 我的问题是,为什么?

看起来您可能对IPv6的工作方式有些困惑。

让我们首先澄清一些事情:您不在networking接口运行客户端或服务器,当您谈论tun或tap设备时会特别困惑,这违反了我们的一些惯例。 另外,你不要“ 打开 ”一个tap设备(除非你正在编写一个tun / tap助手,这似乎并不是这种情况),而是将一个地址绑定到一个套接字上 ,操作系统将在稍后确定如何将传出数据包路由到networking接口,以及如何将传入数据包从它们传递到本地进程。 记住这一点,这是操作系统,而不是你的程序。

当你的进程将一个套接字绑定到链路本地IPv6地址时,它只是告诉操作系统什么是数据包将被发送的地址,并且来自networking的数据包将被捕获并转发到你的进程。 链接本地地址的...%tap0后缀是地址的一部分,这只是OS的一个提示,因为所有链接本地地址在所有networking中共享单个全局地址空间,并不意味着进程以任何方式被绑定或locking到该特定设备。

如果您要将数据包发送到您自己的计算机上,请确保它不会通过分接接口。 也许这就是你的答案:只有通过tap界面飞行的数据包是那些到达隧道另一端的数据包,发送到你自己的机器上的任何东西都是没有意义的。 这些数据包是通过lo接口传递的。 将wireshark连接到lo界面,你应该看到你丢失的数据包。

将地址分配给接口时,操作系统知道该地址现在属于您的计算机,并且发送到该地址的任何内容(包括本地进程本身发送的任何内容)都应该路由到此计算机。 从eth0tap0等物理接口或逻辑接口发出的任何内容实际上都是从你的计算机上发出的,如果有什么东西留在系统中,就必须在lo接口上掉头,这样数据包才能回到堆栈的底部和接收进程。

操作系统在哪里跟踪这个? 在路由表中。 尝试这个:

 ip -6 route list table all root fe80::/10 

您应该看到一条或多条到fe80 :: / 64的路由,一个用于系统中每个物理或逻辑IPv6networking接口的路由,以及每个分配的IPv6地址的一些本地链路本地地址。 你会注意到,本地地址被设置为使用dev lo ,这就是操作系统知道去这些地址的任何东西都不会被发送出去。