01 · WHOIS协议技术解剖
1.1 协议交互模型
WHOIS(RFC 3912)定义了极为简单的交互模型:客户端通过TCP 43端口连接服务器,发送一个以换行符终止的查询词(域名、IP或句柄),服务器返回一段纯文本响应后主动断开连接。没有会话状态、没有认证、没有加密、没有结构化的错误码——连接异常与"查询无结果"在协议层面无法区分。这种设计在1982年面向人工查询的场景下足够用,但在今天自动化采集的场景下意味着:每次查询都是一次完整的TCP握手,大规模采集的效率与友好性都受到限制;更重要的是,明文传输使查询行为与查询结果对中间人完全可见,这在处理涉密调查目标时是不可接受的。
1.2 输出格式的碎片化陷阱
RFC 3912只规定了传输方式,没有规定输出格式。各注册局与注册商自行决定字段命名、排序、语言与排版——"Registrant""Registrant Name"" registrant_name""注册人"在不同服务器上表达同一含义;"Creation Date""created""Registered on"表达同一时刻。解析器必须为每个数据源单独编写适配规则,任何字段变更都会导致解析静默失败。这是WHOIS时代注册数据工程的最大隐性成本,也是RDAP统一JSON模型的直接动因。
1.3 Thick与Thin数据模型
按注册局保存数据的深度,注册数据服务分为thick与thin两种模型:
| 维度 | Thick(厚)模式 | Thin(薄)模式 |
|---|---|---|
| 数据保存方 | 注册局保存完整注册数据(注册人、联系人、状态等) | 注册局仅保存域名、注册商、日期、名称服务器等指针信息;完整数据在注册商处 |
| 典型代表 | 全部2013年后入根的新gTLD(ICANN强制要求thick);.CN亦由CNNIC集中管理 | 传统gTLD中的.com、.net(Verisign运营)与.edu等 |
| 查询特点 | 注册局查询即可看到完整注册档案 | 注册局查询仅显示注册商信息,需再向注册商查询完整数据(二级查询) |
| 治理影响 | 数据集中,治理与监测可在注册局层统一开展 | 数据分散在数百家注册商,批量治理成本高;注册商RDAP服务成为关键采集点 |
注:2013 RAA及新版注册局协议强制新gTLD采用thick模式;.com/.net的thick化迁移曾在ICANN政策议程中讨论,至今未实施。
1.4 WHOIS与RDAP关键差异对照
| 维度 | WHOIS(RFC 3912) | RDAP(RFC 7480-7485/9082/9083) |
|---|---|---|
| 传输层 | TCP 43端口,明文传输 | HTTP/HTTPS,继承Web安全基础设施 |
| 数据格式 | 无结构纯文本,各注册局格式不一 | 统一JSON对象模型(RFC 7483) |
| 错误语义 | 无法区分"无结果"与"服务故障" | 标准HTTP状态码与结构化错误(RFC 7481) |
| 访问控制 | 全无或全有,无法分级 | 支持按身份分级访问与Redaction标注(RFC 9537) |
| 服务发现 | 依赖硬编码地址与文本引荐 | IANA Bootstrap注册表自动发现(RFC 7484/9224) |
| 扩展机制 | 无 | rdapConformance声明与后续扩展RFC |
注:对照要点依据RFC 3912、RFC 7480-7484及IETF公开资料归纳。据ICANN统计,截至2024年12月全球各类RDAP服务的月查询总量已超过100亿次,RDAP已成为注册数据查询的事实主流。
02 · RDAP协议栈详解
2.1 传输与安全(RFC 7480/7481)
RDAP将查询承载于HTTP(S)之上,从而继承了整个Web安全基础设施:TLS加密、HTTP状态码、缓存与压缩。RFC 7481定义了明确的错误语义——400(语法错误)、401/403(未认证/未授权)、404(对象不存在)、408(超时)、409(冲突)、429(超过速率限制)与5xx系列,使客户端能够区分"域名不存在"与"服务器故障",这是WHOIS无法做到的。速率限制(429响应)是RDAP采集工程必须尊重的运行约束,也是本课题数据管道设计中"合规限速"模块的依据。
2.2 查询操作(RFC 7482)
RDAP定义了五类路径查询与对应的批量搜索:
| 查询路径 | 说明 | 示例 |
|---|---|---|
| /domain/{domain} | 查询域名注册档案 | /domain/example.com |
| /nameserver/{host} | 查询名称服务器对象 | /nameserver/ns1.example.com |
| /entity/{handle} | 查询实体(注册人/注册商等)档案 | /entity/ABC123-EXAMPLE |
| /ip/{addr|prefix} | 查询IP网络对象 | /ip/192.0.2.0/24 |
| /autnum/{asn} | 查询自治系统号对象 | /autnum/64500 |
| /domains?name= 等 | 批量搜索(按名称/NS名称/NS IP/实体名/句柄) | /domains?name=*.example.com(通配符仅允许置于模式开头) |
2021年发布的RFC 9082对查询格式进行了技术更新(如参数编码等细节修订),实现时应以最新文本为准。
2.3 响应语义与版本协商
RDAP响应中的rdapConformance数组声明服务端支持的协议特性,客户端据此判断能否使用扩展功能(如批量搜索、更名后的对象标签查询)。gTLD服务端通常声明包括rdap_level_0、ICANN RDAP Profile在内的多个标识——这为采集端的"服务端能力探测"提供了标准化入口。
03 · RDAP JSON对象模型(RFC 7483)
3.1 五类核心对象
RFC 7483定义了五类可独立查询的核心对象:domain(域名,含LDH名称与Unicode名称、句柄、状态、事件、名称服务器、实体、安全DNS信息)、entity(实体,注册人/注册商/联系人等,支持嵌套)、nameserver(名称服务器)、ip network(IP网络)、autnum(自治系统号)。对象间通过内嵌或链接(link)方式关联,构成注册数据的图结构——这一设计天然支持本课题第3篇的实体解析与关联分析。
3.2 事件与状态模型
| 模型 | 取值/说明 |
|---|---|
| eventAction(事件) | registration(注册)、reregistration、last changed(最后变更)、expiration(到期)、deletion(删除)、reinstatement(恢复)、transfer(转移)、locked / unlocked、last update of RDAP database |
| domain status(域名状态) | active、inactive、locked、hold、pending transfer、pending delete、pending renew、pending restore、pending update等(完整取值以IANA RDAP Status Values注册表为准,与EPP状态码存在映射关系) |
| entity roles(实体角色) | registrant(注册人)、registrar(注册服务机构)、reseller(分销商)、sponsor、proxy(代理服务)、privacy(隐私服务)、abuse(滥用处置)、technical、administrative、billing等 |
注:完整取值列表以RFC 7483及IANA RDAP Status Values注册表为准,上表为研究中最常用的子集。
3.3 jCard联系方式编码
实体对象的联系方式采用jCard(RFC 7095)——vCard 4.0(RFC 6350)的JSON序列化形式表示。常见属性包括fn(姓名/名称)、adr(地址)、tel(电话)、email(邮箱)、org(组织)。Redaction场景下,公开层实体的这些字段被替换为"已隐藏"占位,仅保留角色与句柄——这一变化直接决定了第3篇数据质量模型中"可联系性"维度的评估方法。
{
"objectClassName": "domain",
"handle": "EXAMPLE1-COM",
"ldhName": "example.com",
"status": ["active", "client delete prohibited"],
"events": [
{"eventAction": "registration", "eventDate": "1995-08-14T04:00:00Z"},
{"eventAction": "expiration", "eventDate": "2026-08-13T04:00:00Z"}
],
"entities": [
{"objectClassName": "entity", "handle": "REG-EXAMPLE",
"roles": ["registrar"], "vcardArray": ["vcard", [ ... ]]}
],
"rdapConformance": ["rdap_level_0", "icann_rdap_response_profile_0"]
}说明:上为RDAP域名响应的结构示意(节选自RFC 7483示例风格),非任何真实域名数据。
04 · Bootstrap服务发现(RFC 7484)
4.1 IANA维护的官方注册表
RDAP没有全局根服务器,取而代之的是由IANA维护的一组Bootstrap注册表,发布于https://data.iana.org/rdap/目录下:dns.json(TLD→RDAP服务端映射)、ipv4.json / ipv6.json(地址段→RIR RDAP服务端)、asns.json(ASN→RIR RDAP服务端)以及object-tags.json(实体标签空间映射)。每个注册表以版本号与发布日期标注,客户端应定期同步以获取最新映射。
{
"version": "1.0",
"description": "RDAP Bootstrap file for Domain Name System",
"services": [
[
["com", "net"],
["https://rdap.verisign.com/com/v1/",
"https://rdap.verisign.com/net/v1/"]
]
]
}说明:上为dns.json的结构示意(节选),真实文件包含全部已登记TLD的映射。
4.2 查询解析流程
4.3 辅助跳转服务
rdap.org与RDAP.net等社区服务提供"输入任意域名/IP/ASN即跳转到正确RDAP服务端"的便捷入口;ICANN官方运营的Lookup(lookup.icann.org)则同时提供WHOIS与RDAP双通道查询,并展示Bootstrap解析过程,是验证采集结果的标准工具。工程实践中应以IANA Bootstrap为权威依据,跳转服务仅作交叉验证。
05 · EPP与数据上游(RFC 5730-5734)
RDAP/WHOIS只是数据的"查询出口",注册数据的"上游源头"是EPP(Extensible Provisioning Protocol,可扩展供应协议)。EPP定义了注册服务机构与注册管理机构之间的标准交互:会话建立(hello/login)、域名生命周期操作(create/delete/renew/transfer/update)、信息查询(info)与状态管理,基于TCP 700端口(可配TLS)。注册人数据、状态变更与转移记录在EPP层面产生,随后同步至RDAP/WHOIS查询层。理解EPP的生命周期语义(如pendingTransfer、pendingDelete状态的含义)是正确解读RDAP状态字段的前提,也是注册行为画像(子课题05)中"转移/删除/再注册"时序特征的数据基础。
工程提示:RDAP事件模型中的transfer、deletion、reinstatement等eventAction,与EPP命令和gTLD转移政策(Inter-Registrar Transfer Policy)一一对应。批量采集时建议同时记录事件时间戳序列——同一注册人名下域名的"删除—再注册"循环是恶意基础设施迁移的典型信号。
06 · ICANN合规要求与实施时间线
gTLD注册数据服务的法定框架由ICANN合同体系定义,关键节点如下:
| 时间 | 事件 |
|---|---|
| 2013 | 新版《注册服务机构认证协议》(2013 RAA)生效,附WHOIS准确性计划规范(验证义务)与WDRP衔接条款 |
| 2018-05 | GDPR生效;ICANN董事会通过《gTLD注册数据临时规范》,确立Redaction与分层访问框架 |
| 2019-02-27 | ICANN向全部gTLD注册局与注册商发出RDAP实施通知 |
| 2019-08-26 | RDAP服务实施截止日:全部gTLD注册局与注册商须运营符合技术规范的RDAP服务 |
| 2023-08-07 至2024-02-03 | RDAP合同义务爬坡期(ramp-up):爬坡期结束后RDAP全面纳入合同合规监督 |
| 2024-02-21 | ICANN发布2024年2月版gTLD RDAP Profile,要求2025年8月20日后实施 |
| 2025-01-28 | WHOIS(端口43)合同义务正式日落,RDAP成为gTLD注册数据的权威来源(.com/.name/.post暂为例外) |
| 2025-08-20 | 2024年2月版gTLD RDAP Profile实施节点;同月《gTLD注册数据政策》生效,注册数据治理进入统一政策周期 |
采集合规提示:RDAP服务条款普遍包含速率限制与使用限制条款;自动化采集必须实现退避重试(429响应)、请求间隔控制与完整审计日志,避免触发封禁或违反合同条款。采集目的应限定于研究与防御场景,不得用于骚扰、歧视性画像或未经同意的商业联系。
07 · 工具链与实操
7.1 公开查询工具
| 工具 | 说明 |
|---|---|
| ICANN Lookup | lookup.icann.org,ICANN官方双通道查询,展示Bootstrap解析过程 |
| rdap.org / RDAP.net | 输入域名/IP/ASN自动跳转至权威RDAP服务端 |
| IANA Bootstrap注册表 | data.iana.org/rdap/,服务端映射的权威来源 |
| Verisign RDAP | .com/.net注册局RDAP(rdap.verisign.com),thin模式仅含注册商指针 |
| CNNIC WHOIS | .CN/.中国国家域名权威WHOIS服务(whois.cnnic.cn);截至本稿.CN尚未纳入IANA RDAP Bootstrap,对.CN的采集以WHOIS为主 |
7.2 命令行实操示例
curl -s https://rdap.verisign.com/com/v1/domain/example.com \
| jq '{name: .ldhName, status: .status,
events: [.events[] | {(.eventAction): .eventDate}],
registrar: [.entities[] | select(.roles[0]=="registrar") | .vcardArray[1][]? | select(.[0]=="fn") | .[3]]}'curl -s https://data.iana.org/rdap/dns.json -o rdap-dns.json jq '.services | length' rdap-dns.json # 已登记TLD映射组数
7.3 开发库与注意事项
- Python:ipwhois等库封装了Bootstrap解析、RDAP查询与WHOIS回退;requests+tenacity可实现限速与重试。
- 健壮性:必须处理thin模式二级查询(注册局结果→注册商RDAP)、国际化域名(A标签/punycode转换)、以及部分服务端响应中的非标准扩展字段。
- 留痕:每次采集记录时间戳、查询目标、响应状态与原始报文哈希,支撑第3篇质量审计与第4篇合规审计。
本篇参考来源(第2篇)
IETF RFC 7482(RDAP查询格式):rfc-editor.org/rfc/rfc7482
IETF RFC 7483(RDAP JSON响应):rfc-editor.org/rfc/rfc7483
IETF RFC 7484(Bootstrap):rfc-editor.org/rfc/rfc7484;IANA注册表:data.iana.org/rdap/dns.json
IETF RFC 7481(RDAP安全与访问控制):rfc-editor.org/rfc/rfc7481
ICANN RDAP Timeline(2019年8月26日实施截止;2024年2月新版Profile):icann.org/resources/pages/rdap-background
ICANN Lookup官方查询工具:lookup.icann.org;rdap.org跳转服务:rdap.org