一、前言
最近開(kāi)發(fā)過(guò)程中遇到個(gè)小問(wèn)題,板子與客戶(hù)的模塊通過(guò)一款交換芯片連接,客戶(hù)的模塊會(huì)向我的板子發(fā)送組播報(bào)文,但是模塊和我的板子并在同一個(gè)網(wǎng)段,默認(rèn)情況下,這些數(shù)據(jù)包會(huì)被網(wǎng)卡過(guò)濾掉,那么我要如果通過(guò)套接字接收網(wǎng)卡上不通網(wǎng)段的數(shù)據(jù)包呢?
這就涉及到一個(gè)知識(shí)點(diǎn),網(wǎng)卡的混雜模式!
二、什么是混雜模式?
混雜模式(Promiscuous mode),簡(jiǎn)稱(chēng) Promisc mode,俗稱(chēng)監(jiān)聽(tīng)模式。
在 IEEE 802 定的網(wǎng)絡(luò)規(guī)范中,每個(gè)網(wǎng)絡(luò)幀都有一個(gè)目的MAC地址。
非混雜模式下
網(wǎng)卡只會(huì)接收目的MAC地址是它自己的單播幀,以及多播及廣播幀;
混雜模式下
網(wǎng)卡會(huì)接收經(jīng)過(guò)它的所有幀!
混雜模式是指一臺(tái)主機(jī)能夠接受所有經(jīng)過(guò)它的數(shù)據(jù)流,不論這個(gè)數(shù)據(jù)流的目的地址是不是它,它都會(huì)接受這個(gè)數(shù)據(jù)包。
也就是說(shuō),混雜模式下,網(wǎng)卡會(huì)把所有的發(fā)往它的包全部都接收。
在這種情況下,可以接收同一集線(xiàn)器局域網(wǎng)的所有數(shù)據(jù)。
三、網(wǎng)卡工作模式
網(wǎng)卡工作模式有4種,分別是:
- 廣播(Broadcast)
- 模式多播(Multicast)
- 模式單播模式(Unicast)
- 混雜模式(Promiscuous)。
四、Linux下設(shè)置
1、設(shè)置混雜模式
?ifconfig?eth0?promisc
2、取消混雜模式
?ifconfig?etho?-promisc
3、查詢(xún)混雜模式
使用ifconfig或者ip命令查看一個(gè)網(wǎng)卡是否開(kāi)啟了混雜模式,當(dāng)輸出包含 PROMISC 時(shí),表明該網(wǎng)絡(luò)接口處于混雜模式。
1) ip
ip?link?show?eth0
在輸出中,查找 PROMISC 字樣。如果存在,說(shuō)明該網(wǎng)卡處于混雜模式;如果沒(méi)有,說(shuō)明它不在混雜模式。
2) ifconfig
ifconfig?ens33
在輸出中,查看是否有 PROMISC 字樣。
五、Linux下C程序設(shè)置網(wǎng)卡混雜模式
如果想通過(guò)程序方式打開(kāi)混雜模式,可以參考下面代碼
struct?ifreq?ethreq;
strncpy(ethreq.ifr_name,?"eth0",?IFNAMSIZ);
if(ioctl(sock_raw_fd,?SIOCGIFFLAGS,?ðreq)!=?0)??//獲取eth0網(wǎng)絡(luò)接口標(biāo)志
{
?perror("ioctl");
?close(sock_raw_fd);???
?exit(-1);????
}
ethreq.ifr_flags?|=?IFF_PROMISC;
if(ioctl(sock_raw_fd,SIOCSIFFLAGS,ðreq)!=0)???//設(shè)置eth0網(wǎng)絡(luò)接口標(biāo)志
{
?perror("ioctl");
?close(sock_raw_fd);???
?exit(-1);
}