TCP/IP协议栈--IP选项处理(1)


IP选项处理

IP输入函数(ipintr)将在验证分组格式(检验和,长度等)之后,确定分组是否到达目的地之前,对选项进行处理。这表明分组所遇到的每个路由器以及最终的目的主机都对要分组的选项进行处理。

IP分组内可以包含某些在分组被转发或被接收之前处理的可选字段。IP实现可以用任意顺序处理选项。标准IP首部之后最多可跟40字节的选项。

1.选项格式

IP选项字段可能包含0个或多个单独选项。选项有两种类型,单字节和多字节。如图所示:

所有选项都以1字节类型type字段开始。在多字节选项中,类型字段后面紧接着一个长度len字段,其他字段时数据data。许多选项数据字段的第一个字节时1字节的位域offset字段,指向数据字段内的某个字节。长度字节的计算覆盖了类型、长度和数据字段。类型被继续分成三个子字段:1bit备份copied标志,2bit类class字段和5bit数字number字段。下图列出了目前定义的IP选项。前两个选项时单字节选项;其他的是多字节选项。

第1列显示了Net/3的选项常量,第2列和第3列是该类型的十进制和二进制值,第4列是选项的长度。Net/3列显示的是在Net3中由ip_dooptions实现的选项。IP必须自动忽略所有它不识别的选项。其中安全和流ID没有在Net/3中实现,流ID选项时过时的,安全选项主要时美国军方使用。

当Net/3对一个有选项的分组进行分片时,它将检查copied标志位。该标志位之处是否把所有选项都备份到每个分片的IP首部。class字段把相关的选项按下图进行分组,除时戳选项具有class为2外,所有选项都是class为0.

2.ip_dooptions函数

ipintr在检测分组的目的地址之前调用ip_dooptions.该函数处理分组中它所直到的所有选项。

ip_dooptions顺序读取每个选项并进行处理:如果遇到EOL选项则终止该循环,如果遇到NOP选项,则忽略它,如果需要未知选项则忽略。

分组选项被处理后,如果分组需要被转发,分组被传给ip_forward。如果处理选项时出现了错误,函数就会进入错误处理,发出适当的ICMP错误报文。下面几节会具体说明选项的处理。

3.记录路由选项

记录路由选项使得分组在穿过互联网时所经过的路由被记录在分组内部,项的大小是源主机在构造时确定的,必须足够保存所有预期的地址。我们记得在IP分组的首部,选项最多只能有40个字节。记录路由选项可以有3个字节的开销。后面紧跟地址的列表(每个地址4个字节),如果该选项是唯一选项,则最多可以有9个(3+4*9=39)地址出现。一旦分配给该选项的空间被填满,

就按通常的情况对分组进行转发,中间的系统就不再记录地址。下图说明了一个记录路由选项的格式。

如果IP目的地址时某个系统地址(分组已到达目的地),则把接收接口的地址记录在选项中;否则把ip_rtaddr函数提供的外出接口的地址记录下来。如果ip_rtaddr无法找到目的地路由,则发送一个ICMP主机不可达差错报文。

ip_rtaddr函数:该函数查询路由缓存,必要时查询完整的路由表,来找到到给定IP地址的路由。函数返回一个指向in_ifaddr结构的指针,该指针与该路由的外出接口有关。该函数中,rtalloc函数搜索路由表,寻找到目的地的路由。

4.源站和记录路由选项

通常在中间路由器所选择的路径上转发分组。源站和记录路由选项允许源站明确制定一条到目的地的路由,覆盖掉中间路由器的路由选择决定。而且在分组到达目的地的过程中,把该路由记录下来。

严格路由包含了源站和目的站之间的每个中间路由器的地址。宽松路由只指定某些中间路由器地址,在宽松路由中,路由器可以自由选择两个系统之间的任何路径;而在严格路由中,则不允许路由器这么做。

如下图,A,B和C是路由器,而HS和HD是源和目的主机。因为每个接口都有自己的IP地址,所以我们看到路由器A有三个地址:

A1,A2,A3。同样,B和C也有多个地址。

IP首部的源和目的地址以及在选项中列出的位移和地址表,指定了路由以及分组目前在该路由中所处的位置。下图显示了当分组按照这个宽松路由从HS经过A,B,C到HD,信息时如何改变的,每行代表当分组被第1列显示的系统发送时的状态,最后一行显示分组被HD接收。


相关内容