跳到主要内容

2.1. 重传定时器的使用

2.1. 重传定时器的使用​

IKE 中的所有消息都以成对形式存在:一个请求和一个响应。IKE SA 的建立通常由两次交换组成。一旦 IKE SA 建立,安全关联的任一端都可以随时发起请求,并且在任何给定时刻都可以有许多请求和响应"在途"。但每条消息都被标记为请求或响应,并且对于每次交换,安全关联的一端是发起者,另一端是响应者。

对于每一对 IKE 消息,发起者负责在超时事件发生时进行重传。响应者必须永远不要重传响应,除非它收到了请求的重传。在这种情况下,响应者必须忽略被重传的请求,除非该请求导致响应的重传。发起者必须记住每个请求,直到它收到相应的响应。响应者必须记住每个响应,直到它收到一个序列号大于或等于该响应序列号加上其窗口大小(参见第 2.3 节)的请求。为了允许节省内存,响应者可以在超时几分钟后忘记该响应。如果响应者收到一个它已经忘记响应的重传请求,它必须忽略该请求(而不是,例如,尝试构造一个新的响应)。

IKE 是一个可靠协议:发起者必须重传请求,直到它收到相应的响应或认为 IKE SA 已经失败。在后一种情况下,发起者丢弃与该 IKE SA 以及使用该 IKE SA 协商的任何 Child SA 相关联的所有状态。来自发起者的重传必须与原始请求逐位相同。也就是说,从 IKE 头开始的所有内容(从 IKE SA 发起者的 SPI 起)都必须逐位相同;其之前的项(例如 IP 和 UDP 头)则不必相同。

IKE_SA_INIT 请求的重传需要一些特殊的处理。当响应者收到一个 IKE_SA_INIT 请求时,它必须确定该数据包是属于某个现有"半开" IKE SA 的重传(在这种情况下,响应者重传相同的响应),还是一个新请求(在这种情况下,响应者创建一个新的 IKE SA 并发送一个全新的响应),或者它属于一个已经收到 IKE_AUTH 请求的现有 IKE SA(在这种情况下,响应者忽略它)。

使用发起者的 SPI 和/或 IP 地址来区分这三种情况是不够的,因为位于单个 NAT 后面的两个不同的对端可能选择相同的发起者 SPI。相反,一个健壮的响应者会使用整个数据包、其哈希值或 Ni 载荷来进行 IKE SA 查找。

单向消息的重传策略与常规消息略有不同。由于永远不会发送确认,因此没有理由无端重传单向消息。鉴于所有这些消息都是错误消息,针对每个"违规"数据包仅发送一次是有意义的,并且仅在收到更多违规数据包时才进行重传。尽管如此,限制此类错误消息的重传也是有意义的。