IP首部中有4bit用于表示首部长度,其单位是4个字节,所以,IP首部的最大长度是15*4=60字节(4bit最大可以表示到15),而IP固定首部的长度是20字节,所以一个IP首部最大允许有40字节长度的选项。
IP选项有两种格式 单字节和多字节
对于多字节选项,其长度有length字段标识,另外其Optiondata并不是从32bit的边界开始的。
Length字段
选项长度,包括type和length
Pointer字段
选项开端起算的偏移量,有一些特殊用途,初始值为1(不是0)
Type字段
每个IP选项都含有一个8bit的Type字段,该字段 又可以进一步分为三个字段:
若copied字段被设定,则在数据报文需要分段时,该字段要拷贝到每一个分段。
class字段根据四条准则对子选项进行分类。
宏IPOPT_COPIED、IPOPT_CLASS、IPOPT_NUMBER可以分别取出字段copied、class和number。
End of Option List //当IP选项的大小不是4字节的倍数时,传送者会以IPOPT_END(是End of Option List在内核源码中所用的符号)选项为IP报头补白,使其对齐4字节边界。 No Operation //可用于填补选项之间的空白,比如,为了让后续的IP选项对齐特定边界。 Source Route //包含后续跳点所用的路由器地址。当路由器宕机,较高层协议会计算出新的来源地路由,然后重送该数据包。 //来源地路由包含两种类型: // ⑴ 严格的(Strict Source Route):传送者必须列出路径上每台路由器的IP地址,而且沿途都不能修改,必须按照列表上的路由地址进行传送。 // ⑵ 松散的(Loose Source Route):在传送过程中,一台中间路由可以使用另一台路由器(不再列表中),作为通向列表中下一个路由器的路径。 Record Route //是请求发送方和目的地之间的路由器存储他们用于转发封包时所用的外出接口的IP地址。 Timestamp : //Subtype有三种类型: //⑴ RECORD TIMESTAMPS : 每个路由器会记录其收到封包时的时间。 //⑵ RECORD ADDRESS AND TIMESTAMPS :类似上一个命令,但也会存储接收接口的IP地址。 //⑶ RECORD TIMESTAMPS ONLY AT THE PRESPECIFIED SYSTEMS :每个路由器在接收到封包时都会记录接收时间,但是只针对传送者选择的一些特定IP地址。 Router Alter //把封包标记成需要特殊处理,他试图为封包数据流建立更好的QoS。
不带选项的IP报头的大小是20字节。当IP报头的大小不是20字节时,必须使用IPOPT_END补白。
IPOPT_NOOP用于填补(为对齐4字节边界而导致的)选项之间的空白。
来源地路由是一个多字节选项。此选项中,发送节点会列出后续几跳的IP地址(不能超过IP报头的最大长度)。如果列表中有某台主机宕机了,则必须重新计算来源地路由,重新发送,而不是使用动态路由。
来源地路由分为 严格的来源地路由Strict Source Route和宽松的来源地路由Loose Source Route
Strict Source Route:
列出沿途需要经过的每一台路由的IP地址,沿途不得修改
Loose Source Route
中间的某台路由,可以使用另一台不再列表中的路由来将报文传递给列表中的下一路由。如列表为A->B->C->D,对于Loose Source Route来说,B可以通过不再列表中的路由如F,来将报文传给C。 即A->B->F(不在列表中)->C->D
将报文经过的路由的IP地址(最多9个,超过时保存前9个)保存起来。
第四个字节,分为Overflow子字段和SubType子字段。
在报文传输中,每当IP选项溢出(超过40字节),Overflow加一,由于Overflow本身就会溢出(大于15此选项溢出时),因为每次Overflow溢出时,会发送ICMP报文。
Subtype有三种类型:
⑴ RECORD TIMESTAMPS : 每个路由器会记录其收到封包时的时间。
⑵ RECORD ADDRESS AND TIMESTAMPS :类似上一个命令,但也会存储接收接口的IP地址。
⑶ RECORD TIMESTAMPS ONLY AT THE PRESPECIFIED SYSTEMS :每个路由器在接收到封包时都会记录接收时间,但是只针对传送者选择的一些特定IP地址。
原文地址:http://blog.csdn.net/windeal3203/article/details/45721137