9.5.2 更多的细节
最后更新于:2022-04-02 05:24:09
ICMP重定向报文的格式如图9-4所示。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-19_5715bebdecb9e.png)
有四种不同类型的重定向报文,有不同的代码值,如图9-5所示。
ICMP重定向报文的接收者必须查看三个IP地址:
(1)导致重定向的IP地址(即ICMP重定向报文的数据位于IP数据报的首部);
(2)发送重定向报文的路由器的IP地址(包含重定向信息的IP数据报中的源地址;
(3)应该采用的路由器IP地址(在ICMP报文中的4 ~ 7字节)。
关于ICMP重定向报文有很多规则。首先,重定向报文只能由路由器生成,而不能由主机生成。另外,重定向报文是为主机而不是为路由器使用的。假定路由器和其他一些路由器共同参与某一种选路协议,则该协议就能消除重定向的需要(这意味着在图9-1中的路由表应该消除或者能被选路守护程序修改,或者能被重定向报文修改,但不能同时被二者修改)。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-19_5715bebe11da4.png)
在4.4BSD系统中,当主机作为路由器使用时,要进行下列检查。在生成ICMP重定向报文之前这些条件都要满足。
1) 出接口必须等于入接口。
2) 用于向外传送数据报的路由不能被ICMP重定向报文创建或修改过,而且不能是路由器的默认路由。
3) 数据报不能用源站选路来转发。
4) 内核必须配置成可以发送重定向报文。
内核变量取名为ipsendredirects或其他类似的名字(参见附录E)。大多数当前的系统(例如BSD、SunOS 4.1.x、Solaris 2.x 及AIX 3.2.2)在默认条件下都设置该变量,使系统可以发送重定向报文。其他系统如SVR4则关闭了该项功能。
另外,一台4.4BSD主机收到ICMP重定向报文后,在修改路由表之前要作一些检查。这是为了防止路由器或主机的误操作,以及恶意用户的破坏,导致错误地修改系统路由表。
1) 新的路由器必须直接与网络相连接。
2) 重定向报文必须来自当前到目的地所选择的路由器。
3) 重定向报文不能让主机本身作为路由器。
4) 被修改的路由必须是一个间接路由。
关于重定向最后要指出的是,路由器应该发送的只是对主机的重定向(代码1或3,如图9-5所示),而不是对网络的重定向。子网的存在使得难于准确指明何时应发送对网络的重定向而不是对主机的重定向。只当路由器发送了错误的类型时,一些主机才把收到的对网络的重定向当作对主机的重定向来处理。
';