加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、前言
    • 二、什么是混杂模式?
    • 三、网卡工作模式
    • 四、Linux下设置
    • 五、Linux下C程序设置网卡混杂模式
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

为什么你的网卡收不到不同网段的数据包?

10/21 11:25
585
阅读需 4 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、前言

最近开发过程中遇到个小问题,板子与客户的模块通过一款交换芯片连接,客户的模块会向我的板子发送组播报文,但是模块和我的板子并在同一个网段,默认情况下,这些数据包会被网卡过滤掉,那么我要如果通过套接字接收网卡上不通网段的数据包呢?

这就涉及到一个知识点,网卡的混杂模式!

二、什么是混杂模式?

混杂模式(Promiscuous mode),简称 Promisc mode,俗称监听模式。

在 IEEE 802 定的网络规范中,每个网络帧都有一个目的MAC地址

非混杂模式下
网卡只会接收目的MAC地址是它自己的单播帧,以及多播及广播帧;

混杂模式下
网卡会接收经过它的所有帧!

混杂模式是指一台主机能够接受所有经过它的数据流,不论这个数据流的目的地址是不是它,它都会接受这个数据包。

也就是说,混杂模式下,网卡会把所有的发往它的包全部都接收。

在这种情况下,可以接收同一集线器局域网的所有数据。

三、网卡工作模式

网卡工作模式有4种,分别是:

    广播(Broadcast)
    模式多播(Multicast)
    模式单播模式(Unicast)
    混杂模式(Promiscuous)。

四、Linux下设置

1、设置混杂模式

 ifconfig eth0 promisc

2、取消混杂模式

 ifconfig etho -promisc

3、查询混杂模式

使用ifconfig或者ip命令查看一个网卡是否开启了混杂模式,当输出包含 PROMISC 时,表明该网络接口处于混杂模式。

1) ip
ip link show eth0

在输出中,查找 PROMISC 字样。如果存在,说明该网卡处于混杂模式;如果没有,说明它不在混杂模式。

2) ifconfig
ifconfig ens33

在输出中,查看是否有 PROMISC 字样。

五、Linux下C程序设置网卡混杂模式

如果想通过程序方式打开混杂模式,可以参考下面代码

struct ifreq ethreq;

strncpy(ethreq.ifr_name, "eth0", IFNAMSIZ);
if(ioctl(sock_raw_fd, SIOCGIFFLAGS, &ethreq)!= 0)  //获取eth0网络接口标志
{
 perror("ioctl");
 close(sock_raw_fd);   
 exit(-1);    
}

ethreq.ifr_flags |= IFF_PROMISC;
if(ioctl(sock_raw_fd,SIOCSIFFLAGS,&ethreq)!=0)   //设置eth0网络接口标志
{
 perror("ioctl");
 close(sock_raw_fd);   
 exit(-1);
}

 

相关推荐

电子产业图谱

公众号『一口Linux』号主彭老师,拥有15年嵌入式开发经验和培训经验。曾任职ZTE,某研究所,华清远见教学总监。拥有多篇网络协议相关专利和软件著作。精通计算机网络、Linux系统编程、ARM、Linux驱动、龙芯、物联网。原创内容基本从实际项目出发,保持原理+实践风格,适合Linux驱动新手入门和技术进阶。