2013-12-08 5 views
0

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

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

Но когда я смотрю на первый байт заголовка (как захвачено с использованием PCAP ОМТ) Я вижу этот байт:

0x45

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

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

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

+1

Похоже на то, что и проблема (http://en.wikipedia.org/wiki/Endianness). – erenon

+1

Я тоже думал об эндианнах, но понял, что он добился правильного результата. @Mormegil ответ правильный. –

+2

Обратите внимание, что «endianness» sensu stricto относится к упорядочению _bytes_ в более крупных структурах, а не к нумерации _bits_ внутри байта. – Mormegil

ответ

4

Вы должны прочитать Appendix B в RFC:

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

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

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

E.g. в 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 работает в большом конце). Как правило: биты слева на диаграмме всегда более значительны.

+0

Чтобы быть понятным, это только для числовых полей? Поле flags - это младшие разряды, хотя оно отображается в левых битах байта? Но седьмой байт состоит из обоих флагов и части числового поля, смещения фрагмента. Не могли бы вы прояснить это? – selalerer

+1

Я приложил пример. И нет, флаги являются высокими (более значительными) битами, потому что они появляются в левом (нижнем числе) битах на диаграмме. – Mormegil

+0

Спасибо. Это прояснилось для меня :-) – selalerer

Смежные вопросы