Порядок следования бит заголовка IP

Я прочитал IP RFC и там говорится, что 4 первых бита заголовка IP — это версия. На чертеже также показано, что биты с 0 по 3 являются версией.

http://tools.ietf.org/html/rfc791#section-3.1

Но когда я смотрю на первый байт заголовка (записанный с помощью pcap lib), я вижу этот байт:

0x45

Это заголовок IP версии 4, но очевидно, что биты с 4 по 7 равны 4, а не с 0 по 3, как я ожидал.

Я ожидал сделать побитовое и первый байт, и 0x0F получит мне версию, но мне кажется, что мне нужно и с 0xF0.

Я что-то пропустил? Понимаете что-то неправильно?

1

Решение

Вы должны прочитать Приложение Б RFC:

Всякий раз, когда октет представляет числовое значение, самый левый бит в
Диаграмма является старшим или старшим значащим битом. То есть немного
помеченный 0 является наиболее значимым битом. Например, следующее
Диаграмма представляет значение 170 (десятичное число).

                        0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|1 0 1 0 1 0 1 0|
+-+-+-+-+-+-+-+-+

Это означает, что все правильно, за исключением вашего предположения, что «первые четыре бита» являются наименее-значительным, в то время как это самый-значительное.

Например. в 7-м и 8-м байтах, содержащих флаги и смещение фрагмента, вы можете разделить их следующим образом (рассмотрите этот псевдокод, даже если он работает на C #):

byte flagsAndFragmentHi = packet[6];
byte fragmentLo = packet[7];
bool flagReserved0 = (flagsAndFragmentHi & 0x80) != 0;
bool flagDontFragment = (flagsAndFragmentHi & 0x40) != 0;
bool flagMoreFragments = (flagsAndFragmentHi & 0x20) != 0;
int fragmentOffset = ((flagsAndFragmentHi & 0x1F) << 8) | (fragmentLo);

Обратите внимание, что более значимая (сдвинутая влево 8-битная) часть смещения фрагмента находится в первом байте (потому что IP работает с прямым порядком байтов). Обычно: биты слева на диаграмме всегда более значимы.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]