2012-10-08 38 views
4

时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读取线路?

回答

2

对于ETH_P_IP的情况,你所描述的听起来就像是一个普通的“路由”场景。 (即路由mac是目标mac)

如果你的客户端和服务器位于不同的子网/ vlan上,并且路由器位于不同的路由器上,这将是有意义的。

但是,该图表明了一个linux“桥”。 它是否只桥接和根本没有路由?

编辑

ETH_P_IP仅根据这个答案捕获输入的IP数据包: Packet Sniffing using Raw Sockets in Linux in C

+0

这是正确的,它是作为一个二层桥。客户端和服务器在同一个vlan上。 在这两种情况下,wireshark都显示目标mac地址是server(eth1),但ETH_P_IP上的read()显示与wireshark报告不同的内容。 –

+1

答案更新了,引用了一个类似的问题[这里](http://stackoverflow.com/questions/1637835/packet-sniffing-using-raw-sockets-in-linux-in-c)。 – user1500049

+0

hhmm,所以你说任何mac地址信息应该被忽略,因为你只会对ip层和以上感兴趣? –

相关问题