5.1. Fields of a PDU (PDU的字段)
5.1 Fields of a PDU (PDU的字段)
PDU包含以下数据元素:
Protocol Version (协议版本): 一个8位无符号整数, 当前为1, 表示此协议的版本。
PDU Type (PDU类型): 一个8位无符号整数, 表示PDU的类型, 例如IPv4前缀。
Serial Number (序列号): 当从上游缓存服务器接收此PDU集或从全局RPKI收集时, RPKI缓存的序列号。当缓存从父缓存或全局RPKI完成严格验证的更新时, 会递增其序列号。
Session ID (会话ID): 一个16位无符号整数。当缓存服务器启动时, 它会生成一个会话ID来标识缓存的实例, 并将其绑定到该缓存实例将生成的序列号序列。这允许路由器重新启动失败的会话, 知道它正在使用的序列号与缓存的序列号相称。如果在协议版本协商后(第7节)的任何时候, 路由器或缓存发现会话ID的值与对方的不同, 检测到不匹配的一方必须立即使用代码0 ("Corrupt Data")的错误报告PDU终止会话, 并且路由器必须刷新从该缓存学到的所有数据。
请注意, 会话特定于特定的协议版本。也就是说, 如果缓存服务器支持此协议的多个版本, 恰好对多个协议版本使用相同的会话ID值, 并且进一步恰好对使用相同会话ID但不同协议版本值的两个或多个会话使用相同的序列号值, 则序列号不相称。测试序列号是否相称的完整测试需要比较协议版本、会话ID和序列号。为了降低混淆的风险, 缓存服务器不应该在多个协议版本中使用相同的会话ID, 但即使它们这样做, 路由器也必须将具有不同协议版本字段的会话视为单独的会话, 即使它们恰好具有相同的会话ID。
如果缓存错误地重用了会话ID, 以至于路由器没有意识到会话已更改(旧会话ID和新会话ID具有相同的数值), 则路由器可能会对缓存的内容感到困惑。路由器发现它困惑所需的时间取决于序列号是否也被重用。如果旧会话和新会话中的序列号差异足够大, 缓存将使用缓存重置响应路由器的序列查询, 这将解决问题。但是, 如果序列号很接近, 缓存可能会使用缓存响应进行响应, 这可能不足以使路由器与缓存同步。在这种情况下, 路由器很可能(但不确定)会检测到缓存期望的状态与其自身状态之间存在某些差异。例如, 缓存响应可能告诉路由器删除路由器不持有的记录, 或者可能告诉路由器添加路由器已经拥有的记录。在这种情况下, 路由器将检测到错误并重置会话。路由器可能保持不同步的一种情况是, 当缓存响应中的任何内容都不与路由器当前持有的任何数据相矛盾时。
对会话ID使用持久存储或基于时钟的方案生成会话ID应该可以避免会话ID冲突的风险。
会话ID可能是伪随机值、严格递增的值(如果缓存具有可靠的存储)等。一个纪元秒时间戳值(如POSIX time()函数)可以作为一个很好的会话ID值。
Length (长度): 一个32位无符号整数, 其值为整个PDU中的字节数, 包括包含长度字段的8字节头部。
Flags (标志): 标志字段的最低位为1表示公告, 为0表示撤销。对于前缀PDU(IPv4或IPv6), 该标志指示此PDU是公告新的前缀公告权还是撤销先前公告的权; 撤销有效地删除一个先前公告的具有完全相同前缀、长度、最大长度和自治系统号(ASN)的前缀PDU。类似地, 对于路由器密钥PDU, 该标志指示此PDU是公告新的路由器密钥还是删除一个先前公告的具有完全相同AS号、subjectKeyIdentifier和subjectPublicKeyInfo的路由器密钥PDU。
标志字段中的其余位保留供将来使用。在协议版本1中, 它们在传输时必须为零, 在接收时必须被忽略。
Prefix Length (前缀长度): 一个8位无符号整数, 表示前缀元素允许的最短前缀。
Max Length (最大长度): 一个8位无符号整数, 表示前缀元素允许的最长前缀。这不能小于前缀长度元素。
Prefix (前缀): ROA的IPv4或IPv6前缀。
Autonomous System Number (自治系统号): 一个32位无符号整数, 表示允许公告前缀或与路由器密钥关联的ASN。
Subject Key Identifier (主题密钥标识符): 路由器密钥的20字节主题密钥标识符(SKI)值, 如[RFC6487]中所述。
Subject Public Key Info (主题公钥信息): 路由器密钥的subjectPublicKeyInfo值, 如[RFC8208]中所述。这是subjectPublicKeyInfo的完整ASN.1 DER编码, 包括subjectPublicKeyInfo SEQUENCE的ASN.1标签和长度值。
Refresh Interval (刷新间隔): 正常缓存轮询之间的间隔。参见第6节。
Retry Interval (重试间隔): 缓存轮询失败后重试缓存轮询之间的间隔。参见第6节。
Expire Interval (过期间隔): 在没有成功的后续缓存轮询的情况下, 从缓存获取的数据保持有效的间隔。参见第6节。