1、IP 包头格式|8 | 8 |8 | 8 |版本 头部长度 服务类型 总长度标识符 标记 分片偏移生存时间 协议 头部校验和源地址目的地址可选项 填充项*版本(version)标识了数据包的 IP 版本号。这个 4 位字段的值设置为二进制的 0100表示 IP 版本 4(IPv4) ,设置为 0110 表示 IP 版本 6(IPv6) 。*报头长度(header length)字段长度为 4 位,正如字段名所示,它表示 32 位字长的 IP报头长度。设计报头长度字段是因为数据包的可选项字段的大小会发生变化。IP 报头最小长度为 20 个八位组,最大可以扩展到 60 个八位组通过这个字段也可以描
2、述 32 位字的最大长度。*服务类型(TOS,type of service)字段长度为 8 位,它用来指定特殊的数据包处理方式。服务类型字段实际上被划分为两个子字段:优先级和 ToS。优先级用来设置数据包的优先级,这就像邮寄包裹一样,可以是平信、隔日送到或两日内送到。ToS 允许按照吞吐量、时延、可靠性和费用方式选择传输服务。虽然 ToS 字段通常不用(所有位均被设置为0) ,但是开放式最短路径优先(OSPF )协议的早期规范中还是称为 ToS 路由选择。优先权位偶尔在服务质量(QoS )应用中使用。更详细的信息可以参见 RFC1340 和 RFC1349。*总长度(total length
3、)数据包总长度字段的长度为 16 位,以八位组为单位计,其中包括 IP 报头。接收者用 IP 数据包总长度减去 IP 报头长度,就可以确定数据包数据有效负载的大小。16 位长的二进制数用十进制表示最大可以为 65535,所以 IP 数据包的最大长度是65535。*标识符(identifier)字段长度为 16 位,通常与标记字段和分片偏移字段一起用于数据包的分段。如果数据包原始长度超过数据包所要经过的数据链路的最大传输单元(MTU) ,那么必须将数据包分段为更小的数据包。例如,一个大小为 5000 字节的数据包在穿过网络时,如果遇到一条 MTU 为 1500 字节的数据链路,即数据帧最多容纳大
4、小为 1500 字节的数据包。路由器需要在数据成帧之前将数据包分段成多个数据包,其中每个数据包长度不得超过 1500 字节;然后路由器在每片数据包的标识字段上打上相同的标记,以便接收设备可以识别出属于一个数据包的分段。*标记字段(flag)长度为 3 位,其中第 1 位没有使用。第 2 位是不分段(DF)位。当DF 位被设置为 1 时,表示路由器不能对数据包进行分段处理。如果数据包由于不能被分段而未能被转发,那么路由器将丢弃该数据包并向源点发送错误消息。这一功能可以在网络上用于测试 MTU 值。第 3 位表示还有更多分段(MF)位,当路由器对数据包进行分段时,除了最后一个分段的 MF 位位置为
5、 0 外,其他所有分段的 MF 位均设置为 1,以便接收者直到收到 MF 位为的分段为止。*分片偏移(fragment offset) 字段长度为 13 位,以 8 个八位组为单位,用于指明分段起始点相对于报头起始点的偏移量。由于分片到达时可能错序,所发分片偏移字段可以使接收者按照正确的顺序重组数据包。请注意,如果一个分片在传输中丢失,那么必须在网络中同一点对整个数据包重新分片重新发送。因此,容易发生故障的数据链路会造成时延不成比例。另外,如果由于网络拥塞而造成分片丢失,那么和重传分片会进一步加重网络拥塞。当一个分片在丢失后,一整个数据包会被要求重传,而且是由源地址进行重传,而不是由进行分片的
6、路由器来进行重传。*生存时间(TTL,time to live)字段长度为 8 位,在最初创建数据包时 TTL 即被设置为某个特定值。当数据包逐个沿路由器被传输时,每台路由器都会降低 TTL 值。当 TTL 值减为 0 时,路由器会丢弃该数据包并向源点发送错误信息。这种方法可以防止数据包在网络中无休止的被传输。按照最初构想,TTL 值以 S(秒)为单位。如果数据包在路由器上被延迟的时间超过 1S,路由器将会相应地调整 TTL 值。然而,这种方法实施起来十分困难,从来没有被广泛地支持。现在的路由器不管实际时延是多少,统统将 TTL 值减少 1,所以 TTL 实际上是表示跳数。虽然 TTL 常见的
7、值为 15 和 32,但是建议的缺省值是 64。路由器的 tracert 命令即是使用的这个字段。当数据包从源地址发出时 TTL 值被置为 1,当第一跳路由器收到时,会进行路由,同时 TTL 会减 1,此时会发现 TTL 为 0,则不能正常发送,向源地址传送一个错误信息。这时候源地址接收到错误信息后,会根据该错误信息中的源地址,来判断路由路径中的第一步,这时候,再将 TTL 值置为 2 进行发送,第一跳路由器正常发送,第二跳路由器同样会执行与第一跳路由器同样的操作这样源地址就可以得到路由的传送路径信息。*协议(protocol)字段长度为 8 位,它给出了主机到主机层或传输层协议的“地址”或协
8、议号,协议字段指定了数据包中信息的类型。当前已分配了 100 多个不同的协议号。一些众所周知的协议号协议号 主机到主机层协议(传输层协议)1 ICMP: internet 消息控制协议2 IGMP: internet 组管理协议4 被 IP 协议封装的 IP6 TCP:传输控制协议17 UDP:用户数据报协议45 RSVP:资源预留协议47 GRE:通用路由选择封装54 NHRP:NBMA 下一跳解析协议88 IGRP:internet 网关路由选择协议89 OSPF:开放式最短路径优先*头部校验和(header checksum)是针对 IP 报头的纠错字段。检验和不计算被封装的数据,UDP
9、、TCP 和 ICMP 都有各自的校验各。报头校验和字段包含一个 16 位二进制补码和,这是由数据包发送者计算得到的。接收者将连同原始校验和重新进行 16 位二进制补码和计算。如果数据包传输中没有发生错误,那么结果应该 16 位全部为 1。前面提到过,每台路由器都会降低数据包的 TTL 值,所以每台路由器都必须重新计算校验和。RFC1141 讨论了一些简化计算的策略。*源地址和目的地址(source and destination address)字段长度为 32 位,分别表示发送者数据包源点和目的地址的 IP 地址。*可选项(option)是一个长度可变的字段,并像其名字所表示的,它是可选的
10、。可选项被添加在包头中,包括源点产生的信息和其他路由器加入的信息 ;可选项字段主要用于测试。常用的可选项如下:松散源路由选择(loose source routing)它给出了一连串路由器接口的 IP 地址序列。数据包必须沿着 IP 地址序列传送,但是允许在相继的两个地址之间跳过多台路由器。利用此字段可以穿越做过 NAT 的路由器,可以对私有地址直接发起访问。严格源路由选择(strict source routing)它也给出了一系列路由器接口的 IP 地址序列。不同于松散源路由选择,数据包必要严格按照路由转发。如果下一跳不在列表中,那么将会发生错误。记录路由(record route)当数据包离开时为每台路由器提供空间记录数据包的出站接口地址,以便保存数据包经过的所有路由器的记录。记录路由选项提供了类似于路由追踪的功能,但是不同点在于这里记录了双向路径上的出站接口信息。*填充(padding)该字段通过在可选项字段后面添加 0 来补足 32 位,这样保证报头长度是 32 位的倍数。