Мой заголовок Radiotap 802.11 обычно имеет размер 26 байт, и есть 4-байтовый FCS ( Frame Check Sequence) в конце пакета.
Заголовок повторно отправленного пакета уменьшается до 13, и FCS удаляется. поэтому в каждом кадре отсутствует 17 байт. Не просто отсутствует, а полностью изменен заголовок.
Вот пример из Wireshark. Я отправляю кадры 802.11, пакет подтверждения (40 байт) и пакет аутентификации (60 байт), и они изменяются и повторно отправляются ОС. (Я пробовал на Ubuntu и Kali Linux. Такое же поведение). Вы увидите, что 40 60 — это те, которые я отправил, а остальные пакеты удалены по 17 байт, как описано.

Здесь подробнее о пакетах, это флаги заголовка из оригинала пакет, который я отправляю.. (как сказано, 26 байт)

Это измененный заголовок, отправленный ОС.

Обратите внимание, что некоторые флаги, такие как Channel dbm Antenna signal и т. д., являются удалены, а повторные попытки передачи данных TX помечены.
Я использую собственный сетевой адаптер, поддерживающий режим мониторинга, для отправки необработанного пакета. Я знаю, что, поскольку я копирую пакеты аутентификации из другой программы для отправки с помощью моего адаптера, MACTIMESTAMP может быть неправильным или dbm и канал могут быть изменены. (хотя информация о канале/dbm не существует в кадре 802.11)
Почему Linux и Ubuntu делают это? поскольку кадр подтверждения был скопирован со встроенного адаптера, я знаю, что сигнал dbm/channel может быть изменен, но почему ОС отправляет повторно?
Я также пробовал это на Ubuntu 20.04 и Kali Linux. Они оба ведут себя одинаково. Итак, это базовое поведение Linux для повторной отправки необработанных кадров 802.11, отправленных с помощью sendto().
Это пакет подтверждения, который я создаю в C,
Код: Выделить всё
unsigned char acknowledgePacketToIphone7PlusFromTPLINK[] = {
0x00, 0x00, 0x1a, 0x00, 0x2f, 0x48, 0x00, 0x00, 0x49, 0x42, 0xb7, 0x63, 0x00, 0x00, 0x00, 0x00,
0x10, 0x02, 0x99, 0x09, 0xa0, 0x00, 0xd2, 0x01, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x82, 0xd6,
0xb0, 0x18, 0x38, 0x7f, 0x6b, 0x14, 0xdf, 0x38
};
Код: Выделить всё
#include
//initialize data
struct sockaddr_ll ll; // => link layer
struct ifreq ifreq_i;
int sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // => socket is layer 2
//Network Interface Name
memset(&ifreq_i,0,sizeof(ifreq_i)); memset(&ll,0,sizeof(ll));
strncpy(ifreq_i.ifr_name,"wlan1",IFNAMSIZ-1);
if((ioctl(sock_raw,SIOCGIFINDEX,&ifreq_i))
Подробнее здесь: [url]https://stackoverflow.com/questions/78360638/why-does-linux-resend-packet-and-change-headers-raw-sockets-unix[/url]