以下内容摘自笔者编著的《网管员必读——网络测试、监控和实验》一书。
3.3 IP协议头格式和Sniiffer Portable的IP头
IP
(
Internet Protocol
,因特网协议)是
OSI
第三层——网络层协议,本节仅以
IPv4
版本为例进行介绍。
IP
协议也是一个无连接的协议,主要就是负责在主机间寻址,并为数据包设定路由,在交换数据前它并不建立会话。因为它不保证正确传递。另一方面,数据在被收到时,
IP
不需要收到确认,所以它是不可靠的。
3.3.1 IP协议头格式
数据在经过
IP
网络层时,也会对数据进行封装,也就有相应的
IP
协议包头了。
在以太网帧中,
IPv4
包头紧跟着以太网帧头,同时以太网帧头中的协议类型值设置为
十六进制的
0800
。
它的基本格式如图
3-12
所示。
n
版本(
Version
)
指定
IP
协议的版本号。因为目前仍主要使用
IPv4
版本,所以这里的值通常是
0x4 (
注意封包使用的数字通常都是十六进位的
)
。
占
4
位。
图
3-12 IP
协议头格式
n
包头长度(
Internet
Header
Length
,
IHL
)
指明
IPv4
协议包头长度的字节数包含多少个
32
位。由于
IPv4
的包头可能包含可变数量的可选项,所以这个字段可以用来确定
IPv4
数据报中数据部分的偏移位置。
IPv4
包头的最小长度是
20
个字节,因此
IHL
这个字段的最小值用十进制表示就是
5
。占
4
位。
由于它是一个
4
比特字段,因此首部最长为
60
个字节,但实际上目前最多仍为
24
个字节。
n
服务类型(
Type of Service
,
TOS
)
定义
IP
封包在传送过程中要求的服务类型
,
共由
8
个
bit
组成其中每个
bit
的组合分别代表不同的意思
。
4bit
中只能置其中
1bit
。如果所有
4bit
均为
0
,那么就意味着是一般服务。
具体如下:
Ø
000.....
(
Routine
):
过程字段,占
3
位。设置了数据包的重要性,取值越大数据越重要,取值范围为:
0
(正常)
~ 7
(网络控制)
Ø
...0....
(
Delay
):
延迟字段
,占
1
位,
取值:
0
(正常)、
1
(期特低的延迟)
Ø
....0...
(
Throughput
):
流量字段,占
1
位。取值:
0
(正常)、
1
(期特高的流量)
Ø
.....0..
(
Reliability
)
:
可靠性字段,占
1
位。取值:
0
(正常)、
1
(期特高的可靠性)
Ø
…..0.
(
ECN-Capable Transport
):
显式拥塞指示传输
字段,占
1
位。
由源端设置,以显示源端节点的传输协议是支持
ECN
(
Explicit Cogestion Notifica tion
,显式拥塞指示
)的。
取值:
0
(不支持
ECN
)、
1
(支持
ECN
)
Ø
.......0
(
Congestion Experienced
):
拥塞预警字段,
占
1
位。取值:
0
(正常,不拥塞)、
1
(拥塞)
n
包长度(
Total
Length
,
TL
)
指定
IP
包的总长,
通常以
byte
做单位来表示该封包的总长度此数值包括标头和数据的总和。
它
以字节为单位,
占
16
位。
利用首部长度字段和总长度字段,就可以知道
IP
数据报中数据内容的起始位置和长度。
【
经验之谈
】
由于该字段长
16
比特,所以
IP
数据报最长可达
65535
字节。尽管可以传送一个长达
65535
字节的
IP
数据报,但是大多数的链路层都会对它进行分段。而且,主机也要求不能接收超过
576
字节的数据报。由于
TCP
把用户数据分成若干段,因此一般来说这个限制不会影响
TCP
。
UDP
的应用(如
RIP
、
TFTP
、
BOOTP
、
DNS
、
SNMP
等),都限制用户数据报长度为
512
字节,小于
576
字节。但是,事实上现在大多数的实现允许超过
8192
字节的
IP
数据报。
总长度字段是
IP
首部中必要的内容,因为一些数据链路(如
以太网
)需要填充一些数据以达到最小长度。尽管
以太网
的最小帧长为
46
个字节(将在本章后面介绍),但是
IP
数据可能会更短。如果没有总长度字段,那么
IP
层就不知道
46
字节中有多少是
IP
数据报的内容。
n
标识(
Identification
)
每一个
IP
封包都有一个
16
位的唯一识别码。当程序产生的数据要通过网络传送时都会被拆散成封包形式发送,当封包要进行重组的时候这个
ID
就是依据了。占
16
位。
标识字段唯一地标识主机发送的每一份数据报。通常每发送一份消息它的值就会加
1
。
RFC
791
认为标识字段应该由让
IP
发送数据报的上层来选择。假设有两个连续的
IP
数据报,其中一个是由
TCP
生成的,而另一个是由
UDP
生成的,那么它们可能具有相同的标识字段。尽管这也可以照常工作(由重组算法来处理),但是在大多数从伯克利派生出来的系统中,每发送一个
IP
数据报,
IP
层都要把一个内核变量的值加
1
,不管交给
IP
的数据来自哪一层。内核变量的初始值根据系统引导时的时间来设置。
n
标记(
Flags
)
这是当封包在传输过程中进行最佳组合时使用的
3
个
bit
的识别记号。占
3
位。
Ø
000
(
Reserved Fragment
):保留分段。当此值为
0
的时候表示目前未被使用。
Ø
.0.
(
Don't Fragment
):不分段。当此值为
0
的时候表示封包可以被分段,如果为
1
则不能被分割。
Ø
..0
(
More Fragment
):更多分段。当上一个值为
0
时,此值为
0
就示该封包是最後一个封包,如果为
1
则表示其後还有被分割的封包。
n
分段偏移(
Fragment Offset
,
FO
)
当封包被分段之后,由于网路情况或其它因素影响其抵达顺序不会和当初切割顺序一至,所以当封包进行分段的时候会为各片段做好定位记录,以便在重组的时候就能够对号入座。值为多少个字节,如果封包并没有被分段,则
FO
值为
“0”
。
占
13
位。
n
生存时间(
Time To Live
,
TTL
)
生存时间字段设置了数据报可以经过的最多路由器数,
表示数据包在网络上生存多久。
TTL
的初始值由源主机设置(通常为
32
或
64
),一旦经过一个处理它的路由器,它的值就减去
1
。当该字段的值为
0
时,数据报就被丢弃,并发送
ICMP
消息通知源主机。
这样当封包在传递过程中由於某些原因而未能抵达目的地的时候就可以避免其一直充斥在网路上面。占
8
位。
n
协议(
Protocol
,
PROT
)
指该封包所使用的网络协议类型,如
ICMP
、
DNS
等。占
8
位。各协议对应的值如表
3-1
所示。
表
3-1
协议号
协议号
|
协议
|
协议号
|
协议
|
00
|
IP
|
22
|
XNS-IDP
|
01
|
ICMP
|
27
|
RDP
|
02
|
IGMP
|
29
|
ISO-TP4
|
03
|
GGP
|
36
|
XTP
|
04
|
IP-ENCAP
|
37
|
DDP
|
05
|
ST
|
39
|
IDPR-CMTP
|
06
|
TCP
|
73
|
RSPF
|
08
|
EGP
|
81
|
VMTP
|
12
|
PUP
|
89
|
OSPFIGP
|
17
|
UDP
|
94
|
IPIP
|
20
|
HMP
|
98
|
ENCAP
|
n
头校验和(
Header checksum
)
指
IPv4
数据报包头的校验和。
这个数值用来检错用的,用以确保封包被正确无误的接收到。当封包开始进行传送后,接收端主机会利用这个检验值会来检验余下的封包,如果一切无误就会发出确认信息表示接收正常。与
UDP
和
TCP
协议包头中的校验和作用是一样的。占
16
位。
【
经验之谈
】
首部检验和字段是根据
IP
首部计算的检验和码,不对首部后面的数据进行计算。
ICMP
、
IGMP
、
UDP
和
TCP
协议在它们各自的首部中均含有同时覆盖首部和数据检验和码。
为了计算一份数据报的
IP
检验和,首先把检验和字段置为
0
。然后,对首部中每个
16
位进行二进制反码求和(整个首部看成是由一串
16
位的字组成),结果存在检验和字段中。当接收端收到一份
IP
数据报后,同样对首部中每个
16
位进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全
1
。如果结果不是全
1
(即检验和错误),那么
IP
就丢弃收到的数据报。但是不生成差错消息,由上层去发现丢失的数据报并进行重传。
ICMP
、
IGMP
、
UDP
和
TCP
都采用相同的检验和算法,尽管
TCP
和
UDP
除了本身的首部和数据外,在
IP
首部中还包含不同的字段。由于路由器经常只修改
TTL
字段(减
1
),因此当路由器转发一份消息时可以增加它的检验和,而不需要对
IP
整个首部进行重新计算。
n
源地址(
Source Address
,
SA
)
发送
IP
数据包的
IP
地址。占
32
位。
n
目的地址(
Destination Address
)
接收
IP
数据包的
IP
地址。也占
32
位。
n
选项(
Options
)
+
填充(
Padding
)
这两个选项较少使用,只有某些特殊的封包需要特定的控制才会利用到。共
32
位。这些选项通常包括:
Ø
安全
和处理限制:用于军事领域
Ø
记录路径:让每个路由器都记下它的
IP
地址
Ø
时间戳:让每个路由器都记下它的
IP
地址和时间
Ø
宽松的源站选路:为数据报指定一系列必须经过的
IP
地址
Ø
严格的源站选路:与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址。
以上这些选项很少被使用,而且并非所有的主机和路由器都支持这些选项。选项字段一直都是以
32
位作为界限,在必要的时候插入值为
0
的填充字节。这样就保证
IP
首部始终是
32
位的整数倍(这是首部长度字段所要求的)。
从以上
IP
包头格式可以看出,
IP
协议包头大小也有两种:当没有“选项”这个字段时,为
160
位,
20
个字节;当有“选项”字段时为
192
位,
24
个字节。它与
TCP
协议包头大小是一样的。