Я прочитал 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.
Я что-то пропустил? Понимаете что-то неправильно?
Вы должны прочитать Приложение Б 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 работает с прямым порядком байтов). Обычно: биты слева на диаграмме всегда более значимы.
Других решений пока нет …