<?xml version="1.0"?>
<!DOCTYPE rfc SYSTEM "rfcXXXX.dtd">
<?rfc toc="yes"?>

<rfc ipr="full2026" docName="draft-baudis-irc-capab-00e">
 <front>

  <title>IRC protocol and capabilities selection</title>

  <author initials="P." surname="Baudis" fullname="Petr Baudis">
   <organization />
   <address>
    <postal>
     <street>Masarykovo nam. 4</street>
     <city>Jihlava</city> <code>58601</code>
     <country>CZ</country>
    </postal>
    <phone>+420 776 584 544</phone>
    <email>pasky@ji.cz</email>
    <uri>http://pasky.ji.cz/</uri>
   </address>
  </author>

  <author initials="A." surname="Wiebe" fullname="Aaron Wiebe">
   <organization />
   <address>
    <postal>
     <street>90 A Victoria St. N</street>
     <city>New Hamburg</city> <region>Ontario</region> <code>N0B 2G0</code>
     <country>CA</country>
    </postal>
    <phone>+519 662 9432</phone>
    <email>epiphani@powertrip.net</email>
   </address>
  </author>

  <date month="September" year="2002" />

  <area>Applications</area>
  <keyword>IRC</keyword>
  <keyword>Internet Relay Chat</keyword>
  <keyword>CAPAB</keyword>
  <keyword>Capabilities</keyword>
  <keyword>PROTOCOL</keyword>
  <keyword>Communication</keyword>

  <abstract>

   <t>This memo presents a way for communication servers and clients to
negotiate used protocol and a way to negotiate optional features of IRC/2
protocol further used for their communication.</t>

  </abstract>

 </front>


 <middle>

  <section title="Introduction">

   <section title="Motivation">

    <t>Due to the nature of IRC development in the past decade, with most
organizations expanding and altering protocol specifications at will, the
protocol for communication between IRC client and server contains a lot of
slight differences and special unique features depending on the particular
server used. This memo aims to standarize way of announcing such optional IRC/2
protocol capabilities to clients and way of requesting such features by
clients.</t>

    <t>Due to existence of various concurrent protocols aside of IRC and
because some IRC clients can support those protocols as well, this memo also
covers negotiation of the protocol used for communication with the server.</t>

   </section>

   <section title="Terminology">

    <list style="hanging">

     <t hangText="original IRC protocol:">The original IRC protocol as
described in <xref target="RFC1459">RFC 1459</xref>.</t>

     <t hangText="IRC/2 protocol:">The original IRC protocol with support for
commands described in this document; not neccessarily with support for any
particular capabilities.</t>

     <t hangText="protocol negotiation:">The negotiation of protocol being
used during the communication.</t>

     <t hangText="IRC/2 protocol capabilities negotiation:">The negotiation of
extensions to the IRC/2 protocol.</t>

    </list>

   </section>

   <section title="Impacts to the server-server protocols">

    <t>Servers, when interconnected, have the ability to use various different
protocol specifications, usually unique to the IRC server type. Standarizing
compatible server-server communication inside of one IRC network is matter of
the IRC network administration and it does not influence users. Thus,
server-server protocol is not the subject of this specification.</t>

   </section>

   <section title="Current Problems">

    <section title="Bandwidth">

     <t>Due to the explosive growth of IRC, many networks are experiencing
serious problems with raw bandwidth usage of client servers. While
optimizations have been made to the server to server protocol to reduce
bandwidth usage, client side connections still make up the bulk of bandwidth
usage.</t>

     <t>Due to the expanded format of <xref target="RFC1459">RFC 1459</xref>,
there is a substantially large number of ways to address this problem without
rewriting the protocol entirely.</t>

    </section>

    <section title="Compatibility">

     <t>There is a press inside of the IRC developers community to introduce
non-standard changes to the protocol, which could violate the original IRC
specification (<xref target="RFC1459">RFC 1459</xref>) and introduce some
incompatibilities to the client-server communication, resulting in problems
with some clients. Using this specification, client could select only those of
these changes, which it could understand. The clients supporting IRC/2 protocol
SHOULD still be backwards compatible to the original RFC 1459 protocol (IRC/2
without any protocol capabilities is equivalent to it, except the support for
CAPAB command and PROTOCOL command).</t>

    </section>

   </section>

   <section title="Goals">

   <t>The primary goals of the protocol negotiation and IRC/2 protocol
capabilities negotiation are as follows:

    <list style="symbols">

     <t>Flexible expandible format that allows alternative protocol negotiation
systems to be put into place for further altering of the protocol.</t>

     <t>Fully transparent backwards compatibility on the both client and server
side, due to the vast number of clients which will not be compliant for many
years.</t>

    </list></t>

   </section>

  </section>

  <section title="Protocol Negotiation">

   <t>The client can select particular protocol to be used during communication
with the server. This protocol doesn't neccessarily have to be IRC/2, it can be
for example SILC, IRC/3 (whatever that will be) etc.</t>

   <t>The protocol negotiation happens immediatelly after establishing of the
connection. It is initiated by the client, who sends the list of protocol it
wishes to use. The server chooses the one it supports (if the server supports
multiple protocols, it SHOULD select the first one asked by client, reading the
client's message from left to right) and acknowledges it. The further
communication depends on the protocol chosen; we describe the further
communication for the IRC/2 protocol <xref target="irc2">below</xref> in
this document.</t>

   <section title="Protocol message">

    <figure>

     <preamble>The protocol negotiation happens through the PROTOCOL command.
The <xref target="RFC2234">ABNF</xref> representation for this message
is:</preamble>

     <artwork><![CDATA[
<message>  =  "PROTOCOL" *( 1*<SP> <token> ) <CRLF>
<token>    =  <protocol> "/" <number> *( '.' <number> )
<protocol> =  1*<letter>

<letter>   =  <ALPHA> / <DIGIT> / "_" / "-"
<number>   =  1*<DIGIT>
]]></artwork>

    </figure>

    <t>Each token specifies protocol name and version (major and optionally
minor). The PROTOCOL message sent by client MUST contain at least one token,
while the PROTOCOL message sent by server MUST contain at least zero and at
most one token. If the server's PROTOCOL message doesn't include any protocol
token, the server does not support any protocol listed by client and the client
MUST either resend the PROTOCOL message with different set of tokens or close
the connection.</t>

    <t>The concrete protocol names (and possible versions) will be defined in
further documents published by <xref target="community">the IRC development
community</xref>. This document specifies only one protocol named "IRC" and
<xref target="irc2">describes</xref> its version 2 (this version has no minor
subversioning).</t>

   </section>

   <section title="Compatibility">

    <t>Note that the following section matters only to clients which want to
possibly talk by the original IRC protocol. Clients supporting the IRC/2
protocol SHOULD be able to talk so.</t>

    <t>In order to preserve the backwards compatibility with the original IRC
protocol, the client SHOULD send the PROTOCOL message and then try to register
using the original IRC protocol. If the server doesn't support PROTOCOL, it
will reply with the 001 message, otherwise it will reply with the PROTOCOL and
in case of IRC/2 protocol, it will postpone finishing of the registration as
described <xref target="register">below</xref>.</t>

   </section>

  </section>

  <section title="The IRC/2 Protocol" anchor="irc2">

   <t>The IRC/2 protocol is superset of the original IRC protocol - it
additionally contains the support for PROTOCOL, CAPAB and REGISTER
messages and the registration process is slightly changed.</t>

   <section title="Capab message">

    <figure>

     <preamble>Protocol negotiation happens through the CAPAB (short for
CAPABilities) command. The <xref target="RFC2234">ABNF</xref> representation
for this message is:</preamble>

     <artwork><![CDATA[
<message> =  "CAPAB" 1*<SP> <type> [ 1*<SP> ":" <token> ] <CRLF>
<type>    =  "LS" / "LSEND" / "RQ" / "ACK" / "NAK"
<token>   =  [ "-" ] <name> [ "=" <value> ] [ 1*<SP> <token> ]
<name>    =  <letterS> 2*19<letter>
<value>   =  1*<letter>

<letterS> =  <ALPHA> / <DIGIT> / "_"
<letter>  =  <ALPHA> / <DIGIT> / "_" / "-"
]]></artwork>

     <postamble>Note that value obviously MUST NOT contain any whitespace
characters.</postamble>

    </figure>

    <t>The CAPAB command can be issued at any time by client, even during the
client registration. Server MUST NOT send request CAPAB messages, only the
informational ones.</t>

    <section title="CAPAB LS">

     <t>This message is used to request or announce the list of supported
capabilities. Only the client sends the capabilities list request and only the
server sends the list of them now. The list can take multiple CAPAB LS
messages, if it would exceed the 512 characters limit; see also CAPAB
ENDLS.</t>

     <t>Note that the capabilities list can vary depending on the capabilities
already selected by client, so the new capabilities list SHOULD be re-retrieved
by client each time the client will turn on some capabilities successfully.</t>

    </section>

    <section title="CAPAB ENDLS">

     <t>Each chain of CAPAB LS MUST be terminated by a CAPAB ENDLS message,
indicating that no more CAPAB LS messages will come, as the one list can take
more than one CAPAB LS message. Note that this message MUST be sent even if
only one message is going to take the whole list. The syntax of the CAPAB ENDLS
message is same as the syntax of CAPAB LS message.</t>

    </section>

    <section title="CAPAB RQ">

     <t>This message is used by client exclusively to turn on certain IRC/2
protocol capabilities. The client sends <xref target="captokens">a list of
capability tokens</xref>. The server replies with either CAPAB ACK or CAPAB
NAK. Note that if already set tokens are included in the list, the capability
value is possibly updated (no value means that the old value is kept and the
token is silently ignored).</t>

    </section>

    <section title="CAPAB ACK">

     <t>This message is used by server to acknowledge the CAPAB RQ command
previously issued by client. It contains <xref target="captokens">a list of
capability tokens</xref> acknowledged by the server (same or subset of the list
of capability tokens in client's CAPAB RQ). The server starts sending of the
messages using the new capability tokens immediatelly after sending the
&lt;crlf&gt; terminating this CAPAB ACK message. The client has to respond to
this message by another CAPAB ACK message which MUST contain the same list of
capability tokens; then, it MUST start using those capabilites immediatelly
after sending the &lt;crlf&gt; terminating this CAPAB ACK message.</t>

    </section>

    <section title="CAPAB NAK">

     <t>This message is used by server to indicate some problem with the list
client sent along the CAPAB RQ command. It means that none of these
capabilities become effective, and no changes in the active capabilities list
are not made by the server. The server SHOULD send the list of capabilities
with unknown name (or conflicting with another capability being set already) or
inappropriate value along this message, with same restrictions of their list as
in CAPAB LS, unless the server couldn't properly parse the list received from
client.</t>

    </section>

    <section title="Capability Tokens" anchor="captokens">

     <t>These tokens are formed by optional prefix, capability name and
optional capability value, as described in the ABNF above. The name length MUST
NOT exceed 20 characters nor be shorter than 3 characters.  It SHOULD be chosen
as short as possible, while staying meaningful.</t>

     <t>Only one prefix is defined now - a dash ('-'). If it is specified, it
means that the capability MUST be reset to the default value (and the "boolean"
capability MUST be turned off, as all boolean capabilities are off by default).
Note that it may not be possible to turn off some capabilities (probably for
example TLS) once they are turned on.</t>

     <t>Note that some capabilities may not be available all the time, but
could be offered by the server only when some other capability(ies) is (are)
already turned on. So, the capabilities can be theoretically formed in a
virtual tree.</t>

     <t>The list of tokens is limited only by the 512 characters maximal IRC
message length (thus, the effective length is 512 without the length of the
message preceding it (ie. 500 characters for "CAPAB LS :...\r\n")). The usual
15 parameters limit for IRC message does not apply, as the whole capabilities
list is prefixed by a ':', thus should be recognized as a single string by the
current IRC message parsers.</t>

     <t>The concrete tokens (names and possibly value types) will be defined in
further documents published by <xref target="community">the IRC development
community</xref>.</t>

    </section>

   </section>

   <section title="Register message">

    <figure>

     <preamble>This command is used by client to indicate that it consider its
part of the registration done and excepts 001 from the server. The ABNF
representation for this message is:</preamble>

     <artwork><![CDATA[
<message> =  "REGISTER" <CRLF>
]]></artwork>

    </figure>

   </section>

   <section title="The Registration Process" anchor="register">

    <t>The registration process is slightly different from the original IRC
protocol. The client could use USER and NICK commands as many times as it
wants, while the new invocation overrides settings of the previous ones. This
is important because USER and NICK possibly sent before PROTOCOL acknowledge
from server count to the registration process as well, but the client may want
to re-issue those commands with some of the capabilities turned on.</t>

    <t>After acknowledging the IRC/2 protocol, server MUST send the list of
supported capabilities, properly terminated by CAPAB LSEND (if server wants to
send anything else at the startup of IRC/2 protocol, it MUST send it before the
capabilities list). Then, the client can negotiate the capabilities and
possibly re-send the USER, NICK or PASS commands. The registration process is
finished when the client sends the REGISTER command.</t>

   </section>

   <section title="Examples">

    <figure>

     <preamble>The basic example of the complete negotiation with the conforming
server:</preamble>

     <artwork><![CDATA[
CLIENT> PROTOCOL :IRC/2
CLIENT> USER foo - - :text
CLIENT> NICK bar
SERVER> PROTOCOL :IRC/2
SERVER> CAPAB LS :cap1 cap2 cap3 cap4
SERVER> CAPAB LSEND :cap5 cap6
CLIENT> CAPAB ON :cap2 cap3=11,cap7
SERVER> CAPAB NAK
CLIENT> CAPAB ON :cap2 cap3=11 cap7
SERVER> CAPAB NAK :cap7
CLIENT> CAPAB ON :cap2 cap3=11
SERVER> CAPAB ACK :cap2 cap3=11
CLIENT> CAPAB ACK :cap2 cap3=11
CLIENT> CAPAB LS
SERVER> CAPAB LSEND :cap1 cap2 xcap1 xcap2 xcap3
CLIENT> REGISTER
SERVER> :irc.xy.com 001 bar :Welcome
]]></artwork>

    </figure>

    <figure>

     <preamble>The basic example of the complete negotiation with an old
server:</preamble>

     <artwork><![CDATA[
CLIENT> PROTOCOL :IRC/2
CLIENT> USER foo - - :test
CLIENT> NICK bar
SERVER> :irc.xy.com 001 bar :Welcome
]]></artwork>

    </figure>

   </section>

  </section>

  <section title="Further Documents" anchor="community">

   <t>The secondary purpose of this document is to provide a framework for
definition of protocol enhancements. Documents will be published as Internet
Drafts and possibly RFCs, after a careful review by the IRC development
community. The actual list of PROTOCOL and CAPAB tokens will be published by
Internet Assigned Numers Authority (IANA). </t>

   <t>The IRC development community, as used in this document, is defined as
the authors of prominent software in use. Currently, this consists of
- but is not limited to - the development teams for the major IRC networks
  (including DALnet, EFnet, IRCnet and Undernet), as well as the development
teams for the client packages - currently irssi, BitchX, EPIC, IRCle, and mIRC.
These people (as now) are listed <xref target="ircpeople">below</xref>.</t>

   <section title="Requirements">

    <t>All further specifications MUST be reviewed by the development
community. In order for this review to take place, the author MUST contact the
protocol discussion email list. The current list address is proto-desc@dal.net.
The administrative contact for this list is epiphani@dal.net.</t>

   </section>

  </section>

  <section title="Security Considerations" anchor="security">

   <t>In order to prevent possible man-in-the-middle attacks, any
security-related capabilities SHOULD be issued as soon as possible, preferrably
already during the client registration. This involves for example TLS
setup.</t>

  </section>

 </middle>


 <back>

  <section title="TODO">

   <list style="numbers">

    <t>There SHOULD be set some alias for the administrative contact for the
proto-desc mailing list; RFCs are hard to update. --cras</t>

    <t>There should be some standart long-term URL where all CAPABs would be
listed; RFC for each (set of) capab(s) is nonsense ;-).</t>

   </list>

  </section>

  <references>

   <reference anchor="RFC1459">
    <front>
     <title>Internet Relay Chat Protocol</title>
     <author initials="J." surname="Oikarinen" fullname="Jarkko Oikarinen">
      <address>
       <postal>
	<street>Tuirantie 17 as 9</street>
	<city>Oulu</city> <code>90500</code>
	<country>FI</country>
       </postal>
       <email>jto@tolsun.oulu.fi</email>
      </address>
     </author>
     <author initials="D." surname="Reed" fullname="Darren Reed">
      <address>
       <postal>
	<street>4 Pateman Street</street>
	<city>Watsonia</city> <region>Victoria</region> <code>3087</code>
	<country>AU</country>
       </postal>
       <email>avalon@coombs.anu.edu.au</email>
      </address>
     </author>
     <date month="May" year="1993" />
    </front>
    <seriesInfo name="RFC" value="1459" />
   </reference>

   <reference anchor="RFC2234">
    <front>
     <title>ABNF for Syntax Specifications</title>
     <author initials="D." surname="Crocker" fullname="David H. Crocker">
      <address>
       <email>dcrocker@imc.org</email>
      </address>
     </author>
     <author initials="P." surname="Overell" fullname="Paul Overell">
      <address>
       <email>paulo@turnpike.com</email>
      </address>
     </author>
     <date month="November" year="1997" />
    </front>
    <seriesInfo name="RFC" value="2234" />
   </reference>

  </references>

  <section title="Acknowledgements" anchor="ircpeople">

   <t>The authors especially gratefully acknowledge the contributions of: Lee
Hardy, Timo Sirainen, Kurt Roecx, Simon Butcher, Piotr Kucharski, Jakub Vlasek
and others.</t>

   <t>The following people are part of the proto-desc@dal.net protocol
discussion list. They have provided support, input and critism to this
document.</t>

   <list style="symbols">
    <t>... Name, Email address, Affiliation ...</t>
    <t>... Name, Email address, Affiliation ...</t>
    <t>... Name, Email address, Affiliation ...</t>
   </list>

  </section>
 </back>
</rfc>
