首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在执行read()时ETH_P_IP和ETH_P_ALL会有差异

问为什么在执行read()时ETH_P_IP和ETH_P_ALL会有差异
EN

Stack Overflow用户
提问于 2012-10-08 22:13:59
回答 1查看 21.3K关注 0票数 4

我有以下设置:

代码语言:javascript
复制
client(eth0) --- (eth2) linux bridge (eth1) --- (eth1) server

当我在linux桥上打开一个原始套接字时

代码语言:javascript
复制
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));

我将套接字绑定到eth2。当客户端向服务器发送分组时,在网桥上运行的wireshark报告具有客户端的源mac地址(Eth0)和服务器的目的mac地址(Eth1)的分组。

当我执行read()时,读取的数据的前6个字节是目的mac地址,它被正确地读取为服务器(Eth1)。

但是,当我将语句更改为

代码语言:javascript
复制
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));

当我执行read()时,读取的数据的前6个字节显示目的mac地址是linux网桥(eth2)。

为什么会这样呢?内核或以太网卡驱动程序是否将自己的mac地址放在缓冲区中,而不是使用ETH_P_IP从线路上读取?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-09 09:11:32

对于ETH_P_IP来说,您所描述的听起来像是一个普通的“路由”场景。(即路由mac是目的地mac。)

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

然而,图中显示的是linux的“桥”。它是不是只做桥接,根本不做路由?

编辑

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12783527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档