问题背景:假设本机ip设为172.29.26.1。自己这有一个cpu,内存到外设的软件仿真环境,有基本的网卡功能,上面跑一个elf格式linux内核。将该仿真环境运行在本地机器上,仿真环境中运行linux内核,给linux内核设定网卡的ip地址为172.29.26.200,mac自定。发现26.200发送arp给本机,本机不回应;本机发送arp给26.200,26.200有arp应答但是本机不更新arp缓存表导致ping不通。
遂写两个小程序测试,发现具体:
比如源ip:172.29.26.200,目的ip(本机ip地址):172.29.26.1
用raw socket写arp发送和接收的程序,通过本地网卡发送arp包给本机ip地址。
接收的程序通过recv()接收不到本地的arp回应。
另一个程序源ip为本机ip地址:172.29.26.1,目的ip:172.29.26.200(本机运行着上面提到的elf格式linux内核)
用raw socket写arp发送和接收的程序,通过本地网卡发送arp包给26.200。
接收的程序通过recv()确实接收到26.200的arp应答包,tcpdump也收到了,但是本地linux并没有更新arp缓存表,仿佛给过滤掉了。
能跟发送和接收arp包都是通过本地网卡有关系么?哪位大牛能帮忙解释下原因?为什么本机都收到arp应答包了仍然获取不到26.200的mac地址?
The created ARP request passed to network driver and sent to physical layer. Network driver handles the packet as outgoing packet it is just send. A switch or whatever device at the other end of the wire does not forward the ARP request back to the interface where it was received.
So local OS never receives the ARP request and it cannot respond. tcpdump catches and shows the outgoing ARP request. There is no incoming one.
1 没做过类似的,提供一些博客给您,希望对您有所帮助
2 http://www.cnblogs.com/yuuyuu/p/5164685.html
3 https://wenku.baidu.com/view/33ad75c7aa00b52acfc7ca66.html
4 有没有可能是防火墙、IP地址一些其他的小问题呢
你的机器是否有双网卡?
仿真环境和本机共享一个网卡应该是有问题的。
偶然点进来的,不太清楚,抱着学习看看了就,百度raw socket,百度百科中有两句你看是不是你遇到的情况吧,
“,如果设置了promisc混杂模式的话,则不做任何过滤直接交给下一层输入例程,否则非本机mac或者广播mac会被直接丢弃”
“如果校验和出错的话,内核会直接丢弃该数据包的.而不会拷贝给sock_raw的套接字,因为校验和都出错了,数据肯定有问题的包括所有信息都没有意义了”
可能和LINUX中的lo(回环接口)有关系
1) 什么是LO接口?
在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。
2) LO接口的作用是什么?
假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的’lo’接口,然后返回进入链的’lo’接口.具体参考包过滤器的相关内容。
PART2 实验:
本地一个进程发起连接,到一个本地的daemon监听的内网IP地址(eth1: 10.1.1.1)的端口(8085),此时在eth1上是抓不到包的,在 lo 上抓到,说明使用的是本地回环接口lo,而网络层的IP地址则是内网IP地址.
1) 什么是LO接口?
在LINUX系统中,除了网络接口eth0,还可以有别的接口,比如lo(本地环路接口)。
2) LO接口的作用是什么?
假如包是由一个本地进程为另一个本地进程产生的, 它们将通过外出链的’lo’接口,然后返回进入链的’lo’接口.具体参考包过滤器的相关内容。
PART2 实验:
本地一个进程发起连接,到一个本地的daemon监听的内网IP地址(eth1: 10.1.1.1)的端口(8085),此时在eth1上是抓不到包的,在 lo 上抓到,说明使用的是本地回环接口lo,而网络层的IP地址则是内网IP地址.
检查一下是否启用了lo接口,可以参考:
http://www.51testing.com/html/38/225738-236288.html