文章目录
1. 引言
1.1 主机对象和域名对象间的关系
本文档假设主机名对象与上级域名对象有从属关系
。例如,主机名“ns1.example.com”与域名“example.com”有从属关系。不能保持这种关系的EPP操作(如对象传输)必须被明令禁止。
可以在不存在上级域名对象的存储库中创建主机名对象。例如,可以在“.example” repository
中创建主机名 “ns1.example.com” ,这样,“.example”中的域名就可以授权给这台主机了。这种主机在本规范中称为“外部”主机
,因为主机的名称不属于用于委托目的的存储库的名称空间。
某个主机是外部主机还是内部主机,与这个主机所在的存储库相关。主机在repository中被授权托管该repository中创建的域名。如果主机名属于用于委托目的的存储库中的域,则内部主机是从属
的。例如,主机ns1.example1.com是域example1.com的从属主机,但它不是域example2.com的从属主机。可以将ns1.example1.com用作example2.com的名称服务器。在这种情况下,ns1.example1.com必须被视为一个内部主机,服从于控制同一存储库中下属主机上的操作的规则。
1.2 本文档中的约定
在示例中,“C:”表示协议客户端发送的行,“S:”表示协议服务器返回的行。示例中的缩进和空白仅用于说明元素关系,并不是此协议的必需特性。
2. 对象属性
EPP主机对象具有的属性和关联值可以由发起客户机或服务器查看和修改。本节详细描述每种属性类型。这里描述的属性值的正式语法可以在本文档的“正式语法”部分和适当的规范参考中找到。
2.1 主机名
本文档中描述的主机名语法必须符合[RFC0952],由[RFC1123]更新。在撰写本文时,RFC3490 [RFC3490]描述了使用某些ASCII名称标签来表示非ASCII名称标签的标准。随着开发国际化主机名标准的工作的进展,这些一致性需求将来可能会发生变化。
2.2 客户端标示符
所有EPP客户端都由服务器唯一的标识符标识。客户端标识符符合[RFC5730]中描述的“clIDType”语法。
2.3 状态值
一个主机对象必须始终具有至少一个
关联的状态值。状态值只能由发起主机对象的客户机
和对象所在的服务器
设置。客户端可以使用EPP <update>命令更改主机对象的状态。每个状态值可能都伴随着一个人类可读的文本字符串,该字符串描述了应用于对象的状态的基本原理。
客户端不能改变服务器设置的状态值
。根据本地服务器策略,服务器可以更改或覆盖客户端设置的状态值
。对象的状态可能由于客户端发起的转换命令或服务器操作符执行的操作而更改。
可以由客户端添加或删除的状态值以“client”为前缀。可以由服务器添加或删除的相应状态值的前缀为“server”。不以 “client” 或 “server” 开头的状态值是服务器管理的。
状态值描述:
-
clientDeleteProhibited, serverDeleteProhibited
必须拒绝删除对象的请求
-
clientUpdateProhibited, serverUpdateProhibited
必须拒绝更新对象(删除此状态除外)的请求。
-
linked
主机对象至少与另一个对象(如域对象)有一个活动关联。服务器应该提供服务来确定现有的对象关联。
-
ok
这是没有挂起操作或禁止的对象的正常状态值。此值由服务器在添加或删除其他状态值时设置和删除。
-
pendingCreate, pendingDelete, pendingTransfer, pendingUpdate
已经为对象处理了一个transform命令(对于<transfer>命令,对于主机对象的上级域对象),但是该操作还没有由服务器完成。服务器操作员可以出于多种原因延迟操作完成,比如允许人工检查或第三方操作。使用响应代码1001记录正在处理的转换命令,但其请求的操作处于挂起状态。
当请求的操作完成时,必须删除pendingCreate、pendingDelete、pendingTransfer或pendingUpdate状态值。必须使用服务消息通知所有涉及到事务的客户端操作已经完成,并且对象的状态已经更改。
ok 状态只能和 linked 状态结合
linked 可以和任何状态结合
pendingDelete 状态不能和 clientDeleteProhibited 或 serverDeleteProhibited 状态结合
pendingUpdate状态不能和 clientUpdateProhibited 或 serverUpdateProhibited 状态结合
pendingCreate, pendingDelete, pendingTransfer, pendingUpdate 相互之间不能结合
2.4 日期和时间
日期和时间属性值必须使用公历以通用协调时间(UTC)表示。使用[W3C中定义的大写“T”和“Z”字符的扩展日期-时间表单。必须使用REC-xmlschema-2-20041028]来表示日期-时间值,因为XML模式不支持截断的日期-时间表单或小写的“T”和“Z”字符。
2.5 IP 地址
本文档中描述的IPv4地址语法必须符合[RFC0791]。本文中描述的IPv6地址语法必须符合[RFC4291]。在区域文件中发布IPv6地址信息的实际考虑被记录在[RFC2874]和[RFC3596]中。服务器可以拒绝没有分配给IANA公共使用的IP地址。当准备将主机对象用作DNS名称服务器时,应该只在需要生成DNS Glue记录时才需要IP地址
。
3. EPP命令映射
EPP语法和语义的详细描述可以在[RFC5730]中找到。这里描述的命令映射专门用于通过EPP提供和管理Internet主机名。
3.1 EPP查询(Query)命令
EPP提供两个命令来检索主机信息:<check>以确定是否可以在存储库中供应主机对象,<info>以检索与主机对象关联的详细信息。
3.1.1 < check >
EPP <check>命令用于确定是否可以在存储库中供应对象。它提供了一个提示,允许客户端使用<create>命令来预测配置对象的成功或失败,因为对象配置需求最终取决于服务器策略。
除了标准的EPP命令元素之外,<check>命令必须包含一个<host:check>元素,该元素标识主机名称空间。<host:check>元素包含以下子元素:
- 一个或多个<host:name>元素,其中包含要查询的主机对象的完全限定名。
<check>命令的示例:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <check>
C: <host:check
C: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
C: <host:name>ns1.example.com</host:name>
C: <host:name>ns2.example.com</host:name>
C: <host:name>ns3.example.com</host:name>
C: </host:check>
C: </check>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
当<check>命令被成功处理时,EPP <resData>元素必须包含一个子<host:chkData>元素,该元素标识主机名称空间。<host:chkData>元素包含一个或多个<host:cd>元素,这些元素包含以下子元素:
- 一个<host:name>元素,它包含被查询主机对象的完全限定名。此元素必须包含一个“avail”属性,其值指示在<check>命令完成时对象的可用性(是否可以提供它)。值“1”或“true”表示可以供应对象。值“0”或“false”表示不能供应对象。
- 一个可选的<host:reason>元素,它可能在无法供应对象时提供。如果存在,则此元素包含特定于服务器的文本,以帮助解释为什么不能供应对象。此文本必须用之前与客户协商的响应语言表示;如果协商的值不是默认值“en”(英语),那么可以使用一个可选的“lang”属性来标识语言。
<check>响应的示例:
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1000">
S: <msg>Command completed successfully</msg>
S: </result>
S: <resData>
S: <host:chkData
S: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
S: <host:cd>
S: <host:name avail="1">ns1.example.com</host:name>
S: </host:cd>
S: <host:cd>
S: <host:name avail="0">ns2.example2.com</host:name>
S: <host:reason>In use</host:reason>
S: </host:cd>
S: <host:cd>
S: <host:name avail="1">ns3.example3.com</host:name>
S: </host:cd>
S: </host:chkData>
S: </resData>
S: <trID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54322-XYZ</svTRID>
S: </trID>
S: </response>
S:</epp>
如果由于任何原因无法处理<check>命令,则必须返回EPP错误响应。
3.1.2 < info >
EPP <info>命令用于检索与主机对象关联的信息。除了标准的EPP命令元素之外,<info>命令必须包含标识主机名称空间的<host:info>元素。<host:info>元素包含以下子元素:
- 一个<host:name>元素,它包含请求信息的主机对象的完全限定名。
<info>命令的示例:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <info>
C: <host:info
C: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
C: <host:name>ns1.example.com</host:name>
C: </host:info>
C: </info>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
当<info>命令被成功处理时,EPP <resData>元素必须包含一个子<host:infData>元素,该元素标识主机名称空间。<host:infData>元素包含以下子元素:
- 一个<host:name>元素,它包含了主机对象的完全限定名。
- 一个<host:roid>元素,它包含创建对象时分配给主机对象的存储库对象标识符。
- 一个或多个描述主机对象状态的<host:status>元素。
- 零个或多个<host:addr>元素,其中包含与主机对象关联的IP地址。
- 一个<host:clID>元素,它包含发起客户端的标识符。
- 一个<host:crID>元素,它包含创建主机对象的客户端的标识符。
- 一个<host:crDate>元素,包含了创建主机对象的日期和时间。
- 一个<host:upID>元素,包含最后更新主机对象的客户端的标识符。如果从未修改过主机对象,则此元素不能出现。
- 一个<host:upDate>元素,其中包含最近一次修改主机对象的日期和时间。如果从未修改过主机对象,则此元素不能出现。
- 一个<host:trDate>元素,包含最近一次成功的主机对象传输的日期和时间。如果从未传输过主机对象,则不能提供此元素。注意,主机对象不能直接传输;在传输主机对象的上级域对象时,必须隐式地传输主机对象。在对域对象执行的EPP <info>命令的响应中列出了在转移域对象时要转移的主机对象。
<info>响应的示例:
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1000">
S: <msg>Command completed successfully</msg>
S: </result>
S: <resData>
S: <host:infData
S: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
S: <host:name>ns1.example.com</host:name>
S: <host:roid>NS1_EXAMPLE1-REP</host:roid>
S: <host:status s="linked"/>
S: <host:status s="clientUpdateProhibited"/>
S: <host:addr ip="v4">192.0.2.2</host:addr>
S: <host:addr ip="v4">192.0.2.29</host:addr>
S: <host:addr ip="v6">1080:0:0:0:8:800:200C:417A</host:addr>
S: <host:clID>ClientY</host:clID>
S: <host:crID>ClientX</host:crID>
S: <host:crDate>1999-04-03T22:00:00.0Z</host:crDate>
S: <host:upID>ClientX</host:upID>
S: <host:upDate>1999-12-03T09:00:00.0Z</host:upDate>
S: <host:trDate>2000-04-08T09:00:00.0Z</host:trDate>
S: </host:infData>
S: </resData>
S: <trID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54322-XYZ</svTRID>
S: </trID>
S: </response>
S:</epp>
如果由于任何原因无法处理<info>命令,则必须返回一个EPP错误响应。
3.1.3 < transfer >
transfer不直接应用于主机对象,因此没有为EPP < Transfer >查询命令定义映射。
3.2 EPP转换(Transform)命令
EPP提供了三个转换主机对象的命令:<create> 创建一个主机对象的实例, <delete>删除一个主机对象的实例, <update> 改变主机对象的信息。本文档没有为EPP <renew>和<transfer>命令定义主机对象映射
。
转换命令通常是实时
处理和完成的。服务器操作员可以接收和处理转换命令,但如果在完成请求的操作之前需要人工或第三方检查
,则可以推迟完成请求的操作。在这种情况下,服务器必须向客户端返回1001
响应代码,以说明已经接收和处理了命令,但是请求的操作正在等待处理。服务器还必须管理作为命令主体的对象的状态,以反映请求的操作的启动和完成。一旦操作完成,必须使用服务消息
通知事务中涉及的所有客户端操作已经完成,并且对象的状态已经更改。除了所需的服务消息外,还可以使用其他通知方法
。
服务器操作员应该确认客户端被授权对给定对象执行转换命令。未经授权的客户机必须拒绝任何转换对象的尝试,服务器必须向客户机返回2201响应代码,以注意客户机缺少执行请求的命令的权限。
3.2.1 < create >
EPP <create>命令提供了一个transform操作,允许客户端创建一个主机对象。除了标准的EPP命令元素之外,<create>命令必须包含标识主机名称空间的< host:create >元素。< host:create >元素包含以下子元素:
- 一个< host:name >元素,它包含要创建的主机对象的完全限定名。
- 零个或多个< host:addr >元素,其中包含要与主机关联的IP地址。每个元素可以包含一个“ip”属性来标识ip地址格式。属性值“v4”表示IPv4地址格式。属性值“v6”用于说明IPv6地址格式。如果没有指定“ip”属性,则默认属性值为“v4”。
在[RFC1034]和[RFC1035]中,DNS将主机配置为名称服务器
。作为名称服务器供应的主机可能受到服务器-操作员策略的约束,这些策略要求或禁止指定IP地址,具体取决于主机的名称和将服务器用作名称服务器的名称空间。当准备用作名称服务器时,仅在需要生成DNS Glue记录时才需要IP地址。例如,如果服务器对于“com”名称空间是权威的,并且服务器的名称是“ns1.example.net”,那么服务器就不需要为名称服务器生成DNS Glue记录,服务器的IP地址也不需要由DNS提供。
如果主机名存在于服务器具有权威的名称空间中,则在创建主机对象之前,服务器必须知道主机的上级域。
<create> 命令示例:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <create>
C: <host:create
C: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
C: <host:name>ns1.example.com</host:name>
C: <host:addr ip="v4">192.0.2.2</host:addr>
C: <host:addr ip="v4">192.0.2.29</host:addr>
C: <host:addr ip="v6">1080:0:0:0:8:800:200C:417A</host:addr>
C: </host:create>
C: </create>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
当<create>命令被成功处理时,EPP <resData>元素必须包含一个子< host:creData >元素,该元素标识主机名称空间。<host:creData>元素包含以下子元素:
- 一个< host:name >元素,它包含了主机对象的完全限定名。
- 一个< host:crDate >元素,它包含了创建主机对象的日期和时间。
<create> 响应的示例:
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1000">
S: <msg>Command completed successfully</msg>
S: </result>
S: <resData>
S: <host:creData
S: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
S: <host:name>ns1.example.com</host:name>
S: <host:crDate>1999-04-03T22:00:00.0Z</host:crDate>
S: </host:creData>
S: </resData>
S: <trID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54322-XYZ</svTRID>
S: </trID>
S: </response>
S:</epp>
如果由于任何原因无法处理<create>命令,则必须返回一个EPP错误响应。
3.2.2 < delete >
EPP <delete>命令提供了一个转换操作,允许客户端删除主机对象。除了标准的EPP命令元素之外,<delete>命令必须包含标识主机名称空间的<host:delete>元素。<host:delete>元素包含以下子元素:
- 一个<host:name>元素,它包含要删除的主机对象的完全限定名。
如果主机对象与任何其他对象相关联,则不应删除主机名称对象。例如,如果主机对象与域对象相关联,则在现有关联被破坏之前不应删除主机对象。在没有首先打破现有关联的情况下删除主机对象,可能会导致指向已删除主机对象的域对象的DNS解析失败。
<delete> 命令的示例:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <delete>
C: <host:delete
C: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
C: <host:name>ns1.example.com</host:name>
C: </host:delete>
C: </delete>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
当<delete>命令被成功处理时,服务器必须使用没有<resData>元素的EPP响应进行响应。
<delete> 响应的示例:
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1000">
S: <msg>Command completed successfully</msg>
S: </result>
S: <trID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54321-XYZ</svTRID>
S: </trID>
S: </response>
S:</epp>
如果由于任何原因无法处理<delete>命令,则必须返回一个EPP错误响应。
3.2.3 < renew >
renew不适用于主机对象
,因此没有为EPP <renew>命令定义映射。
3.2.4 < transfer >
transfer不直接应用于主机对象
,因此没有为EPP < Transfer >命令定义映射。主机对象隶属于现有的上级域对象,因此,当域对象被转移时,主机对象也会被转移
。
3.2.5 < update >
EPP <update>命令提供了一个转换操作,允许客户端修改主机对象的属性。除了标准的EPP命令元素之外,<update>命令必须包含标识主机名称空间的<host:update>元素。<host: update>元素包含以下子元素:
- 一个<host:name>元素,它包含要更新的主机对象的完全限定名。
- 一个可选的<host:add> element,其中包含要添加到对象的属性值。
- 一个可选的<host:rem>元素,它包含要从对象中删除的属性值。
- 一个可选的<host:chg>元素,它包含要更改的对象属性值。
如果不扩展命令,则必须提供至少一个<host:add>, <host:rem>,或<host:chg>元素。如果存在<update>扩展,则可以省略所有这些元素。<host:add> and <host:rem>元素包含以下子元素:
- 一个或多个<host:addr>元素,其中包含要与主机对象关联或从主机对象中删除的IP地址。<create>命令映射中描述的IP地址限制也适用于此。
- 一个或多个<host:status>元素,其中包含要与对象关联或从对象中删除的状态值。在指定要删除的值时,只有属性值是重要的;元素文本不需要匹配要删除的值。
一个<host:chg>元素包含以下子元素:
- 一个<host:name>元素,它包含一个新的完全限定的主机名,通过它可以知道主机对象。
主机名更新可能需要添加或删除IP地址才能被服务器接受。将主机配置为名称服务器时,IP地址关联可能受制于服务器策略。
主机名更改可能对引用主机对象的关联对象产生影响。更改主机名,不应对主机相关联的对象进行更新,以保留相关对象和主机之间的关联
,但有一个例外:更改与不同注册商注册的对象相关联的
外部主机对象。试图直接更新这样的主机必须失败,并返回EPP错误代码2305。可以通过名称或者其他属性创建一个新的外部主机,然后更新注册商的其他对象来更改外部主机。
<update>命令的示例:
C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C: <command>
C: <update>
C: <host:update
C: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
C: <host:name>ns1.example.com</host:name>
C: <host:add>
C: <host:addr ip="v4">192.0.2.22</host:addr>
C: <host:status s="clientUpdateProhibited"/>
C: </host:add>
C: <host:rem>
C: <host:addr ip="v6">1080:0:0:0:8:800:200C:417A</host:addr>
C: </host:rem>
C: <host:chg>
C: <host:name>ns2.example.com</host:name>
C: </host:chg>
C: </host:update>
C: </update>
C: <clTRID>ABC-12345</clTRID>
C: </command>
C:</epp>
当成功处理了<update>命令时,服务器必须使用没有<resData>元素的EPP响应进行响应。
<update>命令的响应:
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1000">
S: <msg>Command completed successfully</msg>
S: </result>
S: <trID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54321-XYZ</svTRID>
S: </trID>
S: </response>
S:</epp>
如果由于任何原因无法处理<update>命令,则必须返回一个EPP错误响应。
3.3 离线审查请求行动
命令由服务器按照从客户机接收命令的顺序进行处理。虽然服务器生成确认接收和处理命令的即时响应,但是服务器操作员可以在完成请求的操作之前对请求的转换命令进行离线检查。在这种情况下,来自服务器的响应必须清楚地注意到transform命令已经被接收和处理,但是请求的操作正在等待。相应对象的状态必须清楚地反映未决动作的处理。当离线处理完成时,服务器必须通知客户机。
这里包含了描述需要离线检查的<create>命令的示例。注意响应<create>命令返回的结果代码和消息。
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1001">
S: <msg>Command completed successfully; action pending</msg>
S: </result>
S: <resData>
S: <host:creData
S: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
S: <host:name>ns1.example.com</host:name>
S: <host:crDate>1999-04-03T22:00:00.0Z</host:crDate>
S: </host:creData>
S: </resData>
S: <trID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54322-XYZ</svTRID>
S: </trID>
S: </response>
S:</epp>
返回此响应后主机对象的状态必须包括“pendingCreate”。服务器操作员离线检查请求并将检查结果通知客户端,方法是通过<poll>命令对服务消息进行排队检索,或者使用带外机制将请求通知客户端。
服务消息必须包含描述响应<msgQ>元素的子<msg>元素中的通知的文本。此外,EPP <resData>元素必须包含一个子<host: panData>元素,该元素标识主机名称空间。元素包含以下子元素:
- 一个<host:name>元素,它包含了主机对象的完全限定名。<host:name>元素包含一个必需的"paResult"属性。一个正的布尔值表示请求已被批准并完成。一个负的布尔值表示请求被拒绝,并且请求的操作没有被执行。
- 一个<host:paTRID>元素,它包含客户端事务标识符和服务器事务标识符,并返回原始响应来处理命令。客户端事务标识符是可选的,只有在客户端使用原始的<create>命令提供标识符时才会返回。
- 一个<host:paDate>元素,它包含对所请求的操作的审查何时完成的日期和时间描述。
“review completed”(核验完成)服务的消息:
S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S: <response>
S: <result code="1301">
S: <msg>Command completed successfully; ack to dequeue</msg>
S: </result>
S: <msgQ count="5" id="12345">
S: <qDate>1999-04-04T22:01:00.0Z</qDate>
S: <msg>Pending action completed successfully.</msg>
S: </msgQ>
S: <resData>
S: <host:panData
S: xmlns:host="urn:ietf:params:xml:ns:host-1.0">
S: <host:name paResult="1">ns1.example.com</host:name>
S: <host:paTRID>
S: <clTRID>ABC-12345</clTRID>
S: <svTRID>54322-XYZ</svTRID>
S: </host:paTRID>
S: <host:paDate>1999-04-04T22:00:00.0Z</host:paDate>
S: </host:panData>
S: </resData>
S: <trID>
S: <clTRID>BCD-23456</clTRID>
S: <svTRID>65432-WXY</svTRID>
S: </trID>
S: </response>
S:</epp>