时ETH_P_IP和ETH_P_ALL之间的差异,我有以下设置:为什么有这样一个阅读()
client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server
当我打开原始套接字上使用
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
我有linux的桥梁绑定到eth2的套接字。客户端向服务器发送数据包时,网桥上运行的wireshark会报告客户端的源mac地址(eth0)和服务器的目标mac地址(eth1)。
当我做read()
时,读取的数据的前6个字节是目标MAC地址,它被正确读取为服务器(eth1)。
然而,当我改变语句
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
当我做了read()
,前6个字节的数据的读取显示了目标MAC地址是Linux桥(ETH2)。
这是为什么?内核或以太网卡驱动程序将自己的mac地址放在缓冲区中,而不是使用ETH_P_IP读取线路?
这是正确的,它是作为一个二层桥。客户端和服务器在同一个vlan上。 在这两种情况下,wireshark都显示目标mac地址是server(eth1),但ETH_P_IP上的read()显示与wireshark报告不同的内容。 –
答案更新了,引用了一个类似的问题[这里](http://stackoverflow.com/questions/1637835/packet-sniffing-using-raw-sockets-in-linux-in-c)。 – user1500049
hhmm,所以你说任何mac地址信息应该被忽略,因为你只会对ip层和以上感兴趣? –