為什么你的網卡收不到不同網段的數據包?

一、前言
最近開發過程中遇到個小問題,
板子與客戶的模塊通過一款交換芯片連接,客戶的模塊會向我的板子發送組播報文,
但是模塊和我的板子并在同一個網段,
默認情況下,這些數據包會被網卡過濾掉,
那么我要如果通過套接字接收網卡上不通網段的數據包呢?
這就涉及到一個知識點,網卡的混雜模式!
二、什么是混雜模式?
混雜模式(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, ðreq)!= 0) //獲取eth0網絡接口標志
{
perror("ioctl");
close(sock_raw_fd);
exit(-1);
}
ethreq.ifr_flags |= IFF_PROMISC;
if(ioctl(sock_raw_fd,SIOCSIFFLAGS,ðreq)!=0) //設置eth0網絡接口標志
{
perror("ioctl");
close(sock_raw_fd);
exit(-1);
}
獲取更多linux學習資料
后臺回復:1024
歡迎關注公眾號:一口Linux

浙公網安備 33010602011771號