假设我的路由器有两个接口(eth0 和 eth1)。路由表中的默认条目使用 eth0。现在,如果路由器在 eth0 上收到一个数据包,并且目标 IP 与路由表中的任何条目都不匹配,它将通过默认路由将数据包发送回去。这将导致路由循环。路由器如何避免这种情况?它是否意识到了这一点并发送 ICMP 目标不可达(类型 3,代码 0)消息。一般来说,路由器是否会将数据包转发到接收它的同一接口?
答案1
IP 数据报在 IP 报头中有一个“生存时间”(TTL) 值。路由器每次转发数据报时,都会减少(减 1)TTL。当 TTL 达到零时,路由器会丢弃(删除,不转发)数据报,并发回 ICMP“无法到达目标,TTL 已超出”消息。
此外,当您的路由器从 eth0 上的主机收到一个数据包时,该数据包最好传送到另一台主机或通过 eth0 上数据链路层网络(在本例中为以太网 LAN)上的另一个路由器传送,它可以发送 ICMP 重定向消息以通知发送该数据包的本地主机,它实际上应该将其直接发送到同一以太网 LAN 上的其他主机或路由器。
总的来说,可以通过良好的网络设计以及使用路由通告协议和避免环路的路由表维护程序来避免路由环路。
答案2
首先,根据定义,所有路由器都具有多个接口。
其次,路由器通常甚至不应该接收它必须在同一接口上吐出的东西。
如果您将流量发送到不应该路由的路由器,则该主机中某些设置不正确(也许 DHCP 分发了错误的默认网关,IP 地址/网络掩码设置不正确等)
正如@Spiff 所说,这就是为什么存在 TTL。
当子网中有两个以上接口和多个路由器时,路由环路通常是一个更大的问题。路由器之间使用 RIP、IGRP、EIGRP、OSPF 和 BGP 等路由协议来确定谁在为子网路由、谁是备份路由,以及跟踪路由器何时不再可访问。