Как точки доступа определяют мощность связанного или не связанного клиента?

1881
Dave

Я не могу понять, как точки доступа определяют мощность сигнала соседних клиентов.

Я не нашел эту информацию ни в одном из учебных пособий по WiFi-пакетам, поэтому могу только предположить, что информация о питании не поступает от клиента, а определяется точкой доступа.

Я знаю приложение под названием aircrack, которое может определить эту информацию, но прежде чем перейти к этому и покопаться, я хотел бы получить представление о том, как рассчитывается мощность. Мои навыки Google не что плохо, поэтому я удивлен, что до сих пор я не смог откопать какую - либо информацию о нем. Конечно, если aircrack может сделать это, эта информация там!

Я надеялся, что пользователи здесь могут указать мне правильное направление?

Что касается щедрости

Я думаю, пришло время попытаться использовать награду. В своих ответах, пожалуйста, опубликуйте все ссылки, которые вы можете найти, которые помогут любому понять, как работает это обнаружение питания. Конкретная информация о том, как это реализовано в aircrack, была бы идеальной!

ОБНОВИТЬ:

На данный момент, используя в качестве примера пакет aircrack-ng, похоже, что значение мощности извлекается из buf [2] в net_read (). Я полагаю, что это значение в конечном итоге исходит от net_cmd, что приводит к парным вызовам к net_send и net_get (). Я думаю, что net_get () читает любую информацию заголовка, отправленную из-за вызова net_send (), и этот заголовок указывает, сколько данных должно быть скопировано в буфер buf [].

Но теперь я не получаю следующее: похоже, что buf [] заполняется вызовом net_read_exact (), который просто читает данные из сокета. Если это так, и если мощность - это деталь драйвера, почему значение мощности в буфере? Если этот буфер действительно заполнен данными сокета, не означает ли это, что питание отправляется клиентом / станцией? Я полагаю, что AP / драйвер отвечает за предоставление информации о питании, точно так же, как все говорили, но только не получайте эту часть.

4
Я всегда думал, что это как-то связано с процентом потерянных пакетов, но, кажется, это делается с помощью [аппаратного обеспечения] (https://en.wikipedia.org/wiki/Received_signal_strength_indication). Alex 10 лет назад 0
AP не нуждается в уровне силы сигнала, чтобы сделать свою работу. BatchyX 10 лет назад 0
@BatchyX Некоторые точки доступа (например, MikroTik) могут быть настроены на отключение клиентов, если уровень сигнала падает ниже указанного порога. Это предназначено для использования при покрытии области с несколькими AP с одним и тем же SSID, так что клиенты, которые переместились в место, лучше охваченное другой AP, вынуждены переключиться на более лучшую AP. Без такого принудительного отключения клиентские станции часто пытаются поддерживать соединение с одной и той же точкой доступа как можно дольше, но переключаются на более низкую скорость передачи данных, что ухудшает обслуживание всех других клиентов, использующих тот же канал. Sergey Vlasov 10 лет назад 0
@SergeyVlasov: Вы можете достичь того же, не рекламируя более медленные ставки. BatchyX 10 лет назад 0

2 ответа на вопрос

4
Breakthrough

Actually, the application which determines this information is airodump-ng, not aircrack-ng. From the airodump-ng documentation, power levels are determined as:

PWR - Signal level reported by the card. Its signification depends on the driver [...]

Well, let's see if we can do better. Looking through the latest source code of the airodump-ng.c file, we see the power gets set in the dump_add_packet(...) function:

/* only update power if packets comes from * the AP: either type == mgmt and SA != BSSID, * or FromDS == 1 and ToDS == 0 */ if (...) ap_cur->power_lvl[ap_cur->power_index] = ri->ri_power; 

After digging through several layers of abstraction, structs, and function pointers, I found that this data is filled from the function linux_read(...) defined in the osdep/linux.c file. This is where the ri_power variable in the ri struct is filled with data, and indeed it does appear to be driver specific.

Most drivers follow the Radiotap standard (as opposed to the older prism54 standard detailed below), which have several predefined fields for determining antenna power, noise, and attenuation. These fields are used directly by airodump-ng to fill in the ri_power variable. Some of these are already available in decibel or power values.

airodump-ng will use either the antenna signal field (in dBm) or the dB antenna signal field (in dB) to compute the displayed signal power. Similar steps are used for the other fields, as they are all predetermined in the Radiotap specification linked to above. For example, the ri_power using the dB Antenna Signal field can be computed as:

case IEEE80211_RADIOTAP_DB_ANTSIGNAL: if(!got_signal) { if( *iterator.this_arg < 127 ) ri->ri_power = *iterator.this_arg; else ri->ri_power = *iterator.this_arg - 255; got_signal = 1; } break; 

As mentioned earlier, some devices follow the (older) prism54 specification (instead of Radiotap), which uses a fixed-length header. In this case, the RX power directly from the buffer (note this is not complete source code, just shows the paths taken to fill ri_power):

if (tmpbuf[7] == 0x40) ri->ri_power = tmpbuf[0x33]; else ri->ri_power = *(unsigned int *)( tmpbuf + 0x5C ); 
Спасибо, я имел в виду aircrack как набор, а не приложение специально. Я должен был обновить мой вопрос после копаться в его исходном коде. Я использую airserv-ng и airodump-ng, и так как он работает на openwrt, ri_power установлен в net_read () в network.c. Сегодня я видел радиоленту, но не думаю, что данные используются специфичной для openwrt реализацией. Я проследил в обратном направлении, чтобы выяснить, где установлен buf [2], поскольку именно отсюда берется значение мощности. Я считаю, что магия происходит в net_get (). Не могли бы вы сказать мне, если вы думаете, что я на правильном пути? Dave 10 лет назад 0
Я собирался отредактировать ваш ответ, но решил, что не должен, на всякий случай - я думаю, вы имели в виду, что airodump-ng будет использовать поля антенн, поскольку airmon-ng используется только для перевода интерфейса в режим монитора. Dave 10 лет назад 0
И спасибо за то, что дали действительно хороший ответ - я не думаю, что я нашел что-то подобное в сети. :) Я чувствую, что я близок к этому, но мне нужно еще немного советов, я думаю. Dave 10 лет назад 0
@ Дейв о вашем втором комментарии, хороший улов. Я отредактировал ответ, но это Super User - вы можете редактировать посты других людей :) Что касается `net_read ()`, я видел некоторые упоминания об этом, но думал, что он использовался только осенью. назад случаи, когда драйвер не определяется как WLAN (или не Radiotap / prism54). Я еще немного покопаюсь, но звучит так, будто ты на правильном пути. Возможно, вы захотите запустить `airodump-ng` в` gdb` и установить точку останова в этой функции, чтобы удостовериться, что это та функция, на которую ссылается вызов функции. Breakthrough 10 лет назад 0
К сожалению, я еще не настроил GDB через Eclipse, чтобы иметь возможность устанавливать точки останова ... это может потребовать небольшой работы. Я запускаю код на маршрутизаторе и нашел информацию о том, как это сделать, но пока не заставил его работать. Когда вы говорите, что драйвер не обнаружен как WLAN, более конкретно, вы говорите, что для параметра option mode в / etc / config / wireless не установлено значение AP? Dave 10 лет назад 0
Я должен был также сказать, что, хотя у меня нет запущенного gdb, я знаю, что вызывается net_read, потому что я помещаю printfs везде, и они появляются. Dave 10 лет назад 0
@ Дэйв Я не могу найти его сейчас, но я вспоминаю, как видел файл с «лестницей» операторов if, в которой последовательно использовался бы другой метод чтения (например, `net_read`, если доступно, затем` linux_read`, если имеется в наличии). Я просто подумал, что net_read является одним из «отступающих» значений, если доступен более продвинутый метод read (например, поддерживающий Radiotap). Breakthrough 10 лет назад 0
Я не видел ничего подобного. Я видел назначения указателей функций в зависимости от ОС, и это все, что касается net_read ... Dave 10 лет назад 0
1
Old Pro

I'm not quite sure what you are asking.

Access points have radio receivers, naturally, and those receivers have analog sections with automatic gain, from which the hardware can derive a received signal strength. The hardware driver then makes this information available to other software in an OS-dependent way.

This is why aircrack makes a big deal about drivers and hardware.

Да, это то, что я пытался сказать в своем вопросе - поскольку его нет в информации о пакете, он должен зависеть от аппаратного обеспечения. Таким образом, большой вопрос - какие инструменты доступны на маршрутизаторе, которые позволили бы мне определить уровень сигнала для любого произвольного клиента, ассоциированного или нет? Dave 10 лет назад 0
Поскольку он не является частью стандарта Wi-Fi, стандартного ответа нет. Доступные инструменты полностью зависят от конкретного маршрутизатора, драйверов и аппаратного обеспечения Wi-Fi. Old Pro 10 лет назад 0

Похожие вопросы