我读了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。
我错过了什么吗?理解错误的东西?
答案 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以大端工作)。通常:图中左侧的位总是更重要。