当网卡收到一个包的目的不是自己的IP
或者问题变成了,多网卡的机器路由选择
机器有两张网卡A和B,我将pingB的包发送给A这个时候是能ping通的,所以这里涉及到一个问题,网卡怎么知道这个数据包是不是自己的?拿到ICMP数据包后会怎么做呢?所以这里就涉及到ICMP协议了xx
这是因为这台机器上所有的网卡都标志了这台机器的身份,所以
那这么说的话,我从树莓派里面去ping我主机上的这些地址其实也是能ping通的shi 。
在树莓派上玩了,确实是这样的,和tap机制一样,当我给与树莓派直连的网卡上
但是无论是从qemu上ping还是从树莓派ping,宿主机上直连的网卡必须与树莓派和宿主机是同一个网段,这里不是很明白啊,为啥一定要是同一个网段的呢?
这里涉及到ARP协议,ARP协议发送的是一个地址的信息;
所以ARP协议接收端发生了啥?
tap0和虚机中的eth0是直连的,但是tap0:192.168.11.3/24, 但是虚机eth0是:192.168.0.110/24,增加了一条路由:route add default eth0,也就是说,其实tap0能收到来自eth0的包,并且实际从tap0上确实也观测到了相关的包,BUT。。。就是ping不同;也就是说掩码只在发送端才有意义,这是个错的!之前假设ARP中是不会发送掩码的!这个也是错的么?
当把eth0的掩码换成255.255.0.0 即18的时候,奇迹发生了,这个时候就ping通了,这说明:ARP协议的接受端会判断来的IP地址和自己是不是一个子网(通过自己的IP地址和netmask),如果是那就直接返回了。【ARP接受部分的代码】
还有问题宿主机上除了tap0,还有另外一块网卡是enp0s25,这个网卡的IP地址是11.11.11.11/255.255.255.0, 此时从虚拟机中去ping这个地址能ping通么?
答案是:能ping通!
直接上wiresharp抓到的包:不方便截图,下次自己手动操作一下吧
eth0 虚机 <-----> tap0 <-------> enp0s25
监控tap0,发现了:who has 11.11.11.11 tell 192.168.0.110 MAC 地址是86:04:41是tap0的mac地址
也就是说tap0收到了从虚机中eth0中来的包之后,开始在自己的广播域中发起了一条ARP广播,谁的IP地址是11.11.11.11,告诉192.168.0.110,那么都有谁在这个广播域中,问题就来了,我这台机器上有docker0,enp0s25,等等诸多的网卡,是所有人都能听到这个ARP信息么?docker0看不到. 看下arp的代码