雖然在通常情況下,IP協議與路由信息的管理并沒有關系,但它確實定義了一個小小的故障控制功能,稱為ICMP重定向(ICMP redirect)。當一臺路由器把一個包轉發至一臺計算機,而這臺計算機卻又在最初接收這個包的網絡上的時候,就出現了明顯的錯誤。由于發送方、路由器和下一跳的路由器都在同一網絡上,所以包應該以一跳而不是兩跳轉發。路由器可以得出結論:發送方的路由表是不準確或者不完整的。
在這種情況下,路由器可以用一個ICMP重定向包把發送方的問題通知給它。實際上,一個重定向包說:“您不應該將發往主機xxx的包發送給我,您應該把它們發送給主機yyy。”ICMP協議允許將重定向包既發送給單個主機地址也發送給整個網絡。但是,許多實現只產生主機重定向包,現在,網絡重定向包還沒有多大用處,因為它們只能應用到A、B或者C類網絡上。
根據接收到的重定向包,發送方就會更新它的路由表,這樣一來,將來那些發往這個地址的包就能走更直接的路徑。在出現多播的早期時代,有些系統會響應多播包而生成ICMP路由重定向包。現代系統已不存在這個問題。
標準的ICMP應用場合并不包括身份認證的步驟。您的路由器會收到一個聲稱來自其他某個聲譽良好的路由器的重定向包,指導您將流量發送到其他地方。您是否應該采納呢?請注意,重定向實際上引發了一個安全問題。一般情況下,Linux內核(出于安全原因)和Cisco路由器(因為它們是路由器)都會忽略重定向包。讓那些不可信的主機修改您的路由表可不是件好事。
在 Linux 下,/proc 目錄樹下的變量 accept_redirects 控制著 ICMP 重定向包的接收。參見 12.10節了解檢查和重設這個變量的指令。