【问题标题】:Why are there differences between ETH_P_IP and ETH_P_ALL when doing a read()为什么在执行 read() 时 ETH_P_IP 和 ETH_P_ALL 之间存在差异
【发布时间】: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


    【解决方案1】:

    对于 ETH_P_IP 案例,您所描述的内容听起来像是正常的“路由”场景。 (即路由mac是destination mac。)

    如果您的客户端和服务器位于不同的子网/vlan 上,并且中间有一个路由器,那将是有意义的。

    但是,该图表示的是 linux“桥”。 是只做桥接不做路由吗?

    编辑

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

    【讨论】:

    • 没错,它充当了二层桥。客户端和服务器在同一个vlan。在这两种情况下,wireshark 都显示目标 mac 地址是 server(eth1),但 ETH_P_IP 上的read() 显示的内容与wireshark 报告的不同。
    • 答案已更新,引用了一个类似的问题here
    • hhmm,所以你是说应该忽略任何mac地址信息,因为你只对ip层及以上感兴趣?
    • @A G 我不会说忽略,但是根据上面包含的post,ETH_P_IP 会在传入 ip 数据包之后表现。
    • 是的,所以你说 ETH_P_IP 只捕获到 IP 层的可靠信息,如果你想要整个数据包的可靠信息,请使用 ETH_P_ALL
    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多