【发布时间】:2012-10-08 14:13:58
【问题描述】:
我有以下设置:
client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server
当我在 linux 网桥上打开一个 RAW 套接字时使用
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
我将套接字绑定到 eth2。当客户端向服务器发送数据包时,桥上运行的wireshark会报告该数据包的源mac地址为client(eth0),目的mac地址为server(eth1)。
当我执行read()时,读取的数据的前6个字节是目标mac地址,正确读取为server(eth1)。
但是当我将语句更改为
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
当我执行read() 时,读取的数据的前 6 个字节显示目标 mac 地址是 linux bridge (eth2)。
为什么会这样?内核或以太网卡驱动程序是否将自己的 MAC 地址放入缓冲区,而不是使用 ETH_P_IP 读取线路?
【问题讨论】:
标签: sockets ethernet raw-sockets raw-ethernet