gpt4 book ai didi

sockets - 为什么在执行 read() 时 ETH_P_IP 和 ETH_P_ALL 之间存在差异

转载 作者:行者123 更新时间:2023-12-03 12:01:26 30 4
gpt4 key购买 nike

我有以下设置:

client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server

当我使用在 linux 网桥上打开一个 RAW 套接字时
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

我将套接字绑定(bind)到 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 读取线路?

最佳答案

对于 ETH_P_IP 情况,您所描述的听起来像是正常的“路由”场景。
(即路由 mac 是目标 mac。)

如果您的客户端和服务器位于不同的子网/vlan 上,并且介于两者之间,那将是有意义的。

但是,该图指示了一个 linux“桥”。
它只做桥接而不做路由吗?

编辑

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

关于sockets - 为什么在执行 read() 时 ETH_P_IP 和 ETH_P_ALL 之间存在差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12783527/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com