Подтвердить что ты не робот

Доступ к беспроводному интерфейсу (802.11) на уровне MAC (Linux)

Я провел последние дни, просматривая man-страницы, документацию и все остальное, что было придумано google, но я полагаю, что теперь я еще больше смущен, чем был в начале.

Вот что я хочу сделать: я хочу отправлять и получать пакеты данных со своим собственным 3-х протоколом уровня через беспроводной интерфейс (802.11) в системах Linux с C/С++. Все идет нормально. Я не нуждаюсь в маяках, ассоциации или каких-либо связанных с AP/SSID вещах. Тем не менее, для передачи данных я бы хотел, чтобы уровень MAC работал "как обычно", что означает, что одноадресные пакеты ACK'd, повторные передачи, отсрочка и т.д. Я также хотел бы пользоваться расширенными возможностями QoS (802.11e с 4 очередями и разные категории доступа). С другой стороны, режим размножения не вызывает беспокойства, мне нужны только широковещательные пакеты и пакеты, отправленные на конкретную станцию.

Каким будет правильный путь? Большая часть документации по доступу к сырцовому сокету, похоже, сосредоточена на сетевом обнюхивании, и это не помогает. Я уже некоторое время играю в режиме монитора, но из того, что я читал до сих пор, полученные пакеты не ACK'd в режиме мониторинга и т.д. Без режима мониторинга, какова будет альтернатива? Использование ad hoc mode и unix raw сокетов? Или мне нужно возиться с драйверами?

Я не ищу полного решения, просто хорошие идеи, с чего начать. Я прочитал страницы руководства для сокета (2), сокета (7) и пакета (7), но это не помогло в отношении поведения уровня MAC в разных режимах.

Спасибо заранее.

4b9b3361

Ответ 1

802.11 - это спецификация протокола уровня 2 (и 1). Он был разработан таким образом, что позволяет протоколам более высокого уровня рассматривать его как сеть Ethernet. Адресация и поведение, как правило, одинаковы. Поэтому для протокола уровня 3 вы вообще не должны беспокоиться о 802.11 и писать свой код так, как если бы вы ожидали его запуска в сети Ethernet.

Чтобы он работал, вы должны сначала подключиться к какой-либо беспроводной сети (что в принципе эквивалентно подключению провода к Ethernet-карте). Здесь вы можете выбрать ad-hoc (aka IBSS) или инфраструктуру (aka BSS) (или PBSS после утверждения 802.11ad;).

Операционные карты без какой-либо ассоциации с сетью (просто выплевывая пакеты в эфире) не являются хорошей идеей по нескольким причинам. Самое главное, что это очень зависимое и ненадежное оборудование. Вы все еще можете сделать это с помощью интерфейса RF mon (режим контроля AKA) с одной стороны и впрыска пакета (с использованием заголовка радиоисточника), но я не рекомендую это делать. Даже если у вас есть набор одинаковых карт, скорее всего, вы столкнетесь с трудностями для объяснения и случайного поведения в какой-то момент. Сетевые интерфейсы 802.11 просто не предназначены для такого рода операций и поддерживают разное состояние встроенного программного обеспечения (читайте о картах FullMAC и SoftMAC). Даже карты SoftMAC значительно отличаются. Например, теоретически в режиме мониторинга, как вы сказали, карта не должна принимать ACK пакеты. Есть карты, которые все равно будут получать ACK, потому что они основывают свое решение исключительно на том факте, что указанный кадр адресован им. Некоторые карты могут даже пытаться активировать все кадры, которые они видят. Подобное будет происходить с повторными передачами: некоторые карты отправят инъецированный пакет только один раз (как он должен работать). В других сетевых адаптерах повторные передачи обрабатываются аппаратным обеспечением (и прошивкой), и драйвер не может отключить его, поэтому вы получите автоматическую повторную передачу даже с введенными данными.

Придерживание уровня 3 и использование существующих режимов (например, ad hoc) даст вам все возможности, которые вы хотите и многое другое (QoS и т.д.). Кадр Ethernet, который вы отправляете на интерфейс, будет "переведен" ядром в формат 802.11 с отображением QoS и т.д.

Если вы хотите узнать о поведении MAC в разных режимах, вам придется либо прочитать код mac80211, либо сам стандарт 802.11. http://linuxwireless.org wiki помогите вам в нескольких вещах, но хакеры ядра обычно заняты написанием документации, отличной от комментариев в коде;)

Сама реализация протокола L3 также может выполняться либо в режиме ядра, либо в пользовательском режиме (с использованием сырых сокетов). Как обычно, стороне ядра будет сложнее, но более мощным.

Ответ 2

Поскольку вы хотите создать собственный протокол сетевого уровня (замена для IP), ключевым словом является "raw ethernet socket". Поэтому игнорируйте материал "Raw IP socket".

С чего начать:

int sockfd = socket( PF_PACKET, SOCK_RAW, htons(XXX) ); 

Правильная страница руководства: пакет (7).

Найдите больше информации по googling с ключевым словом. Один довольно полный пример здесь.

Ответ 3

Возможно, вам нужно что-то вроде libpcap.

Libpcap позволяет читать/вставлять сырые пакеты из/в сетевой интерфейс.

Ответ 4

Похоже, вы смешиваете медиа и транспортные слои.

802.11 - это то, что обычно называют словом "ссылка", "физический" или "медиа", что означает, что он касается только передачи исходных дейтаграмм.

Понятия, такие как ACK, повторные передачи, отключение (управление потоком), применяются к слою "транспорт", и эти конкретные термины тесно связаны с TCP/IP.

Реализация вашего собственного полного транспортного слоя с нуля очень сложна и почти наверняка не то, что вы хотите сделать. Если вместо этого вы хотите использовать существующий стек TCP/IP поверх собственной пользовательской интерпретации 802.11, вам, вероятно, потребуется создать виртуальный сетевой интерфейс. Это будет действовать как посредник между TCP/IP и медиа-уровнем.

Надеюсь, это даст вам лучший контекст и ключевые слова для поиска.