当跳数等于默认TTL时,数据包会被丢弃吗?

网络工程 ip ipv4 ipv6 协议理论 ntp
2021-07-13 23:18:01

根据我的理解,默认 TTL 表示允许的最大跃点数,以便数据包可以到达主机。

NTP 文档存档:ttl - 此选项仅用于广播服务器和多播客户端模式。它指定在广播服务器和多播服务器上使用的生存时间 ttl 以及使用多播客户端数据包进行扩展环搜索的最大 ttl

但是,在一些答案中也提到,如果TTL为0,则数据包将被丢弃,并且永远不会到达主机。我想知道当数据包被消耗之前的跃点数与 TTL_DEFAULT 完全相同时会发生什么(例如 TTL_DEFAULT 是 2 并且在数据包被消耗之前有 2 跳)。数据包会到达主机,还是会被丢弃?

1个回答

TTL 为 1 将数据包限制到本地网络,因为到另一个网络的跃点会将 TTL 递减到0,然后数据包将被丢弃。

每次处理数据包时,TTL 应该递减,然后0丢弃任何具有 TTL 的数据包,但实际上没有主机这样做。TTL 最初的想法实际上是生存时间(以秒为单位),而不是跳数,并且每次处理数据包都会递减用于处理数据包的实际时间,但最小递减量为1. 这个想法是为了防止上层协议接收陈旧或重复的数据。这在适用于 IPv4 的RFC 791, Internet Protocol 中进行了解释

生存时间

生存时间由发送者设置为允许数据报在互联网系统中的最长时间。如果数据报在 Internet 系统中的存在时间超过其生存时间,则必须销毁该数据报。

必须在处理 Internet 报头的每个点减少此字段,以反映处理数据报所花费的时间。即使没有关于实际花费时间的本地信息,该字段也必须减 1。时间以秒为单位测量(即值 1 表示一秒)。因此,最长存活时间为 255 秒或 4.25 分钟。由于每个处理数据报的模块都必须将 TTL 至少减少 1,即使它在不到一秒的时间内处理数据报,因此 TTL 必须仅被视为数据报可能存在时间的上限。目的是使无法传递的数据报被丢弃,并限制最大数据报生命周期。

一些更高级别的可靠连接协议基于这样的假设,即旧的重复数据报在经过一定时间后不会到达。TTL 是此类协议确保满足其假设的一种方式。

当创建 IPv6 时,作者明白 TTL 并没有按照它记录的方式使用。对于 IPv6,TTL 更改为 Hop Limit 以反映实际使用 TTL 的方式。请参阅RFC 2460,互联网协议,版本 6 (IPv6) 规范

跳数限制

8 位无符号整数。转发数据包的每个节点减 1。如果 Hop Limit 减少到零,则丢弃该数据包。

-以及路由器在接收 IPv6 数据包时应该做什么:

if the IPv6 Hop Limit is less than or equal to 1 {
  send an ICMP Time Exceeded -- Hop Limit Exceeded in Transit
  message to the Source Address and discard the packet
}

-以及 IPv6 认识到 TTL 的 IPv4 实现存在缺陷的地方:

8.2 最大数据包生命周期

与 IPv4 不同,IPv6 节点不需要强制执行最大数据包生命周期。这就是 IPv4 的“生存时间”字段在 IPv6 中更名为“跳数限制”的原因。实际上,很少有(如果有的话)IPv4 实现符合限制数据包生命周期的要求,因此这在实践中并没有改变。任何依赖互联网层(无论是 IPv4 还是 IPv6)来限制数据包生命周期的上层协议都应该升级以提供自己的机制来检测和丢弃过时的数据包。


我想知道当数据包被消耗之前的跃点数与 TTL_DEFAULT 完全相同时会发生什么(例如 TTL_DEFAULT 是 2 并且在数据包被消耗之前有 2 跳)。数据包会到达主机,还是会被丢弃?

实际上,对于 TTL 为 的 IPv4 数据包1,该数据包将到达同一 LAN 上的目的地并由其处理。对于 TTL 2,数据包将到达距离本地 LAN(第二个 LAN)一跳的主机并由其处理。等等。

这意味着如果 TTL 为 的数据包的目的地2距离本地 LAN 两(路由器)跳,则第二个路由器会将数据包的 TTL 递减到0并在到达目的地(第三个)LAN 之前丢弃该数据包。