Разложение заголовка IP

Я должен сделать сниффера как присвоение для курса безопасности. Я использую C и pcap библиотеку. Я получил все работающее хорошо (так как я получил код от Интернета и изменил его). Но у меня есть некоторые вопросы о коде.

u_int ip_len = (ih->ver_ihl & 0xf) * 4;   

ih имеет тип ip_header, и его в настоящее время указание к заголовку IP в пакете.
ver_ihl дает версию IP.
Я не могу выяснить то, что: & 0xf) * 4;

5
задан Gilles 'SO- stop being evil' 1 October 2012 в 18:37
поделиться

3 ответа

& - это побитовый оператор 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). Это распространенный метод, называемый битовой маскировкой.

http://en.wikipedia.org/wiki/Bitwise_operation#AND

3
ответ дан 15 December 2019 в 00:57
поделиться

Поле ver_ihl содержит два 4-битных целых числа, упакованных как младший и старший младшие байты. Длина указывается как количество 32-битных слов. Итак, если у вас есть IP-кадр версии 4 с 20 байтами заголовка, у вас будет значение поля ver_ihl, равное 69. Тогда у вас будет следующее:

  01000101
& 00001111
  --------
  00000101

Итак, да, «& 0xf» маскирует нижний 4 бита.

0
ответ дан 15 December 2019 в 00:57
поделиться

Чтение из 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 байта.

1
ответ дан 15 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

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