2.2.1 IP数据包格式
IP数据包是第3层传输的协议数据单元。IP数据包分为包头和数据区两部分,其中包头部分的各项字段反映了IP协议的工作机制。
IP数据包的具体格式如图2-2所示。
图2-2 IP数据包的格式
下面解释各字段的含义。
● 版本(VERS)号:4 bit,表示IP协议版本号。目前的版本号是4,即IPv4。版本号规定了数据包的格式,不同版本其数据包格式也有所不同。如IPv6的数据包结构就和IPv4的结构不同。
● 包头长度(HLEN):4 bit,表示包头长度。包头长度以4字节为单位计算。除IP选项(IP Options)和填充(Padding)字段可以不存在外,其他各字段必须存在。这些必须存在的字段是5个4 bit,共20字节长。因此包头长度值一般是5。又由于包头长度必须是32 bit的整数倍,所以当一个含有IP选项字段的IP数据包不是32 bit的整数倍时,由填充字段用0补足。
● 服务类型(Service Type):8 bit,指示对本数据包的处理方式,主要用来指示数据包的优先权以及传输类型。它涉及服务质量的内容,这已超出本书的范围,不在这里详述。
● 总长(Total Length):16 bit,以字节为单位表示整个IP数据包长度,包括包头及其携带的数据。因为总长字段是16 bit,所以IP数据包最长可达216-1=65535个字节。
标识(Identification)、标志(Flags)和片偏移(Fragment Offset)这3个字段与IP数据包的传输有关。IP数据包是网络层的数据单元,它需要被封装在第2层的数据帧中来传输。Internet是由各种2层规范不同的网络互连起来的产物,这些不同的网络其帧格式及帧长度各不相同。例如,以太网的帧和令牌环的帧在结构和长度上都不相同。IP数据包在某个2层网络中能够被完全封装,到另一个2层网络中就未必可以。因此,IP数据包有可能被分割,称为“分片(Fragmenting)”,当数据到达目的地时还要对分片进行重组。这3个字段正是对分片和重组进行控制的。
● 标识(Identification):16 bit,是发送者赋予数据包的标识符,接收者利用这个信息和源地址判断收到的分组属于哪个数据包,以便进行重组。所以在分片时,该域必须不加修改地复制到各分片的包头中。
● 标志(Flags):3 bit,只有低两位有效。第1 bit为0时表示该分片是最后一片,如果该位是1表示后面还有分片。第2 bit为0时表示可以对数据包进行分片,如果该位是1表示数据包不能分片。当该位设置为1而帧长度不匹配又必须分片时,设备就会将数据包丢弃并返回错误信息。
● 片偏移(Fragment Offset):指示本分片数据在初始数据包数据区中的偏移量,偏移量以8字节为单位,重组时分片顺序由片偏移提供。
● 生存时间(Time To Live):简称TTL,8 bit。用来控制数据包在网络中存在的时间。目前TTL的值并不代表时间,而是代表经由路由器的个数。数据包每经过一台路由器时,路由器将TTL值减1,一旦TTL=0,系统就丢弃该数据包,并返回错误信息。这样避免了路由出现环路时数据包在路由器之间无休止地循环。
● 协议(Protocol):8 bit,表示该数据包携带的数据是由哪个上层协议封装的,也就是指示传输层的协议类型。比如最常见的协议类型是TCP或UDP。
● 头校验和(Header checksum):16 bit,用于保证IP头数据的完整性。
● 地址(Address):分为源IP地址和目的IP地址,各占32 bit。表明数据的来源及其到达的目的地。
● 选项(IP Options):超出了本书讨论范围,不再赘述。
● 填充(Padding):当IP包头长度不是32 bit的整数倍时需填充0来凑齐32 bit整数倍,没有实际意义。
● 数据(Data):来自第4层的数据段。