我有以下设置:
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)。
当我执行 aread()
时,读取的数据的前 6 个字节是目标 mac 地址,正确读取为 server(eth1)。
但是,当我将语句更改为
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));
当我执行 aread()
时,读取的数据的前 6 个字节显示目标 mac 地址是 linux bridge (eth2)。
为什么会这样?内核或以太网卡驱动程序是否将其自己的 MAC 地址放入缓冲区而不是使用 ETH_P_IP 读取线路?