Я должен сделать сниффера как присвоение для курса безопасности. Я использую C и pcap библиотеку. Я получил все работающее хорошо (так как я получил код от Интернета и изменил его). Но у меня есть некоторые вопросы о коде.
u_int ip_len = (ih->ver_ihl & 0xf) * 4;
ih
имеет тип ip_header
, и его в настоящее время указание к заголовку IP в пакете.
ver_ihl
дает версию IP.
Я не могу выяснить то, что: & 0xf) * 4;
& - это побитовый оператор and, в этом случае вы обрабатываете ver_ihl с 0xf, что приводит к очистке всех битов, кроме наименее значимого 4
0xff & 0x0f = 0x0f
ver_ihl определяется как первые 4 бита = версия + вторые 4 = длина заголовка Интернет. Операция and удаляет данные версии, оставляя данные длины сами по себе. Длина записывается как количество 32-битных слов, поэтому * 4 превращает ip_len в количество байтов в заголовке
В ответ на ваш комментарий:
поразрядно и возвращает соответствующие биты в операндах. Когда вы и что-нибудь с 0, оно становится 0, а все, что с 1, остается неизменным.
0xf = 0x0f = двоичный 0000 1111
Итак, когда вы и 0x0f с чем-либо, первые 4 бита устанавливаются в 0 (как вы и сравниваете их с 0), а последние 4 бита остаются такими же, как и в другом операнде (как вы их против 1). Это распространенный метод, называемый битовой маскировкой.
Поле ver_ihl содержит два 4-битных целых числа, упакованных как младший и старший младшие байты. Длина указывается как количество 32-битных слов. Итак, если у вас есть IP-кадр версии 4 с 20 байтами заголовка, у вас будет значение поля ver_ihl, равное 69. Тогда у вас будет следующее:
01000101
& 00001111
--------
00000101
Итак, да, «& 0xf» маскирует нижний 4 бита.
Чтение из RFC 791 , который определяет IPv4:
Ниже приводится сводка содержимого интернет-заголовка:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + | Версия | МГП | Тип услуги | Общая длина | + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
Первые 8 бит IP-заголовка представляют собой комбинацию версии и поля IHL .
IHL: 4 бита
Длина интернет-заголовка - это длина интернет-заголовка в 32 битовых словах и, таким образом, указывает на начало данных. Обратите внимание, что минимальное значение для правильного заголовка - 5.
То, что у вас есть, берет первые 8 битов и вырезает часть IHL, а затем преобразует ее в количество байтов. Поразрядное И на 0xF
изолирует поле IHL, а умножение на 4 существует, потому что в 32-битном слове 4 байта.