使用sendto发送二层802.11帧重复发包问题求助
二层Raw套接字发送802.11帧重复发送问题
问题背景
- 将Alfa Awus适配器通过
iwconfig wlanAdapter mode monitor设置为监听模式 - 编写C语言代码使用PF_PACKET类型的二层Raw套接字发送802.11认证帧,
sendto()执行后会触发重复发送数据包
代码实现
#include <stdio.h> #include <linux/if_packet.h> #include <net/ethernet.h> //更多头文件 void wpaHandshakeStart(){ //初始化数据 struct sockaddr_ll ll; // => 链路层 struct ifreq ifreq_i; int sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // => 套接字为二层 //网络接口名称 memset(&ifreq_i,0,sizeof(ifreq_i)); memset(&ll,0,sizeof(ll)); strncpy(ifreq_i.ifr_name,"wlx00181a0e1066",IFNAMSIZ-1); if((ioctl(sock_raw,SIOCGIFINDEX,&ifreq_i))<0) printf("indeks ioctl okumasında hata"); //获取索引名称 printf("indeks=%d\n",ifreq_i.ifr_ifindex); ll.sll_ifindex = ifreq_i.ifr_ifindex; ll.sll_protocol = htons(ETH_P_ALL); ll.sll_family = PF_PACKET; //绑定套接字到接口 if(bind(sock_raw, (struct sockaddr *)&ll, sizeof(ll)) == -1){ printf("Err: bind failed %d\n", errno); } unsigned char *buffer = (unsigned char *)malloc(65526); //memset(&buffer, '\0', 65511); //初始化完成,发送认证消息并等待...推荐等待11秒 //发送AUTH请求 int sendlen = sendto(sock_raw, &authFromIphone, sizeof(authFromIphone), 0, 0, 0); //int sendlen = sendto(sock_raw, &authFromIphone, sizeof(authFromIphone), 0, (const struct sockaddr*)&ll, sizeof(struct sockaddr_ll)); if(sendlen < 0) { printf("gönderme hatası....send_len=%d....errno=%d\n", sendlen, errno); return; }else{ printf("AUTH request gonderildi, kod: %d\n", sendlen); } }
注:authFromIphone是头文件中声明的char []或unsigned char []数组
现象细节
- 无论发送什么数据包,都会触发重复发送,第二个包大小比第一个少17字节
- Wireshark抓包示例:
54 1.884994038 7a:29:b6:e6:48:79 HuaweiTechno_e5:61:19 802.11 84 Authentication, SN=253, FN=0, Flags=........C 55 1.885410147 7a:29:b6:e6:48:79 HuaweiTechno_e5:61:19 802.11 67 Authentication, SN=253, FN=0, Flags=........
- 进一步分析:第二个重复包由内核触发,内核会删除所有头部和FCS后重发;手动发送的第一个包仅含RX标志,第二个重发包带TX标志且标记为发送失败的包
已尝试操作
- 更换Kali Linux和Ubuntu系统,问题未解决
- 修改
sendto()最后三个参数为0,无效 - 已杀死NetworkManager,尚未尝试杀死
wpa_supplicant
求助需求
- 明确内核判定发送失败的依据
- 获取解决该重复发送问题的方法
内容的提问来源于stack exchange,提问作者C.Unbay
相关产品推荐
相关产品推荐

