RFC 2832

NSI Registry Registrar Protocol (RRP) Version 1.1.0

πŸ“… published May 2000, from ietf

NSI Registry Registrar Protocol (RRP) Version 1.1.0 πŸ’–

Okay bestie, this is RFC 2832, and it's giving protocol-spec realness ✨ It was written by S. Hollenbeck and M. Srivastava from Network Solutions, Inc. Registry, and it's dated May 2000. The category is Informational πŸŽ€ which means it shares info with the Internet community but isn't an Internet standard. The title block has no Obsoletes or Updates lines, so this one isn't replacing or changing anything else πŸ¦‹ The Network Working Group is the group it came from, and the title is NSI Registry Registrar Protocol (RRP) Version 1.1.0 πŸ’…

Status of this Memo 🌸

This memo gives info to the Internet community 🫢 It does not specify an Internet standard of any kind. Distribution of this memo is unlimited.

Copyright (C) The Internet Society (2000). All Rights Reserved.

Abstract ✨

This doc describes a protocol for registering and managing second level domain names and their associated name servers, in both generic Top Level Domains (gTLDs) and country code Top Level Domains (ccTLDs). The Network Solutions Registry developed it for the Shared Registration System, and it's being published "as-is" to document the protocol implementation built by the Network Solutions, Inc. Registry πŸ”₯

Internet domain registration usually involves three entities. There's the registrant, who wants to register a domain name. There's the registrar, who helps the registrant out. And there's the registry, which serves the registrar and is the authoritative home for all the functional info needed to resolve names registered in its TLDs πŸ‘‘ This doc is only about registry-registrar communication. It doesn't cover any registrant services, so no need to look for those here πŸ™ˆ

This doc is being discussed on the "rrp" mailing list. To join, send a message to <majordomo@NSIRegistry.com> with the words subscribe rrp in the body. There's also a web site for the mailing list archives at <http://www.NSIRegistry.net/maillist/rrp> πŸ¦‹

Conventions Used In This Document 🧚

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be read as described in [MUSTSHOULD]. Also, the term "implicit attribute" means an entity attribute whose value is derived from another attribute, or depends on an established RRP session πŸ’œ

In examples, "C:" means lines sent by the registrar client, and "S:" means lines sent by the registry server πŸ“

The term "System" is used here to refer, all together, to this protocol and the software and hardware that implements it ✨

Table of Contents πŸŽ€

1. Introduction .................................................    3
2. Security Services ............................................    4
2.1 Connection Security .........................................    4
2.2 System Data Security ........................................    5
3. Connection Model .............................................    5
4. Protocol Description .........................................    6
4.1 Request Format ..............................................    7
4.2 Response Format .............................................    8
4.3 Protocol Commands ...........................................    8
4.3.1 ADD .......................................................    8
4.3.2 CHECK .....................................................   11
4.3.3 DEL .......................................................   12
4.3.4 DESCRIBE ..................................................   14
4.3.5 MOD .......................................................   14
4.3.6 QUIT ......................................................   16
4.3.7 RENEW .....................................................   17
4.3.8 SESSION ...................................................   18
4.3.9 STATUS ....................................................   18
4.3.10 TRANSFER .................................................   21
5. Response Codes ...............................................   23
5.1 Response Code Summary .......................................   23
5.2 Command-Response Correspondence .............................   28
6. Domain Status Codes ..........................................   29
6.1 Domain Status Code Description ..............................   30
7. Formal Syntax ................................................   30
8. Internationalization .........................................   35
9. Known Issues .................................................   35
10. Security Considerations .....................................   37
11. IANA Considerations .........................................   37
12. References ..................................................   37
13. Acknowledgments .............................................   38
14. Authors' Addresses ..........................................   38
15. Full Copyright Statement ....................................   39

1. Introduction 🌈

This doc specifies NSI Registry Registrar Protocol (RRP) version 1.1.0. It's a TCP-based, 7-bit US-ASCII text protocol that lets multiple registrars offer second level Internet domain name registration in the top level domains (TLDs) run by a TLD registry πŸ’– RRP is specified using Augmented Backus-Nauer Form (ABNF), as described in [ABNF]. All ABNF string literals are case-insensitive, and the examples in this doc might use mixed case so they're easier to read 🫢

RRP was developed by the Network Solutions, Inc. Registry as part of the Shared Registration System program. It was first deployed in April 1999 as part of a test bed implementation of the Shared Registration System, with five registrars. More registrars started using it in July 1999. Both the registry and the registrars learned a bunch of "lessons learned" from running it, and those are written up here as "Known Issues" πŸ”₯

This doc gives both a description of the protocol and notice of the operational issues people ran into. It's meant to be useful as first steps toward a standards track domain registration services protocol. The doc and the protocol it describes may change later, based on continued operational experience and community reaction πŸ¦‹

The registry stores info about registered domain names and their associated name servers. A domain name's data includes its name, its name servers, its registrar, its registration expiration date, and its status. A name server's data includes its server name, its IP addresses, and its registrar πŸ“ Using RRP, a registrar MAY perform the following registration service procedures:

  • Determine if a domain name has been registered.
  • Register a domain name.
  • Renew the registration of a domain name.
  • Cancel the registration of a domain name.
  • Update the name servers of a domain name.
  • Transfer a domain name from another registrar.
  • Examine the status of domain names that the registrar has registered.
  • Modify the status of domain names that the registrar has registered.
  • Determine if a name server has been registered.
  • Register a name server.
  • Update the IP addresses of a name server.
  • Delete a name server.
  • Examine the status of name servers that the registrar has registered.

All RRP commands include features for idempotency πŸ’… That means the effect of each command is the same whether it runs once or multiple times. This is super useful when a command gets retried after an error causes a missed command response. Command retries will be caught by the System and rejected with an appropriate error response code πŸ™Œ Any command parameters that don't provide idempotency will be fully explained in the matching command description ✨

2. Security Services πŸ”

RRP only provides basic password-based registrar authentication πŸ₯² Extra security services, including privacy and registrar authentication using public key cryptography, come from other System features.

2.1 Connection Security

Each RRP session MUST be encrypted using the Secure Socket Layer (SSL) v3.0 protocol, as specified in [SSL]. SSL gives privacy services that lower the risk of accidentally disclosing registrar-sensitive info, like the registrar's user identifier and password 🫢

SSL supports mutual authentication of both the client and the server using signed digital certificates. The Shared Registration System run by the NSI Registry requires digital certificates issued by a commercial certification authority for both registrar clients and public registry RRP servers. Both the registrar client and the public registry RRP server get authenticated when an SSL connection is set up. On top of that, a registrar MUST be authenticated when establishing an RRP connection through the RRP SESSION command, by providing a registrar user identifier and password that are known only to the registrar and the System πŸ”’ Registrars may change their session password at any time using the RRP SESSION command 🌸

The SSL protocol is not an IETF Standards Track protocol. The Transport Layer Security protocol, specified in [TLS], is a Standards Track protocol that provides SSL v3.0 compatibility features. πŸ’œ

2.2 System Data Security

The System stores info about registered domain names and their name servers. Only the current registrar of a registered domain name is authorized to query it, update its name servers, and cancel or renew it πŸ‘‘ Any registrar can request a transfer of a domain name and its associated name servers from another registrar to the requesting registrar. Only the current sponsoring registrar can receive and explicitly approve or reject domain transfer requests πŸ’…

Only a name server's registrar can query, update, and delete it 🧚 In general, name servers must be registered through the current registrar of the name server's parent domain name. Still, an implementation MAY allow use of name servers registered in other TLDs without specifying IP addresses or requiring parent domain registration. Using ccTLD name servers for a gTLD domain name is one such example πŸ¦‹

Name servers are implicitly transferred by the System when their parent domain name is transferred. Also, a name server cannot be deleted if it is hosting domain names πŸ™ˆ

3. Connection Model πŸŽ€

IANA has assigned TCP port 648 for RRP use πŸ’– All RRP implementations MUST provide RRP services over SSL on TCP port 648. An RRP server MUST return a banner in the following format to confirm that a connection has been established:

<registry name> RRP Server version <version><crlf>
<server build date and time><crlf>

Each line ends with carriage return and line feed characters 🌈 The server build date and time string includes the day, month, date, time (specified in hours, minutes, and seconds), the local time zone, and the four-digit year. A dot (".") in column one on a line by itself marks the end of the banner text ✨

Example πŸ¦‹

A registrar successfully establishes a connection with the NSI Registry on TCP port 648:

S:NSI RRP Server version 1.1.0
S:Mon Oct 25 20:20:34 EDT 1999
S:.

4. Protocol Description ✨

okay so this is where the RRP session gets juicy πŸ’… A typical session moves through a bunch of states over its lifetime, and Figure 1 shows every single state an RRP server can be in πŸ¦‹

First up, the server just waits for a client to connect and authenticate (PRE). Every client connection MUST be authenticated, no exceptions πŸ”’

                                   |
                                   |
                                   v
                          +-----------------+   Timeout
                          |   Waiting for   |-------------------+
   Authentication Succeeded  |      Client     |                   |
                   +---------|  Authentication | Authentication    |
                   |         |      (PRE)      |-----+  Failed     |
                   |         +-----------------+     |             |
                   |                                 |             |
                   V                                 V             |
             +-----------+     Succeeded    +--------------------+ |
             |Waiting for|<-----------------|    Waiting for     | |
             |  Command  |----------+       |Authentication Retry| |
             |   (WFC)   |  Timeout |       |       (WFR)        | |
             +-----------+          |       +--------------------+ |
                 |   ^              |           |         |        |
                 |   |              |   Timeout |         | Failed |
         Request V   |Response      |           |         |        |
             +-----------+          |           V         V        V
             | Executing |          |          +--------------------+
             |  Command  |          +--------->|    Disconnected    |
             |   (EXE)   |-------------------->|       (DIS)        |
             +-----------+          QUIT       +--------------------+

                Figure 1: RRP Server Finite State Machine

So if auth fails, the server gives the client another chance to identify itself (WFR) πŸ™ˆ If it fails again, the server disconnects (DIS). If auth works, the server waits for a request from the client (WFC). When a request lands, the server runs it and sends back the result (EXE), then goes right back to waiting (WFC). If the client sends a QUIT command, the server ends the session and disconnects (DIS) πŸ‘‹ To keep its state in sync with the server, the client SHOULD wait for a response from the server before sending another request on the same connection. Here's the state cheat sheet 🧚

     PRE     Waiting for client connection and authentication
     WFR     Waiting for authentication retry
     WFC     Waiting for a command from an authenticated client
     EXE     Executing a command
     DIS     Disconnected

The WFR and WFC states MAY time out. An implementation SHOULD define inactivity timeout periods for these states based on System-specific factors, including (but not limited to) resource availability and security risk. In the absence of other factors, a default timeout period of 10 minutes SHOULD be used. The server MAY disconnect if the server is in one of these states and no message is received from the client during the timeout period ⏰

4.1 Request Format πŸŽ€

An RRP request normally consists of a command name, an entity block, command options, and an end-of-command delimiter. Command options and entity blocks together define command parameters, and their specification is order independent. The examples in this document list entity blocks before command options, just FYI πŸ’•

CommandName [EntityBlock] [CommandOptions] EndOfCommand

A command name specifies the type of an RRP request. A command is a word or abbreviation ended by a carriage-return linefeed (crlf) sequence ✨

CommandName<crlf>

An entity block specifies the data in an RRP request. It's made up of attribute name-value pairs that describe the entity and all of its attributes πŸ“ Each pair starts with the attribute name, then a colon, then the attribute value, and it always ends with a carriage-return linefeed sequence. Entity blocks are optional for some requests.

entityName:entityValue<crlf>
attributeName:attributeValue<crlf>

Command options set control parameters for an RRP request. A command option starts with a dash, then the option name, a colon, the option value, and it ends with a carriage-return linefeed sequence 🌸

-commandOptionName:commandOptionValue<crlf>

An EndOfCommand delimiter marks the end of an RRP request. It's a dot (".") in column one, followed by a carriage-return linefeed sequence 🫢

.<crlf>

4.2 Response Format πŸ’œ

An RRP response starts with a three-digit response code, then a space, then an ASCII text description of the response, then a carriage-return linefeed sequence. After that come zero or more attribute name-value pair lines. The whole response ends with a dot in column one followed by a carriage-return linefeed sequence 🌈

ResponseCode<space>responseDescription<crlf>
[attributeName:attributeValue<crlf>]
.<crlf>

4.3 Protocol Commands πŸ”₯

Implementations of RRP commands MUST provide "all or nothing" success and failure operation. Failed command execution MUST leave the System in the same state it was in before the command was attempted and failed. Understood? Good, because this part is non-negotiable πŸ™…β€β™€οΈ

All RRP commands include features to provide idempotency. Command features that are not idempotent get fully explained as needed in the matching command description πŸ‘‘

4.3.1 ADD πŸ¦‹

This command lets a registrar register a domain name or a name server in the System.

4.3.1.1 Registering a Domain Name 🌸

The request to register a domain name MUST contain the following data:

  • The "EntityName" parameter set to value "Domain".
  • Fully qualified second level domain name in the "DomainName" parameter.

The request to register a domain name MAY contain 1 or more, and a maximum of 13, fully qualified name servers hosting the domain name in multiple instances of the "NameServer" parameter. The name servers MUST have already been registered in the registry. Implementations MAY allow specification of name servers associated with domains registered in other TLDs. For example, an implementation MAY allow use of ccTLD name servers for gTLD domain name registration 🌍

The request to register a domain name MAY contain the initial registration period in years for the domain being registered, in a single instance of the "Period" parameter. The System MUST provide a default initial registration period in years if the "Period" parameter is not provided. The acceptable year values for the "Period" parameter are implementation specific πŸ“…

The System will register the domain name to the registrar for the period the registrar specifies. If the registrar doesn't specify a registration period, a System-specified default value MUST be used for the initial registration period. If the domain name is successfully registered, the System MUST return the registration expiration date in the "registration expiration date" attribute in the response πŸŽ‰

Authorized User: All registrars MAY use the ADD command to register domain names πŸ’…

Examples 🧁

A registrar registers a domain name without specifying name servers:

C:add<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:-Period:10<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:registration expiration date:2009-09-22 10:27:00.0<crlf>
S:status:ACTIVE<crlf>
S:.<crlf>

A registrar registers a domain name using previously-registered name servers:

C:add<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example2.com<crlf>
C:-Period:10<crlf>
C:NameServer:ns1.example.com<crlf>
C:NameServer:ns2.example.com<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:registration expiration date:2000-09-22 10:27:00.0<crlf>
S:status:ACTIVE<crlf>
S:.<crlf>

4.3.1.2 Registering a Name Server 🧚

The request to register a name server MUST contain the following data:

  • The "EntityName" parameter set to value "NameServer".
  • Fully qualified server name of the name server in the "NameServer" parameter.

If the name server being registered is the child of a registered domain name, the name server registration request MUST include one or more, and a maximum of 13, name server IP addresses in multiple instances of the "IPAddress" parameter. Name servers associated with domains registered in other TLDs SHOULD NOT be specified with IP addresses, to reduce the possibility of duplicating DNS NS records for the name servers in multiple zone files πŸ™ˆ

The registrar MUST register the name server in the System before using it to host domain names. Further, the name server MUST be registered through the same registrar that is the current registrar of its parent domain name. The System MAY allow any registrar to use the name server to host domain names 🫧

Authorized User: All registrars MAY use the ADD command to register name servers πŸ’–

Examples ✨

A registrar registers a new name server in an existing domain name:

C:add<crlf>
C:EntityName:NameServer<crlf>
C:NameServer:ns1.example.com<crlf>
C:IPAddress:198.41.1.11<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

4.3.2 CHECK πŸ”

This command lets a registrar find out if a domain name or name server has been registered in the System πŸ‘€

4.3.2.1 Domain Name Check 🌷

The request to determine if a domain name is registered MUST contain the following data:

  • The "EntityName" parameter set to value "Domain".
    • Fully qualified second level domain name in the "DomainName" parameter.

The System MUST provide a positive or negative response to document domain name availability at the moment the command is executed πŸ“Έ

Authorized User: All registrars MAY use the CHECK command to determine if a domain name has been registered or not πŸ™Œ

Examples 🍭

A registrar checks the availability of a domain name in the System:

C:check<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:.<crlf>
S:211 Domain name not available<crlf>
S:.<crlf>

4.3.2.2 Name Server Check πŸ¦„

The request to determine if a name server is registered MUST contain the following data:

  • The "EntityName" parameter set to value "NameServer".
  • Fully qualified server name in the "NameServer" parameter.

The System MUST provide a positive or negative response to document name server availability at the moment the command is executed. If the name server has been registered, the System MUST return the IP address(es) of the name server 🌟

Authorized User: All registrars MAY use the CHECK command to determine if a name server has been registered or not πŸ’…

Examples πŸŽ€

A registrar checks the availability of a server name in the System:

C:check<crlf>
C:EntityName:Nameserver<crlf>
C:Nameserver:ns1.example.com<crlf>
C:.<crlf>
S:213 Name server not available<crlf>
S:ipAddress:192.10.10.10<crlf>
S:.<crlf>

4.3.3 DEL πŸ—‘οΈ

This command lets a registrar delete (cancel the registration of) a domain name or delete a name server πŸŒ™

4.3.3.1 Deleting a Domain Name πŸ’…

okay bestie, deleting a domain name. the request to cancel the registration of a domain name MUST contain these two things:

  • The "EntityName" parameter set to value "Domain".
  • Fully qualified second level domain name in the "DomainName" parameter.

a request to delete a domain name SHOULD cause the deletion of all name servers that are children of the domain name being deleted πŸ₯Ί. those name servers SHOULD be deleted if they are not actively hosting other domains. and a domain MUST not be deleted if it has child name servers hosting other domains. no cap, that's a whole safety net 🫢

Authorized User: the current registrar of a domain name MAY use the DEL command to delete a domain name from the System. ✨

Examples

a registrar deletes a domain name, and all the name servers registered in that domain get deleted along with it πŸ’€:

C:del<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

4.3.3.2 Deleting a Name Server 🧚

the request to delete a name server MUST contain these two things:

  • The "EntityName" parameter set to value "NameServer".
  • Fully qualified name of the name server in the "NameServer" parameter.

a name server MUST not be deleted if it is hosting domains. deleting those domains or name servers is prohibited, because their deletion will result in orphaning the hosted domains. that's a hard no, babe πŸ™…β€β™€οΈ

Authorized User: the current registrar of a name server MAY use the DEL command to delete a name server from the System. πŸŽ€

Examples

a registrar deletes a name server that is not hosting domains:

C:del<crlf>
C:EntityName:NameServer<crlf>
C:NameServer:ns1.registrarA.com<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

a registrar tries to delete a name server that is hosting domains, and gets blocked 🚫:

C:del<crlf>
C:EntityName:NameServer<crlf>
C:NameServer:ns1.registrarA.com<crlf>
C:.<crlf>
S:532 Domain names linked with name server<crlf>
S:.<crlf>

4.3.4 DESCRIBE πŸ¦‹

this command lets a registrar grab general info about an RRP implementation. the command MAY contain the following parameters:

  • The "Target" parameter set to value "Protocol".

the implementation MUST return the protocol version number whether or not the request contains the "Target" parameter. so you always get the version, period 🌈

Authorized User: all registrars MAY use the DESCRIBE command. πŸ’–

Examples

a registrar gets general info about an RRP implementation:

C:describe<crlf>
C:-Target:Protocol<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:Protocol:RRP 1.1.0<crlf>
S:.<crlf>

4.3.5 MOD 🌸

this command lets a registrar update a registered domain name or a name server. it works on an attribute value for both single-valued and multi-valued attributes, and it's giving versatile ✨:

  • Add an attribute value. The value to be added MUST be unique among the values of the attribute. For a single-valued attribute, it replaces the current value.
  • Remove an attribute value. The value to be removed MUST exist. Further, an attribute value cannot be removed if it is the only value of a required attribute.

attribute values to be removed get tagged with an "=" suffix. that's how the system knows what to yeet πŸ—‘οΈ

4.3.5.1 Domain Modification πŸ“

the request to modify a registered domain name MUST contain these two things:

  • The "EntityName" parameter set to value "Domain".
  • Fully qualified second level domain name in the "DomainName" parameter.

the registrar can do these update operations on the domain name:

  • Update the name servers of the domain name by setting one or more instances of the "NameServer" parameter.
  • Update the status of the domain name by setting one or more instances of the "Status" parameter. Valid values for the "Status" parameter are defined in Section 6.

Authorized User: the current registrar of a domain name MAY use the MOD command to modify the attributes of a domain name. πŸ‘‘

Examples

a registrar removes one name server (ns1) from a domain and adds a brand new name server (ns3) to the same domain. glow-up arc πŸ’…:

C:mod<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:NameServer:ns3.registrarA.com<crlf>
C:NameServer:ns1.registrarA.com=<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

4.3.5.2 Name Server Modification 🫧

the request to update a name server MUST contain these two things:

  • The "EntityName" parameter set to value "NameServer".
  • Fully qualified server name of the name server in the "NameServer" parameter.

the registrar can do these update operations on the name server:

  • Update the "NameServer" attribute of the name server. This lets a registrar change the name of a name server while keeping all existing associations intact. iconic behavior πŸ™Œ
  • Update the IP addresses of the name server by setting one or more instances of the "IPAddress" parameter.

Authorized User: the current registrar of a name server MAY use the MOD command to modify the attributes of a domain name. πŸ¦„

Examples

a registrar changes both the name and the IP address of a name server:

C:mod<crlf>
C:EntityName:NameServer<crlf>
C:NameServer:ns1.registrarA.com<crlf>
C:NewNameServer:ns2.registrarA.com<crlf>
C:IPAddress:198.42.1.11<crlf>
C:IPAddress:198.41.1.11=<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

4.3.6 QUIT πŸ‘‹

this command lets a registrar close an RRP connection. a response MUST be sent before the connection gets closed. we don't ghost the server 😀

Authorized User: all registrars MAY use the QUIT command. ✨

Examples

a registrar ends an RRP session and closes the connection:

C:quit<crlf>
C:.<crlf>
S:220 Command completed successfully. Server closing connection<crlf>
S:.<crlf>

4.3.7 RENEW πŸŽ€

this command lets a registrar renew a domain name in the System. the request to renew a domain name MUST contain these two things:

  • The "EntityName" parameter set to value "Domain".
  • Fully qualified second level domain name in the "DomainName" parameter.

the request to renew a domain name MAY also contain the renewal period in years, using a single instance of a "Period" parameter and a single instance of a "CurrentExpirationYear" parameter. these two MUST appear together if either one is specified, though the order they show up in is totally insignificant πŸ’…. the "Period" parameter says how many years get added to the registration. the "CurrentExpirationYear" parameter gives the current expiration year, and it's required so that repeated attempts to retry this command do not result in multiple successful renewals. the System MUST provide a default number of renewal years if the "Period" and "CurrentExpirationYear" parameters are not provided. repeated use of this command without those two parameters may result in repeated successful renewals, since idempotency is not provided when they aren't used. so be careful with that one πŸ‘€. the acceptable year values for the "Period" parameter are implementation specific, subject to syntax restrictions.

the System renews the domain name for a period the registrar specified. if the renewal goes through successfully, the System MUST return the new registration expiration date in the "RegistrationExpirationDate" attribute in the response. πŸŽ‰

Authorized User: the current registrar of a domain name MAY use the RENEW command. 🌷

Examples

a registrar renews a domain name using a specified renewal period:

C:renew<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:-Period:9<crlf>
C:-CurrentExpirationYear:2001<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:registration expiration date:2010-09-22 10:27:00.0<crlf>
S:.<crlf>

4.3.8 SESSION πŸ”

this command lets a registrar establish an RRP session. a registrar can also use it to change their password, which is a whole main character moment πŸ’œ. the request to establish an RRP connection MUST contain these command parameters:

  • The "Id" parameter set to the registrar's System user ID.
  • The "Password" parameter set to the registrar's current System password.

the request to establish an RRP session MAY also contain a new password for the registrar, using a single instance of the "NewPassword" parameter.

the registrar MUST send this command to the System before any other command. if the command fails because of invalid information (like a wrong registrar ID or password), the registrar can resend the request with corrected info. if it fails a second time, the System SHOULD close the connection. πŸ™ˆ

Authorized User: all registrars MAY use the SESSION command. πŸ“

Examples

a registrar establishes an RRP session:

C:session<crlf>
C:-Id:registrarA<crlf>
C:-Password:i-am-registrarA<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

4.3.9 STATUS πŸ”

this command lets a registrar check the current status of a domain name or name server. ✨

4.3.9.1 Domain Status 🌈

the request to query a domain name MUST contain these two things:

  • The "EntityName" parameter set to value "Domain".
  • Fully qualified second level domain name in the "DomainName" parameter.

the response from the System MAY contain the following data:

  • Fully qualified server names of name servers hosting the domain name, in multiple instances of the "nameserver" attribute.
  • Registration expiration date in the "registration expiration date" attribute.
  • ID of the current registrar of the domain name in the "registrar" attribute.
  • Date the domain name was transferred by the current registrar, in the "registrar transfer date" attribute.
  • Current statuses of the domain name, in multiple instances of the "status" attribute.
  • Date the domain name was originally registered, in the "created date" attribute.
  • ID of the registrar that originally registered the domain name, in the "created by" attribute.
  • Date the domain name was last updated, in the "updated date" attribute.
  • ID of the entity (either a registrar or the registry) that last updated the domain name, in the "updated by" attribute.

Authorized User: the current registrar of a domain name MAY use the STATUS command to view the current domain name attributes. πŸ’…

Examples

the current registrar of a domain name queries the domain name:

C:status<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:nameserver:ns2.registrarA.com<crlf>
S:nameserver:ns3.registrarA.com<crlf>
S:registration expiration date:2010-09-22 10:27:00.0<crlf>
S:registrar:registrarA<crlf>
S:registrar transfer date:1999-09-22 10:27:00.0<crlf>
S:status:ACTIVE<crlf>
S:created date:1998-09-22 10:27:00.0<crlf>
S:created by:registrarA<crlf>
S:updated date:2002-09-22 10:27:00.0<crlf>
S:updated by:registrarA<crlf>
S:.<crlf>

a registrar queries a domain name that's currently registered by another registrar, and gets denied πŸ™…β€β™€οΈ:

C:status<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:.<crlf>
S:531 Authorization failed<crlf>
S:.<crlf>

4.3.9.2 Name Server Status ✨

okay bestie, this is the name server version of STATUS 🧚 The request to query a name server MUST contain the following data:

  • The EntityName parameter set to value NameServer.
  • Fully qualified name of the name server in the NameServer parameter.

The response from the System MAY contain the following data:

  • Fully qualified name of the name server in the nameserver attribute.
  • IP addresses of the name server in multiple instances of the ipaddress attribute.
  • ID of the current registrar of the name server in the registrar attribute.
  • Date the name server was transferred by the current registrar in the registrar transfer date attribute.
  • Date the name server was registered in the created date attribute.
  • ID of the entity that registered the name server in the created by attribute.
  • Date the name server was last updated in the updated date attribute.
  • ID of the entity that last updated the name server in the updated by attribute.

Authorized User: The current registrar of a name server MAY use the STATUS command to view current domain name attributes. πŸ’…

Examples πŸŽ€

The current registrar of a name server queries the name server:

C:status<crlf>
C:EntityName:NameServer<crlf>
C:NameServer:ns1.registrarA.com<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:ipaddress:198.42.1.11<crlf>
S:registrar:registrarA<crlf>
S:registrar transfer date:1999-09-22 10:27:00.0<crlf>
S:CreatedDate:1998-09-22 10:27:00.0<crlf>
S:CreatedBy:registrarA<crlf>
S:UpdatedDate:2002-09-22 10:27:00.0<crlf>
S:UpdatedBy:registrarA<crlf>
S:.<crlf>

A registrar queries a name server that was registered by another registrar:

C:status<crlf>
C:EntityName:NameServer<crlf>
C:NameServer:ns1.registrarA.com<crlf>
C:.<crlf>
S:531 Authorization failed<crlf>
S:.<crlf>

4.3.10 TRANSFER πŸ¦‹

this command lets a registrar request a transfer of domain name sponsorship from a second registrar, and also lets them approve or reject transfer requests started by other registrars πŸ”₯ The request to transfer a domain name MUST contain the following data:

  • The EntityName parameter set to value Domain.
  • Fully qualified second level domain name in the DomainName parameter.

The identity of the requesting registrar is derived from the current active session. The identity of the current sponsoring registrar (the registrar who must approve or reject the transfer request) is known by the registry and does not need to be known by the requesting registrar in advance of issuing the transfer request. 🧠

The System MUST notify the potential losing registrar when a domain transfer request has been received using an out-of-band transport mechanism such as electronic mail and/or transaction reporting. The losing registrar SHOULD then explicitly approve or reject the transfer. A request to approve or reject a transfer request MUST contain a single instance of the Approve parameter with a value of Yes to approve the transfer or a value of No to reject the transfer. A server implementation MAY provide a default approval or rejection action to be taken if the losing registrar does not explicitly approve or reject the transfer request within a fixed amount of time. The criteria used by registrars to approve or deny requested transfers are typically based on business policies that are beyond the scope of this document. 🌸

Approval of a transfer by the current sponsoring registrar results in a change of sponsorship to the original requesting registrar. Approval attempts by any other registrar MUST result in explicit failure of the attempted approval. Rejection of the transfer by the current sponsoring registrar results in an end to the transfer request with no change in sponsorship. Rejection attempts by any other registrar MUST result in explicit failure of the attempted rejection. πŸ™ˆ

Name servers MUST be implicitly transferred when their parent domain name is transferred. πŸ’œ

Authorized User: All registrars MAY use the TRANSFER command to request transfer of registration service authority to the requesting registrar. Only the current sponsoring registrar of a domain name may explicitly approve or reject a requested transfer. The registry MAY implicitly approve or reject requested transfers after a fixed amount of time. ⭐

Examples πŸŽ€

A registrar requests transfer of a domain name from another registrar:

C:transfer<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

The original registrar approves the transfer request:

C:transfer<crlf>
C:-Approve:Yes<crlf>
C:EntityName:Domain<crlf>
C:DomainName:example.com<crlf>
C:.<crlf>
S:200 Command completed successfully<crlf>
S:.<crlf>

5. Response Codes 🌈

RRP commands may return a variety of response codes to signify normal completion or error conditions. This section documents all of the defined RRP response codes. πŸ“š

5.1. Response Code Summary ✨

okay bestie, here's the full response code lineup πŸ’… these are the codes the server sends back, and the vibe is "read this carefully or your client will be sad" πŸ₯Ί

  • 200 Command completed successfully: this is the normal response when most RRP commands succeed πŸŽ‰
  • 210 Domain name available: the normal success response for a CHECK on a domain name that isn't registered yet πŸ¦‹
  • 211 Domain name not available: the normal success response for a CHECK on a domain name that is already registered πŸ™…β€β™€οΈ
  • 212 Name server available: the normal success response for a CHECK on a name server that isn't registered right now ✨
  • 213 Name server not available: the normal success response for a CHECK on a name server that is already registered πŸ’œ
  • 220 Command completed successfully. Server closing connection: this is the normal response when a QUIT command finishes successfully πŸ‘‹ it can also show up on other RRP commands if there's a temporary situation that means the connection has to close after that command completes successfully 🌸
  • 420 Command failed due to server error. Server closing connection: a temporary server error broke the command AND ended the session 😭 you'll need to set up a brand new session before you can keep going
  • 421 Command failed due to server error. Client should try again: a temporary server error broke the command, but it's not the end of the world 🫢 a retry might totally work
  • 500 Invalid command name: the command name you sent isn't one the server recognizes as a valid RRP command πŸ™ˆ
  • 501 Invalid command option: a parameter you sent isn't one the server recognizes as a valid RRP command parameter πŸ€”
  • 502 Invalid entity value: the "value" in an entity name-value pair is invalid πŸ’€ commands that need an "EntityName" parameter also need a value that names the entity, and yours didn't pass
  • 503 Invalid attribute name: same vibe as 501, a parameter you sent isn't one the server recognizes as a valid RRP command parameter 🌈
  • 504 Missing required attribute: you forgot a parameter the command needs to run 😬 retry with every required parameter included 🧚
  • 505 Invalid attribute value syntax: a parameter value is written incorrectly, like when a year digit such as "5" is needed but you sent "five" πŸ“
  • 506 Invalid option value: the value you gave a parameter is out-of-bounds or just not within the System's acceptable limits 🚫
  • 507 Invalid command format: the command doesn't look like a well-formed RRP command at all πŸŒ€ retry with the proper structure and syntax
  • 508 Missing required entity: an entity the command needs to finish wasn't included 🫠 for example, CHECK needs either a "Domain" entity or a "Nameserver" entity, so pick one
  • 509 Missing command option: a parameter that isn't really optional (like the registrar ID in a SESSION command) didn't get sent πŸ₯² retry with all the needed parameters
  • 520 Server closing connection. Client should try opening new connection; <why>: a timeout was detected and your session is ending ⏰ the System SHOULD define timeout periods for starting a client command, finishing a client command, and for how long an open session can last, and the reason for the timeout MUST be included at the end of the response code string πŸ’–
  • 521 Too many sessions open. Server closing connection: the System's limit on open connections has been hit, so a new session can't be made right now πŸšͺ waiting a few moments or closing sessions you aren't using might help
  • 530 Authentication failed: the registrar identifier or password you sent wasn't recognized by the System πŸ”‘ a retry with valid values might work, and repeated authorization failures MAY lead to the TCP connection being terminated πŸ›‘
  • 531 Authorization failed: registrars aren't allowed to view or change data belonging to the registry or to another registrar πŸ™… this usually pops up when you try to touch someone else's data, like running STATUS on a domain registered to a different registrar πŸ‘€
  • 532 Domain names linked with name server: the name server is hosting active domains, so you can't delete it 🚫 the registry MUST not allow the registrar to delete this server, and every domain name using it MUST be changed to use a different name server before the server can be deleted 🧹
  • 533 Domain name has active name servers: you're trying to delete a domain that is the parent domain of an active name server (one that's hosting active domains) πŸ™…β€β™€οΈ all of the name servers inside that domain MUST be taken out of service before the domain can be deleted
  • 534 Domain name has not been flagged for transfer: you're trying to approve or reject a transfer for a domain that isn't waiting on one πŸ€·β€β™€οΈ
  • 535 Restricted IP address: IANA marks certain IP address ranges as not valid for normal use πŸ›‘ you tried to use an IP from one of those restricted ranges
  • 536 Domain already flagged for transfer: you tried to start a transfer for a domain that's still waiting on an earlier transfer request to be approved ⏳
  • 540 Attribute value is not unique: the value you sent has to be unique and isn't 😀 this happens when you add a domain name that already exists, a server that already exists, or an IP address another server is already using 🌐 it can also happen during domain modifications, like adding a server that's already on the domain's list or setting a status it already has 🫣 the RRP STATUS command MAY be used to check the current domain name status before you try changing it, and when you're modifying or adding a name server, the IP address might not be unique πŸ’… the registry MUST not allow an IP address to be used by more than one server
  • 541 Invalid attribute value: a parameter value is invalid, like a bad IP address, a bad domain name, a bad server name, or a bad renewal period πŸ™ƒ
  • 542 Invalid old value for an attribute: the current value you're trying to change is invalid 🧐 you're trying to modify an attribute of a server or domain that doesn't exist in the registry
  • 543 Final or implicit attribute cannot be updated: you tried to change an attribute only the registry is allowed to change πŸ”’ registrars can't modify final or implicit attribute values, sorry bestie
  • 544 Entity on hold: the operation got rejected because the entity is on HOLD status βœ‹ if the registrar set that HOLD, you can change it with the MOD command and then retry πŸ”„ if the registry set it, the registrar must contact the registry to change the status before the command can succeed πŸ“ž
  • 545 Entity reference not found: a required entity reference doesn't exist πŸ•΅οΈ this happens when a registrar adds a new name server but the parent domain of that name server isn't in the registry, and also when someone tries to add a new name server to a domain while that name server doesn't exist in the registry
  • 546 Credit limit exceeded: the registrar has gone over its credit limit πŸ’Έ this is an implementation specific error that shows up when a potentially billable operation (like adding, renewing, or transferring a domain name) is attempted without enough financial standing with the registry
  • 547 Invalid command sequence: RRP commands need to come in a particular order, and this one came in the wrong order πŸ”€ the ill-formed command got received and rejected
  • 548 Domain is not up for renewal: you tried to RENEW a domain outside the window where renewal is allowed πŸ“… implementations MAY limit renewal periods to particular time frames, such as within 90 days of the domain's expiration, so this just means the RENEW arrived outside the System-defined renewal period
  • 549 Command failed: a System error stopped the command from finishing πŸ€’ retrying might work, but if it keeps failing, that points to a System error condition
  • 550 Parent domain not registered: the parent domain of the name server you're registering isn't registered 🏠 this happens when a registrar adds a new name server and the parent domain isn't in the registry yet
  • 551 Parent domain status does not allow for operation: the parent domain's status doesn't allow what you're trying to do 🚧 this happens when a registrar tries to modify a server whose parent domain is flagged as LOCK or HOLD in the registry
  • 552 Domain status does not allow for operation: the domain's own status doesn't allow what you're trying to do πŸ” this happens when a registrar tries to modify or delete a domain flagged as LOCK or HOLD in the registry
  • 553 Operation not allowed. Domain pending transfer: the domain's status doesn't allow the operation, because you tried to delete a domain that's waiting for a transfer request to be approved or denied πŸ›«
  • 554 Domain already registered: a registrar tried to register a domain name that the same registrar already registered πŸ”
  • 555 Domain already renewed: a registrar tried to renew a domain with the exact same parameters as an earlier successful renewal πŸ™„ this commonly happens when the same RENEW command gets run more than once
  • 556 Maximum registration period exceeded: a registrar tried to renew a domain and the resulting registration period goes past the System-defined maximum πŸ“ˆ if there's still renewal time available within that maximum, you may be able to retry the RENEW command with renewal period parameters that fit ✨

5.2. Command-Response Correspondence ✨

Okay so the chat between client and server is supposed to be a back-and-forth, like texting. Every command a client sends MUST be acted on by the server, and the server MUST send back a response code saying how it went. "Success" means the command finished normally with no errors. "Failure" means the System didn't finish the command the way it was asked. Failure can come from syntax, semantic, data, or System errors. πŸ’…

Here's the full list of response codes for each RRP command πŸ‘‡

Command: ADD
Success: 200, 220
Failure: 420, 421, 500, 502, 503, 504, 505, 507, 508, 520, 531, 535,
540, 541, 545, 546, 547, 549, 550, 554

Command: CHECK
Success: 210, 211, 212, 213
Failure: 220, 420, 421, 500, 502, 503, 504, 505, 507, 508, 520, 541,
547, 549

Command: DEL
Success: 200, 220
Failure: 420, 421, 500, 502, 503, 504, 505, 507, 508, 520, 531, 532,
533, 541, 544, 545, 547, 549, 551, 552, 553

Command: DESCRIBE
Success: 200, 220
Failure: 420, 421, 500, 501, 506, 507, 509, 520, 547, 549
Command: MOD
Success: 200, 220
Failure: 420, 421, 500, 502, 503, 504, 505, 507, 508, 520, 531, 535,
540, 541, 542, 543, 544, 545, 547, 549, 550, 551, 552, 553

Command: QUIT
Success: 220
Failure: 420, 421, 500, 507, 520, 547, 549

Command: RENEW
Success: 200, 220
Failure: 420, 421, 500, 502, 503, 504, 505, 507, 508, 520, 531, 541,
545, 546, 547, 548, 549, 552, 553, 555, 556

Command: SESSION
Success: 200, 220
Failure: 420, 421, 500, 501, 506, 507, 508, 509, 520, 521, 530, 531,
547, 549

Command: STATUS
Success: 200, 220
Failure: 420, 421, 500, 501, 502, 503, 504, 505, 506, 507, 508, 520,
531, 541, 545, 547, 549

Command: TRANSFER
Success: 200, 220
Failure: 420, 421, 500, 501, 502, 503, 504, 505, 506, 507, 508, 520,
531, 534, 536, 541, 544, 545, 546, 547, 549, 552, 553

6. Domain Status Codes 🌸

A domain's status is something you can check with the RRP STATUS command and change with the RRP MOD command. Both the registry and the sponsoring registrar MAY view and change a domain's status. The rules for when statuses change depend heavily on each registry's and registrar's business model, so they're beyond the scope of this spec. 🧚

The domain's status SHOULD directly affect whether the domain shows up in the TLD zone file and whether it can be modified. A domain can have more than one status at once, like REGISTRAR-HOLD and REGISTRAR-LOCK. If a domain is in ACTIVE status, then it can only be in that status. When a registrar sets REGISTRAR-LOCK, the registry MUST automatically remove the ACTIVE status. When the registrar removes REGISTRAR-LOCK and the other statuses, the registry MUST automatically set the domain's status to ACTIVE. πŸ”

6.1. Domain Status Code Description πŸ’œ

  • ACTIVE: This is the default status of a domain at registration time. The registry sets the domain to this status. The registrar can modify the domain. The domain can be renewed. The domain SHALL be included in the zone file when in this status if the domain has at least one associated name server.
  • REGISTRY-LOCK: The registry sets the domain to this status. The registrar cannot modify or delete the domain. The registry MUST remove the REGISTRY-LOCK status for the registrar to modify the domain. The domain can be renewed. The domain SHALL be included in the zone file when in this status if the domain has at least one associated name server.
  • REGISTRY-HOLD: The registry sets the domain to this status. The registrar cannot modify or delete the domain. The registry MUST remove the REGISTRY-HOLD status for the registrar to modify the domain. The domain can be renewed. The domain SHALL NOT be included in the zone file when in this status.
  • REGISTRAR-HOLD: The registrar of the domain sets the domain to this status. The domain can not be modified or deleted when in this status. The registrar MUST remove REGISTRAR-HOLD status to modify the domain. The domain can be renewed. The domain SHALL NOT be included in the zone file when in this status.
  • REGISTRAR-LOCK: The registrar of the domain sets the domain to this status. The domain cannot be modified or deleted when in this status. The registrar MUST remove REGISTRAR-LOCK status to modify the domain. The domain can be renewed. The domain SHALL be included in the zone file when in this status.
  • REGISTRY-DELETE-NOTIFY: A domain is set to this status if it has expired and has child name servers that are hosting other domains. Only the registry may set this status. The domain SHALL be included in the zone file when in this status if the domain has at least one associated name server.

7. Formal Syntax πŸŽ€

Time for the spicy part, the grammar! The following syntax specification uses the augmented Backus-Naur Form (BNF) as described in [ABNF].

; ABNF specification for Registry Registrar Protocol (RRP) v1.1.0
; Note that character string literals are case insensitive.

; Lexical tokens
space = %x20 ; " "
dot = %x2E ; "."
dash = %x2D ; "-"
underscore = %x5F ; "_"
colon = %x3A ; ":"
cr = %x0D ; ASCII carriage return
lf = %x0A ; ASCII linefeed
crlf = cr lf
alpha = %x41-5A / %x61-7A ; A-Z / a-z
digit = %x30-39 ; 0-9
dns-char = alpha / digit / dash
id-char = alpha / digit / underscore / dash
id-prefix = alpha / digit
id-word = id-prefix *id-char
printable-char = %x20-7E ; ASCII " " - "~"

; Start of basic grammar.
year = 4digit
month = 2digit
day = 2digit
ymd = year dash month dash day
hour = 2digit
minute = 2digit
second = 2digit
split-second = 1digit
hms = hour colon minute colon second dot split-second
time-stamp = ymd space hms
ip-address = 1*3digit dot 1*3digit dot 1*3digit dot 1*3digit
password = 4*16printable-char
option-name = 1*128id-word
option-tag = dash option-name
option-value = 1*128id-word
attribute-name = 1*128id-word
attribute-value = 1*128printable-char
attribute-line = attribute-name colon attribute-value crlf
response = 3digit space 1*printable-char crlf
version-number = "RRP" space 1*digit dot 1*digit dot 1*digit
label = id-prefix [*61dns-char id-prefix]
sldn = label dot label
servername = *(label dot) sldn
period = %x31-39 / (%x31-39 %x30-39) ; "1" - "9" or "10" - "99"
period-option = dash "Period" colon period crlf
yesno = "Yes" / "No"
domainstatus = "Active" / "Registry-Lock" / "Registry-Hold" /
               "Registrar-Lock" / "Registrar-Hold" /
               "Registry-Delete-Notify"

; RRP commands and responses.
rrp = add / check / delete / describe / mod / quit / renew /
      session / status / transfer

add = add-request add-response
check = check-request check-response
delete = del-request del-response
describe = describe-request describe-response
mod = mod-request mod-response
quit = quit-request quit-response
renew = renew-request renew-response
session = session-request session-response
status = status-request status-response
transfer = transfer-request transfer-response

; ADD command.
add-request = add-domain-request / add-nameserver-request
add-response = add-domain-response / add-nameserver-response
add-domain-request = "add" crlf
 "EntityName" colon "Domain" crlf
 "DomainName" colon sldn crlf
 [period-option]
 0*13("NameServer" colon servername crlf)
 dot crlf
add-nameserver-request = "add" crlf
 "EntityName" colon "NameServer" crlf
 "NameServer" colon servername crlf
 1*("IPAddress" colon ip-address crlf)
 dot crlf
add-domain-response = response
 "RegistrationExpirationDate" colon time-stamp crlf
 "status" colon domainstatus crlf
 dot crlf
add-nameserver-response = response
 dot crlf

; CHECK command.
check-request = check-domain-request / check-nameserver-request
check-response = check-domain-response / check-nameserver-response
check-domain-request = "check" crlf
 "EntityName" colon "Domain" crlf
 "DomainName" colon sldn crlf
 dot crlf
check-nameserver-request = "check" crlf
 "EntityName" colon "NameServer" crlf
 "NameServer" colon servername crlf
 dot crlf
check-domain-response = response

 dot crlf
check-nameserver-response = available-check-nameserver-response /
                            notavailable-check-nameserver-response
available-check-nameserver-response = response
 dot crlf
notavailable-check-nameserver-response = response
 1*("IPAddress" colon ip-address crlf)
 dot crlf

; DEL command.
del-request = del-domain-request / del-nameserver-request
del-response = response
 dot crlf
del-domain-request = "del" crlf
 "EntityName" colon "Domain" crlf
 "DomainName" colon sldn crlf
 dot crlf
del-nameserver-request = "del" crlf
 "EntityName" colon "NameServer" crlf
 "NameServer" colon servername crlf
 dot crlf

; DESCRIBE command.
describe-request = "describe" crlf
 [target-option]
 *(option-tag colon option-value crlf)
 dot crlf
describe-response = response
 "Protocol" colon version-number crlf
 *attribute-line
 dot crlf
target-option = dash "Target" colon "Protocol" crlf

; MOD command.
mod-request = mod-domain-request / mod-nameserver-request
mod-response = response
 *attribute-line
 dot crlf
mod-domain-request = "mod" crlf
 "EntityName" colon "Domain" crlf
 "DomainName" colon sldn crlf
 *(add-attribute-value-line /
 remove-attribute-value-line /
 replace-attribute-value-line)
 dot crlf
mod-nameserver-request = "mod" crlf
 "EntityName" colon "NameServer" crlf
 "NameServer" colon servername crlf
 ["NewNameServer" colon attribute-value crlf]
 *(add-attribute-value-line /
 remove-attribute-value-line /
 replace-attribute-value-line)
 dot crlf
add-attribute-value-line =
 attribute-name colon new-attribute-value
remove-attribute-value-line =
 attribute-name colon old-attribute-value "="
replace-attribute-value-line =
 attribute-name colon old-attribute-value "="
 new-attribute-value
old-attribute-value = attribute-value
new-attribute-value = attribute-value

; QUIT command.
quit-request = "quit" crlf
 dot crlf
quit-response = response
 dot crlf

; RENEW command.
renew-request = "renew" crlf
 "EntityName" colon "Domain" crlf
 "DomainName" colon sldn crlf
 [renew-period-option]
 dot crlf
expiration-year-option = dash "CurrentExpirationYear" colon year crlf
renew-period-option = period-option expiration-year-option /
                      expiration-year-option period-option
renew-response = response
 "RegistrationExpirationDate" colon time-stamp crlf
 dot crlf

; SESSION command.
session-request = "session" crlf
 registrar-id-option
 registrar-password-option
 [registrar-newpassword-option]
 dot crlf
session-response = response
 dot crlf
registrar-id-option = dash "Id" colon option-value crlf
registrar-password-option =

 dash "Password" colon password crlf
registrar-newpassword-option =
 dash "NewPassword" colon password crlf

; STATUS command.
status-request = status-domain-request /
                 status-nameserver-request
status-response = response
 *attribute-line
 dot crlf
status-domain-request = "status" crlf
 "EntityName" colon "Domain" crlf
 "DomainName" colon sldn crlf
 dot crlf
status-nameserver-request = "status" crlf
 "EntityName" colon "NameServer" crlf
 "NameServer" colon servername crlf
 dot crlf

; TRANSFER command.
transfer-request = "transfer" crlf
 [approve-option]
 "EntityName" colon "Domain" crlf
 "DomainName" colon sldn crlf
 dot crlf
transfer-response = response
 "RegistrationExpirationDate" colon time-stamp crlf
 dot crlf
approve-option = dash "Approve" colon yesno crlf

; End of grammar.

8. Internationalization 🌈

RRP is all about 7-bit US-ASCII characters, bestie. Other character sets and character codes are not currently supported. 🫢

9. Known Issues ✨

okay so this section is the honest "things we didn't get to yet" list πŸ™ˆ RRP was never built for bulk data queries πŸ“¦ the original designers wanted something fast and lightweight that didn't need database queries that take a "long" time or spit out a "large" amount of data. so if you're a registrar who needs bulk data, you SHOULD consider building offline reporting features that fit your registry-registrar setup πŸ’…

this version of RRP still has a few limitations that showed up after months of real-world use with live domain name registrars. later versions (or their successors) should try to fix each of these πŸ’œ

The DESCRIBE command should return information describing System-defined default implementation values. πŸŽ€

Using the RENEW command without the "CurrentExpirationYear" and "Period" parameters doesn't give you idempotency 😭 So if a registrar retries a RENEW command because the network dropped, running it again without those parameters can succeed more than once. which is not the vibe if you only wanted one renewal πŸ’€

Time stamps returned by RRP don't include time zone identifiers, so they SHOULD be interpreted as local registry time. πŸ•°οΈ

RRP doesn't give registrars a way to find out about domain transfer requests and responses πŸ¦‹ so systems have to rely on stuff outside the protocol, like email and/or reports from the registry, to let registrars know what's happening.

RRP also doesn't let a registrar figure out all the domains served by a name server 🌐 systems need to provide that info some other way, like through periodic extracts from a System database.

No features for managing lame delegation of name servers either πŸ™ƒ any registrar may "use" name servers registered by another registrar. so when someone tries to delete a domain or name server, those name servers might still be attached to other live domains, which blocks immediate deletion. systems must rely on means outside the protocol to handle lame delegation.

The use of = within the MOD command to indicate a value to be removed is kinda confusing πŸ€” a more explicit way to show old and new attribute values in the protocol syntax could make this way more obvious.

The CHECK command also returns name server IP addresses when it confirms a name server is registered πŸ™ˆ that extra info might be useful, but it doesn't match the command's limited job. the command should return a positive or negative response and nothing more.

The formal protocol syntax in this document requires a specific order for the elements of a command entity block and command options 😬 the NSI Registry's server-side version is more flexible and lets you specify options and entity block elements in any order. client-side implementers are strongly urged to follow the order of command elements as specified here, so you stay compliant if the stricter form gets enforced later 🫢

RRP doesn't return time stamps or transaction identifiers to track transactions πŸ“­ the NSI Registry gives registrars daily and weekly reports with time stamps in local registry time, which is how they document and sync data on a per-registrar basis πŸ“Š


10. Security Considerations πŸ”

okay this one's serious, bestie 😀 misusing the Registry Registrar Protocol can cause catastrophic operational consequences for registrants, registrars, and registries πŸ’€ so all registrars must be authenticated before they interact with the registry at all πŸ”’ and all data exchanged between the registrar and the registry must be protected so nothing gets disclosed by accident πŸ›‘οΈ


11. IANA Considerations 🌸

IANA assigned TCP port 648 for RRP use in November 1998 πŸŽ€ no other action is required of IANA to support the protocol πŸ’…

IANA has reserved certain IPv4 address ranges, as described in [ALLOCATION] πŸ—ΊοΈ implementers MUST ensure that name server IP addresses don't fall into any of those reserved ranges, or you'll run into operational DNS errors 😭 not it πŸ™…β€β™€οΈ


12. References πŸ“š

  • [ABNF] Crocker, D. (Editor) and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", RFC 2234, November 1997. 🧩
  • [ALLOCATION] Hubbard, K., Kosters, M., Conrad, D., Karrenberg, D. and J. Postel, "Internet Registry IP Allocation Guidelines", BCP 12, RFC 2050, November 1996. πŸ—ΊοΈ
  • [MUSTSHOULD] Bradner, S., "Key Words for Use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997. πŸ”‘
  • [SSL] A. Frier, P. Karlton, and P. Kocher, "The SSL 3.0 Protocol", Netscape Communications Corp., November 18, 1996. πŸ”
  • [TLS] Dierks T. and C. Allen, "The TLS Protocol Version 1.0", RFC 2246, January 1999. πŸ”’

13. Acknowledgments πŸ’–

so many people helped with this document and the protocol it describes 🫢 Brad McMillen and Neeran Saraf deserve a special shoutout as co-authors of an earlier internal protocol specification πŸ‘‘ other content contributors to that earlier internal spec were Aristotle Balogh, Chris Bason, Mark Kosters, Jasdip Singh, and Yibing Wu 🌟 and significant contributors to reviewing this document were Steve Mahlstedt and Chris Smith ✨


14. Authors' Addresses πŸ’Œ

Scott Hollenbeck
Network Solutions, Inc. Registry
505 Huntmar Park Dr.
Herndon, VA 20170
USA

EMail: shollenb@netsol.com


Manoj Srivastava
Network Solutions, Inc. Registry
505 Huntmar Park Dr.
Herndon, VA 20170
USA

EMail: manojs@netsol.com

Copyright (C) The Internet Society (2000). All Rights Reserved. πŸ’œ

this document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or help with its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, as long as the above copyright notice and this paragraph are included on all such copies and derivative works πŸ“„ however, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations πŸ™…β€β™€οΈ the exception is for developing Internet standards, where the procedures for copyrights defined in the Internet Standards process must be followed, or for translating it into languages other than English 🌍

the limited permissions above are perpetual and will not be revoked by the Internet Society or its successors or assigns ♾️

this document and the information in it is provided on an "AS IS" basis, and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE 🫠


Acknowledgement πŸŽ€

funding for the RFC Editor function is currently provided by the Internet Society πŸ’•

πŸ“¦ where this page comes from