我正在学习低级网络协议中的 TTL(生存时间字段)的示例,例如 ICMP 数据包(ping/traceroute 数据包)中使用的 TTL。
我经常看到 ICMP TTL 被称为时间测量,但它们不只是索引/计数器吗?
能否对路由器网络进行编程,使其不减少 ICMP 数据包中的 TTL,从而允许数据包无限期地存活?
它们真的被设计用来表示时间单位吗?或者这些字段只是用来解释的吗?
答案1
ICMP 在其自己的层上没有 TTL,因此您的问题实际上归结为 IPv4 TTL。
请注意,IPv4 已不再被广泛使用,因为它正在被 IPv6 慢慢取代。IPv6 有一个“跳数限制”字段,而不是 TTL 字段,并且跳数限制字段明确是一个跳数计数器,而不是秒数。
不减少 TTL 字段确实会让数据包永远存在于网络中,这将导致网络瘫痪,因为路由循环发生的频率比任何人都希望的要高。它还会破坏一些高层协议,例如 TCP 的 TIME_WAIT 状态,这些协议的工作原理是假设您可以等待几分钟以确保来自给定流的任何滞留数据包(这些数据包仍滞留在网络中)都将被丢弃。
IPv4 TTL 于 1981 年定义RFC 791我没有看到任何证据表明它自那时以来已被重新定义。以下是 RFC 第 30 页上关于 TTL 的内容:
生存时间
生存时间由发送方设置为数据报在互联网系统中允许的最大时间。如果数据报在互联网系统中的时间超过生存时间,则必须销毁该数据报。
每次处理互联网报头时,必须减少此字段以反映处理数据报所花费的时间。即使没有关于实际花费时间的本地信息,也必须将该字段减 1。时间以秒为单位(即,值 1 表示一秒)。因此,最大生存时间为 255 秒或 4.25 分钟。由于处理数据报的每个模块都必须将 TTL 至少减少 1,即使它在不到一秒的时间内处理数据报,因此必须将 TTL 仅视为数据报可能存在时间的上限。目的是导致无法送达的数据报被丢弃,并限制最大数据报生存期。
一些更高级别的可靠连接协议基于这样的假设:旧的重复数据报在一定时间过后不会到达。TTL 是此类协议确保其假设得到满足的一种方式。
该 RFC 还建议,在第 28 页的碎片数据报重组过程示例中,TTL 应该用作重组碎片 IP 数据报期间的实际秒级计时器,告诉接收主机在等待接收任何剩余碎片时,应将不完整的、部分重组的数据报保留多长时间。
因此,最初的设计者认为它是以秒为单位的,承认在许多情况下它可能更像一个跳数计数器,但有一个示例表明将其用作秒是有意义的。显然这些事实并没有给任何人带来问题,所以没有人觉得有必要淘汰 RFC 791,只是为了消除它名义上是秒的原始概念。但是当 IPv6 作为 IPv4 的后继者开发时,该字段变成了一个明确的跳数限制,而不是以秒为单位的实际 TTL。