虽然在通常情况下,IP协议与路由信息的管理并没有关系,但它确实定义了一个小小的故障控制功能,称为ICMP重定向(ICMP redirect)。当一台路由器把一个包转发至一台计算机,而这台计算机却又在最初接收这个包的网络上的时候,就出现了明显的错误。由于发送方、路由器和下一跳的路由器都在同一网络上,所以包应该以一跳而不是两跳转发。路由器可以得出结论:发送方的路由表是不准确或者不完整的。
在这种情况下,路由器可以用一个ICMP重定向包把发送方的问题通知给它。实际上,一个重定向包说:“您不应该将发往主机xxx的包发送给我,您应该把它们发送给主机yyy。”ICMP协议允许将重定向包既发送给单个主机地址也发送给整个网络。但是,许多实现只产生主机重定向包,现在,网络重定向包还没有多大用处,因为它们只能应用到A、B或者C类网络上。
根据接收到的重定向包,发送方就会更新它的路由表,这样一来,将来那些发往这个地址的包就能走更直接的路径。在出现多播的早期时代,有些系统会响应多播包而生成ICMP路由重定向包。现代系统已不存在这个问题。
标准的ICMP应用场合并不包括身份认证的步骤。您的路由器会收到一个声称来自其他某个声誉良好的路由器的重定向包,指导您将流量发送到其他地方。您是否应该采纳呢?请注意,重定向实际上引发了一个安全问题。一般情况下,Linux内核(出于安全原因)和Cisco路由器(因为它们是路由器)都会忽略重定向包。让那些不可信的主机修改您的路由表可不是件好事。
在 Linux 下,/proc 目录树下的变量 accept_redirects 控制着 ICMP 重定向包的接收。参见 12.10节了解检查和重设这个变量的指令。