IP头位顺序不清楚

时间:2013-12-08 15:40:32

标签: c++ c ip pcap

我读了IP RFC,并在那里说IP头的4个第一位是版本。在图中,它还显示位0到3是版本。

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

但是当我查看标题的第一个字节时(使用pcap lib捕获),我看到这个字节:

0×45

这是版本4 IP头,但显然第4到7位等于4而不是我预期的第0到3位。

我期望按位进行第一个字节,0x0F会得到我的版本,但似乎我需要和0xF0。

我错过了什么吗?理解错误的东西?

1 个答案:

答案 0 :(得分:5)

您应该阅读RFC的Appendix B

  

每当一个八位字节表示数字量时,最左边的位数   图是高阶或最高有效位。就是这个位   标记为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以大端工作)。通常:图中左侧的位总是更重要。