3. 关系搜索 (Relation Searches)
本节定义用于根据对象在层次结构中的位置查找对象和对象集合的搜索与链接关系.
3.1. 路径段 (Path Segments)
本节路径段中使用的变量包括:
<relation>: 一种关系类型, 按本文档第 3.2.2 节定义.
<IP address>: 一个 IP 地址, 按 [RFC9082] 第 3.1.1 节定义.
<CIDR prefix>: Classless Inter-Domain Routing (CIDR) 块的第一个地址, 按 [RFC9082] 第 3.1.1 节定义.
<CIDR length>: CIDR 块的前缀长度, 按 [RFC9082] 第 3.1.1 节定义.
<domain name>: 一个 fully qualified domain name, 按 [RFC9082] 第 3.1.3 节定义.
<autonomous system number or range>: 一个自治系统号, 按 [RFC9082] 第 3.1.2 节定义, 或者由单个连字符 (-, ASCII 值 0x2D) 分隔的两个此类编号, 其中第二个编号大于第一个编号.
<resource type search path segment>: 与 Internet Number Resource (INR) 对象类对应的搜索路径段, 即 IP 网络地址或范围, 自治系统号或编号范围, 或者反向域名.
<object value>: 用于相对于某个对象进行关系搜索时标识该对象的值. 根据正在执行的搜索类型, 它是 <IP address>, <CIDR prefix> 与 <CIDR length> 的组合, <domain name>, 或 <autonomous system number or range> 之一.
<status>: 对象状态值, 按 [RFC9083] 第 4.6 节定义.
用于关系搜索的新资源类型路径段 (类似于 [RFC9082] 和 [RFC9083] 中定义的搜索) 如下:
ips/rirSearch1/<relation>/<IP address>: 用于标识一种 IP 网络搜索, 该搜索使用一个关系和一个 IP 地址来匹配一组 IP 网络.
ips/rirSearch1/<relation>/<CIDR prefix>/<CIDR length>: 用于标识一种 IP 网络搜索, 该搜索使用一个关系和一个 IP 地址范围来匹配一组 IP 网络.
autnums/rirSearch1/<relation>/<autonomous system number or range>: 用于标识一种自治系统号搜索, 该搜索使用一个关系以及单个 ASN 或 ASN 范围来匹配一组 ASN 对象.
domains/rirSearch1/<relation>/<domain name>: 用于标识一种反向域名搜索, 该搜索使用一个关系和一个反向域名来匹配一组反向域名.
3.2. 关系搜索 (Relation Search)
语法: <resource type search path segment>/rirSearch1/<relation>/<object value>[?status=<status>]
本文档定义的关系搜索依赖于上述语法. 对于每种对象类, 每项搜索都以相同方式工作.
rirSearch1 路径段用于关系搜索 URL, 以便为这些搜索提供单一命名空间, 并使其他搜索可以定义在顶层资源类型搜索路径段之下.
3.2.1. 定义 (Definitions)
INR 对象值可以有一个 "parent" 对象和一个或多个 "child" 对象. "parent" 对象是在相关注册表中存在的下一个较不具体对象, 而 "child" 对象是在相关注册表中存在的下一个较具体对象. 例如, 假设某个注册表包含以下 IP 网络对象:
+--------------+
| 192.0.2.0/24 |
+--------------+
/ \
+--------------+ +----------------+
| 192.0.2.0/25 | | 192.0.2.128/25 |
+--------------+ +----------------+
/ / \
+--------------+ +----------------+ +----------------+
| 192.0.2.0/28 | | 192.0.2.128/26 | | 192.0.2.192/26 |
+--------------+ +----------------+ +----------------+
/
+--------------+
| 192.0.2.0/32 |
+--------------+
图 1: 示例注册表对象
对于此示例注册表, INR 对象值与 parent/child 对象的关系如下:
+==================+================+
| INR object value | Parent object |
+==================+================+
| 192.0.2.0/32 | 192.0.2.0/28 |
+------------------+----------------+
| 192.0.2.0/28 | 192.0.2.0/25 |
+------------------+----------------+
| 192.0.2.64/26 | 192.0.2.0/25 |
+------------------+----------------+
| 192.0.2.128/26 | 192.0.2.128/25 |
+------------------+----------------+
| 192.0.2.192/26 | 192.0.2.128/25 |
+------------------+----------------+
| 192.0.2.0/25 | 192.0.2.0/24 |
+------------------+----------------+
| 192.0.2.128/25 | 192.0.2.0/24 |
+------------------+----------------+
| 192.0.2.0/24 | N/A |
+------------------+----------------+
表 1: Parent 对象
+==================+================================+
| INR object value | Child objects |
+==================+================================+
| 192.0.2.0/24 | 192.0.2.0/25, 192.0.2.128/25 |
+------------------+--------------------------------+
| 192.0.2.0/25 | 192.0.2.0/28 |
+------------------+--------------------------------+
| 192.0.2.128/25 | 192.0.2.128/26, 192.0.2.192/26 |
+------------------+--------------------------------+
| 192.0.2.64/26 | N/A |
+------------------+--------------------------------+
| 192.0.2.128/26 | N/A |
+------------------+--------------------------------+
| 192.0.2.192/26 | N/A |
+------------------+--------------------------------+
| 192.0.2.0/28 | 192.0.2.0/32 |
+------------------+--------------------------------+
| 192.0.2.0/32 | N/A |
+------------------+--------------------------------+
表 2: Child 对象
INR 对象值不一定对应于注册表对象, 因为用户可以为本文档定义的搜索提供任意对象值作为输入.
与 parent/child 对象关系类似, 每个 INR 对象值可以有一个 "top" 对象, 即注册表中存在的覆盖该对象值的最不具体对象, 以及一个或多个 "bottom" 对象, 即合在一起能完全覆盖该 INR 对象值的最具体对象. 对于上文定义的注册表, top 和 bottom 对象关系如下:
+==================+==============+
| INR object value | Top object |
+==================+==============+
| 192.0.2.0/32 | 192.0.2.0/24 |
+------------------+--------------+
| 192.0.2.0/28 | 192.0.2.0/24 |
+------------------+--------------+
| 192.0.2.64/26 | 192.0.2.0/24 |
+------------------+--------------+
| 192.0.2.128/26 | 192.0.2.0/24 |
+------------------+--------------+
| 192.0.2.192/26 | 192.0.2.0/24 |
+------------------+--------------+
| 192.0.2.0/25 | 192.0.2.0/24 |
+------------------+--------------+
| 192.0.2.128/25 | 192.0.2.0/24 |
+------------------+--------------+
| 192.0.2.0/24 | N/A |
+------------------+--------------+
表 3: Top 对象
+==================+===========================================+
| INR object value | Bottom objects |
+==================+===========================================+
| 192.0.2.0/24 | 192.0.2.0/25, 192.0.2.0/28, 192.0.2.0/32, |
| | 192.0.2.128/26, 192.0.2.192/26 |
+------------------+-------------------------------------------+
| 192.0.2.0/25 | 192.0.2.0/25, 192.0.2.0/28, 192.0.2.0/32 |
+------------------+-------------------------------------------+
| 192.0.2.128/25 | 192.0.2.128/26, 192.0.2.192/26 |
+------------------+-------------------------------------------+
| 192.0.2.64/26 | N/A |
+------------------+-------------------------------------------+
| 192.0.2.128/26 | N/A |
+------------------+-------------------------------------------+
| 192.0.2.192/26 | N/A |
+------------------+-------------------------------------------+
| 192.0.2.0/28 | 192.0.2.0/28, 192.0.2.0/32 |
+------------------+-------------------------------------------+
| 192.0.2.0/31 | 192.0.2.0/28, 192.0.2.0/32 |
+------------------+-------------------------------------------+
| 192.0.2.0/32 | N/A |
+------------------+-------------------------------------------+
表 4: Bottom 对象
如果对于给定 INR 对象值不存在更具体对象, 则该 INR 对象值的 bottom 对象集合为空. 192.0.2.0/32 是此类 INR 对象值的一个示例.
给定 INR 对象值的 bottom 对象不一定互不相交. 例如, 192.0.2.0/28 的 bottom 对象是 192.0.2.0/28 和 192.0.2.0/32. 包含 192.0.2.0/32 是因为它是 192.0.2.0/28 的最具体对象之一 (即对象层次结构底部的对象), 而包含 192.0.2.0/28 本身是因为它是该范围内其他地址 (即 192.0.2.0/32 之外的地址) 的最具体对象.
给定 INR 对象值的 bottom 对象可以包括比该 INR 对象值更不具体的对象. 例如, 192.0.2.0/31 是一个具有更具体对象的 INR 对象值, 该更具体对象为 192.0.2.0/32, 因此 bottom 对象集合必须至少包括该对象. 覆盖剩余部分 (即 192.0.2.1/32) 的最具体对象是 192.0.2.0/28, 因此它也包含在结果中.
3.2.2. 关系 (Relations)
3.2.2.1. 单结果搜索 (Single-Result Searches)
3.2.2.1.1. rdap-up
如果服务器收到包含关系值 rdap-up 的搜索, 它将返回指定 INR 对象值的 parent 对象, 就像直接请求了该对象一样. 如果不存在此类对象, 它将以 HTTP 404 (Not Found) [RFC9110] 状态码响应.
3.2.2.1.2. rdap-top
如果服务器收到包含关系值 rdap-top 的搜索, 它将返回指定 INR 对象值的 top 对象, 就像直接请求了该对象一样. 如果不存在此类对象, 它将以 HTTP 404 (Not Found) [RFC9110] 状态码响应.
3.2.2.2. 多结果搜索 (Multiple-Result Searches)
3.2.2.2.1. rdap-down
如果服务器收到包含关系值 rdap-down 的搜索, 它将返回指定 INR 对象值的 child 对象. 如果不存在此类对象, 它将返回一个空搜索响应. 按定义章节所述, 这只包括直接 child 对象.
3.2.2.2.2. rdap-bottom
如果服务器收到包含关系值 rdap-bottom 的搜索, 它将返回指定 INR 对象值的 bottom 对象. 如果不存在此类对象, 它将返回一个空搜索响应.
3.3. 状态 (Status)
如果提供了 status 参数, 则响应处理将像数据库中所有不具备指定状态的对象已先被移除一样继续进行. 例如, 如果第 3.2.1 节中的注册表对象具有以下状态:
+================+==========+
| Object | Status |
+================+==========+
| 192.0.2.0/25 | active |
+----------------+----------+
| 192.0.2.128/25 | inactive |
+----------------+----------+
| 192.0.2.128/26 | active |
+----------------+----------+
| 192.0.2.192/26 | active |
+----------------+----------+
表 5: 状态
那么, 服务器收到一个 INR 对象值为 192.0.2.0/24 且 status 参数为 active 的 rdap-down 搜索请求时, 将返回对象 192.0.2.0/25, 192.0.2.128/26 和 192.0.2.192/26.
状态过滤很有用, 例如当客户端试图查找从 RIR 到 RIR 账户持有人的委派时: 通过使用 rdap-top 关系并设置 status 为 active, 从 IANA 到 RIR 的委派将被忽略, 客户端将在响应中收到从 RIR 到账户持有人的委派.
默认情况下, 任何有效的状态值都可以用于状态过滤. 服务器运营者可以选择不支持对 rdap-down 和 rdap-bottom 链接关系进行 status 过滤, 在这种情况下, 如果服务器收到此类请求, 则以 HTTP 501 (Not Implemented) [RFC9110] 响应码响应. 服务器运营者也可以选择不支持对 rdap-up 和 rdap-top 链接关系使用除 active 之外的值进行 status 过滤, 在这种情况下, 如果服务器收到此类请求, 则以 HTTP 501 (Not Implemented) [RFC9110] 响应码响应.
虽然任何有效的状态值都可以用于状态过滤, 但给定 RDAP 服务器可能只对 INR 对象使用其中少数状态值. 例如, 像 client hold 这样的状态值通常只会由 DNR 用于正向域名对象.
3.4. 链接关系 (Link Relations)
第 3.2.2 节定义的每种关系都有一个对应的链接关系, 可用于包含在另一个 RDAP 对象中的链接对象. 构造这些链接对象时, 服务器必须使用对应搜索 URL 作为链接目标, 或者使用在请求时会产生与对应搜索相同响应的 URL. 以下是使用这些链接关系的 IPv4 响应省略示例:
{
"startAddress": "192.0.2.0",
"endAddress": "192.0.2.127",
...
"links": [
...,
{
"value": "https://example.com/rdap/ip/192.0.2.0/25",
"rel": "rdap-up",
"href": ".../rdap/ips/rirSearch1/rdap-up/192.0.2.0/25",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/192.0.2.0/25",
"rel": "rdap-down",
"href": ".../rdap/ips/rirSearch1/rdap-down/192.0.2.0/25",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/192.0.2.0/25",
"rel": "rdap-top",
"href": ".../rdap/ips/rirSearch1/rdap-top/192.0.2.0/25",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/192.0.2.0/25",
"rel": "rdap-bottom",
"href": ".../rdap/ips/rirSearch1/rdap-bottom/192.0.2.0/25",
"type": "application/rdap+json"
}
]
}
图 2: IPv4 响应中的示例链接
以下是使用这些链接关系的 IPv6 响应省略示例:
{
"startAddress": "2001:db8:a::",
"endAddress": "2001:db8:a:ffff:ffff:ffff:ffff:ffff",
...
"links": [
...,
{
"value": "https://example.com/rdap/ip/2001:db8:a::/48",
"rel": "rdap-up",
"href": ".../rdap/ips/rirSearch1/rdap-up/2001:db8:a::/48",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/2001:db8:a::/48",
"rel": "rdap-down",
"href": ".../rdap/ips/rirSearch1/rdap-down/2001:db8:a::/48",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/2001:db8:a::/48",
"rel": "rdap-top",
"href": ".../rdap/ips/rirSearch1/rdap-top/2001:db8:a::/48",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/2001:db8:a::/48",
"rel": "rdap-bottom",
"href": ".../rdap/ips/rirSearch1/rdap-bottom/2001:db8:a::/48",
"type": "application/rdap+json"
}
]
}
图 3: IPv6 响应中的示例链接
本文档定义了一个额外的链接关系 rdap-active, 用于表示 status 为 active 的搜索. 由于状态过滤的已知用例只涉及 rdap-up 和 rdap-top 关系以及 active 状态, 因此未定义其他状态链接关系. 以下是使用这些链接关系的 IPv4 响应省略示例:
{
"startAddress": "192.0.2.0",
"endAddress": "192.0.2.127",
...
"links": [
...,
{
"value": "https://example.com/rdap/ip/192.0.2.0/25",
"rel": "rdap-up rdap-active",
"href":
".../rdap/ips/rirSearch1/rdap-up/192.0.2.0/25?status=active",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/192.0.2.0/25",
"rel": "rdap-top rdap-active",
"href":
".../rdap/ips/rirSearch1/rdap-top/192.0.2.0/25?status=active",
"type": "application/rdap+json"
}
]
}
图 4: IPv4 响应中的示例状态链接
以下是使用这些链接关系的 IPv6 响应省略示例:
{
"startAddress": "2001:db8:a::",
"endAddress": "2001:db8:a:ffff:ffff:ffff:ffff:ffff",
...
"links": [
...,
{
"value": "https://example.com/rdap/ip/2001:db8:a::/48",
"rel": "rdap-up rdap-active",
"href":
".../rdap/ips/rirSearch1/rdap-up/2001:db8:a::/48?status=active",
"type": "application/rdap+json"
},
{
"value": "https://example.com/rdap/ip/2001:db8:a::/48",
"rel": "rdap-top rdap-active",
"href":
".../rdap/ips/rirSearch1/rdap-top/2001:db8:a::/48?status=active",
"type": "application/rdap+json"
}
]
}
图 5: IPv6 响应中的示例状态链接
rdap-active 仅作为链接对象中的链接关系使用. 它不能作为第 3.2 节定义的关系搜索 URL 中 <relation> 的值使用. 第 3.3 节详细说明了关系搜索 URL 的状态过滤.
由于 rdap-top 和 rdap-up 链接关系会解析为单个对象或 HTTP 404 (Not Found) [RFC9110] 响应, 因此服务器可以在链接对象的 href 属性中使用查找 URL (见 [RFC9082] 第 3.1 节). 以下是使用这种方法的 IPv4 响应省略示例:
{
"startAddress": "192.0.2.0",
"endAddress": "192.0.2.127",
...
"links": [
...,
{
"value": "https://example.com/rdap/ip/192.0.2.0/25",
"rel": "rdap-up",
"href": "https://example.com/rdap/ip/192.0.2.0/24",
"type": "application/rdap+json"
}
]
}
图 6: IPv4 响应中的单结果链接示例
以下是使用这种方法的 IPv6 响应省略示例:
{
"startAddress": "2001:db8:a::",
"endAddress": "2001:db8:a:ffff:ffff:ffff:ffff:ffff",
...
"links": [
...,
{
"value": "https://example.com/rdap/ip/2001:db8:a::/48",
"rel": "rdap-up",
"href": "https://example.com/rdap/ip/2001:db8::/32",
"type": "application/rdap+json"
}
]
}
图 7: IPv6 响应中的单结果链接示例
在响应中使用这些链接关系是可选的. 响应中缺少特定关系的链接, 并不一定意味着对应搜索不会返回结果.