mirror of
git://git.acid.vegas/archive.git
synced 2024-11-25 01:26:40 +00:00
1460 lines
55 KiB
Plaintext
1460 lines
55 KiB
Plaintext
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Network Working Group C. Kalt
|
|||
|
Request for Comments: 2813 April 2000
|
|||
|
Updates: 1459
|
|||
|
Category: Informational
|
|||
|
|
|||
|
|
|||
|
Internet Relay Chat: Server Protocol
|
|||
|
|
|||
|
Status of this Memo
|
|||
|
|
|||
|
This memo provides information for the Internet community. It does
|
|||
|
not specify an Internet standard of any kind. Distribution of this
|
|||
|
memo is unlimited.
|
|||
|
|
|||
|
Copyright Notice
|
|||
|
|
|||
|
Copyright (C) The Internet Society (2000). All Rights Reserved.
|
|||
|
|
|||
|
Abstract
|
|||
|
|
|||
|
While based on the client-server model, the IRC (Internet Relay Chat)
|
|||
|
protocol allows servers to connect to each other effectively forming
|
|||
|
a network.
|
|||
|
|
|||
|
This document defines the protocol used by servers to talk to each
|
|||
|
other. It was originally a superset of the client protocol but has
|
|||
|
evolved differently.
|
|||
|
|
|||
|
First formally documented in May 1993 as part of RFC 1459 [IRC], most
|
|||
|
of the changes brought since then can be found in this document as
|
|||
|
development was focused on making the protocol scale better. Better
|
|||
|
scalability has allowed existing world-wide networks to keep growing
|
|||
|
and reach sizes which defy the old specification.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 1]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
Table of Contents
|
|||
|
|
|||
|
1. Introduction ............................................... 3
|
|||
|
2. Global database ............................................ 3
|
|||
|
2.1 Servers ................................................ 3
|
|||
|
2.2 Clients ................................................ 4
|
|||
|
2.2.1 Users ............................................. 4
|
|||
|
2.2.2 Services .......................................... 4
|
|||
|
2.3 Channels ............................................... 4
|
|||
|
3. The IRC Server Specification ............................... 5
|
|||
|
3.1 Overview ............................................... 5
|
|||
|
3.2 Character codes ........................................ 5
|
|||
|
3.3 Messages ............................................... 5
|
|||
|
3.3.1 Message format in Augmented BNF ................... 6
|
|||
|
3.4 Numeric replies ........................................ 7
|
|||
|
4. Message Details ............................................ 7
|
|||
|
4.1 Connection Registration ................................ 8
|
|||
|
4.1.1 Password message .................................. 8
|
|||
|
4.1.2 Server message .................................... 9
|
|||
|
4.1.3 Nick .............................................. 10
|
|||
|
4.1.4 Service message ................................... 11
|
|||
|
4.1.5 Quit .............................................. 12
|
|||
|
4.1.6 Server quit message ............................... 13
|
|||
|
4.2 Channel operations ..................................... 14
|
|||
|
4.2.1 Join message ...................................... 14
|
|||
|
4.2.2 Njoin message ..................................... 15
|
|||
|
4.2.3 Mode message ...................................... 16
|
|||
|
5. Implementation details .................................... 16
|
|||
|
5.1 Connection 'Liveness' .................................. 16
|
|||
|
5.2 Accepting a client to server connection ................ 16
|
|||
|
5.2.1 Users ............................................. 16
|
|||
|
5.2.2 Services .......................................... 17
|
|||
|
5.3 Establishing a server-server connection. ............... 17
|
|||
|
5.3.1 Link options ...................................... 17
|
|||
|
5.3.1.1 Compressed server to server links ............ 18
|
|||
|
5.3.1.2 Anti abuse protections ....................... 18
|
|||
|
5.3.2 State information exchange when connecting ........ 18
|
|||
|
5.4 Terminating server-client connections .................. 19
|
|||
|
5.5 Terminating server-server connections .................. 19
|
|||
|
5.6 Tracking nickname changes .............................. 19
|
|||
|
5.7 Tracking recently used nicknames ....................... 20
|
|||
|
5.8 Flood control of clients ............................... 20
|
|||
|
5.9 Non-blocking lookups ................................... 21
|
|||
|
5.9.1 Hostname (DNS) lookups ............................ 21
|
|||
|
5.9.2 Username (Ident) lookups .......................... 21
|
|||
|
6. Current problems ........................................... 21
|
|||
|
6.1 Scalability ............................................ 21
|
|||
|
6.2 Labels ................................................. 22
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 2]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
6.2.1 Nicknames ......................................... 22
|
|||
|
6.2.2 Channels .......................................... 22
|
|||
|
6.2.3 Servers ........................................... 22
|
|||
|
6.3 Algorithms ............................................. 22
|
|||
|
7. Security Considerations .................................... 23
|
|||
|
7.1 Authentication ......................................... 23
|
|||
|
7.2 Integrity .............................................. 23
|
|||
|
8. Current support and availability ........................... 24
|
|||
|
9. Acknowledgements ........................................... 24
|
|||
|
10. References ................................................ 24
|
|||
|
11. Author's Address .......................................... 25
|
|||
|
12. Full Copyright Statement ................................... 26
|
|||
|
|
|||
|
1. Introduction
|
|||
|
|
|||
|
This document is intended for people working on implementing an IRC
|
|||
|
server but will also be useful to anyone implementing an IRC service.
|
|||
|
|
|||
|
Servers provide the three basic services required for realtime
|
|||
|
conferencing defined by the "Internet Relay Chat: Architecture"
|
|||
|
[IRC-ARCH]: client locator (via the client protocol [IRC-CLIENT]),
|
|||
|
message relaying (via the server protocol defined in this document)
|
|||
|
and channel hosting and management (following specific rules [IRC-
|
|||
|
CHAN]).
|
|||
|
|
|||
|
2. Global database
|
|||
|
|
|||
|
Although the IRC Protocol defines a fairly distributed model, each
|
|||
|
server maintains a "global state database" about the whole IRC
|
|||
|
network. This database is, in theory, identical on all servers.
|
|||
|
|
|||
|
2.1 Servers
|
|||
|
|
|||
|
Servers are uniquely identified by their name which has a maximum
|
|||
|
length of sixty three (63) characters. See the protocol grammar
|
|||
|
rules (section 3.3.1) for what may and may not be used in a server
|
|||
|
name.
|
|||
|
|
|||
|
Each server is typically known by all other servers, however it is
|
|||
|
possible to define a "hostmask" to group servers together according
|
|||
|
to their name. Inside the hostmasked area, all the servers have a
|
|||
|
name which matches the hostmask, and any other server with a name
|
|||
|
matching the hostmask SHALL NOT be connected to the IRC network
|
|||
|
outside the hostmasked area. Servers which are outside the area have
|
|||
|
no knowledge of the individual servers present inside the area,
|
|||
|
instead they are presented with a virtual server which has the
|
|||
|
hostmask for name.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 3]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
2.2 Clients
|
|||
|
|
|||
|
For each client, all servers MUST have the following information: a
|
|||
|
netwide unique identifier (whose format depends on the type of
|
|||
|
client) and the server to which the client is connected.
|
|||
|
|
|||
|
2.2.1 Users
|
|||
|
|
|||
|
Each user is distinguished from other users by a unique nickname
|
|||
|
having a maximum length of nine (9) characters. See the protocol
|
|||
|
grammar rules (section 3.3.1) for what may and may not be used in a
|
|||
|
nickname. In addition to the nickname, all servers MUST have the
|
|||
|
following information about all users: the name of the host that the
|
|||
|
user is running on, the username of the user on that host, and the
|
|||
|
server to which the client is connected.
|
|||
|
|
|||
|
2.2.2 Services
|
|||
|
|
|||
|
Each service is distinguished from other services by a service name
|
|||
|
composed of a nickname and a server name. The nickname has a maximum
|
|||
|
length of nine (9) characters. See the protocol grammar rules
|
|||
|
(section 3.3.1) for what may and may not be used in a nickname. The
|
|||
|
server name used to compose the service name is the name of the
|
|||
|
server to which the service is connected. In addition to this
|
|||
|
service name all servers MUST know the service type.
|
|||
|
|
|||
|
Services differ from users by the format of their identifier, but
|
|||
|
more importantly services and users don't have the same type of
|
|||
|
access to the server: services can request part or all of the global
|
|||
|
state information that a server maintains, but have a more restricted
|
|||
|
set of commands available to them (See "IRC Client Protocol" [IRC-
|
|||
|
CLIENT] for details on which) and are not allowed to join channels.
|
|||
|
Finally services are not usually subject to the "Flood control"
|
|||
|
mechanism described in section 5.8.
|
|||
|
|
|||
|
2.3 Channels
|
|||
|
|
|||
|
Alike services, channels have a scope [IRC-CHAN] and are not
|
|||
|
necessarily known to all servers. When a channel existence is known
|
|||
|
to a server, the server MUST keep track of the channel members, as
|
|||
|
well as the channel modes.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 4]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
3. The IRC Server Specification
|
|||
|
|
|||
|
3.1 Overview
|
|||
|
|
|||
|
The protocol as described herein is for use with server to server
|
|||
|
connections. For client to server connections, see the IRC Client
|
|||
|
Protocol specification.
|
|||
|
|
|||
|
There are, however, more restrictions on client connections (which
|
|||
|
are considered to be untrustworthy) than on server connections.
|
|||
|
|
|||
|
3.2 Character codes
|
|||
|
|
|||
|
No specific character set is specified. The protocol is based on a a
|
|||
|
set of codes which are composed of eight (8) bits, making up an
|
|||
|
octet. Each message may be composed of any number of these octets;
|
|||
|
however, some octet values are used for control codes which act as
|
|||
|
message delimiters.
|
|||
|
|
|||
|
Regardless of being an 8-bit protocol, the delimiters and keywords
|
|||
|
are such that protocol is mostly usable from US-ASCII terminal and a
|
|||
|
telnet connection.
|
|||
|
|
|||
|
Because of IRC's Scandinavian origin, the characters {}|^ are
|
|||
|
considered to be the lower case equivalents of the characters []\~,
|
|||
|
respectively. This is a critical issue when determining the
|
|||
|
equivalence of two nicknames, or channel names.
|
|||
|
|
|||
|
3.3 Messages
|
|||
|
|
|||
|
Servers and clients send each other messages which may or may not
|
|||
|
generate a reply. Most communication between servers do not generate
|
|||
|
any reply, as servers mostly perform routing tasks for the clients.
|
|||
|
|
|||
|
Each IRC message may consist of up to three main parts: the prefix
|
|||
|
(OPTIONAL), the command, and the command parameters (maximum of
|
|||
|
fifteen (15)). The prefix, command, and all parameters are separated
|
|||
|
by one ASCII space character (0x20) each.
|
|||
|
|
|||
|
The presence of a prefix is indicated with a single leading ASCII
|
|||
|
colon character (':', 0x3b), which MUST be the first character of the
|
|||
|
message itself. There MUST be NO gap (whitespace) between the colon
|
|||
|
and the prefix. The prefix is used by servers to indicate the true
|
|||
|
origin of the message. If the prefix is missing from the message, it
|
|||
|
is assumed to have originated from the connection from which it was
|
|||
|
received. Clients SHOULD not use a prefix when sending a message
|
|||
|
from themselves; if they use one, the only valid prefix is the
|
|||
|
registered nickname associated with the client.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 5]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
When a server receives a message, it MUST identify its source using
|
|||
|
the (eventually assumed) prefix. If the prefix cannot be found in
|
|||
|
the server's internal database, it MUST be discarded, and if the
|
|||
|
prefix indicates the message comes from an (unknown) server, the link
|
|||
|
from which the message was received MUST be dropped. Dropping a link
|
|||
|
in such circumstances is a little excessive but necessary to maintain
|
|||
|
the integrity of the network and to prevent future problems. Another
|
|||
|
common error condition is that the prefix found in the server's
|
|||
|
internal database identifies a different source (typically a source
|
|||
|
registered from a different link than from which the message
|
|||
|
arrived). If the message was received from a server link and the
|
|||
|
prefix identifies a client, a KILL message MUST be issued for the
|
|||
|
client and sent to all servers. In other cases, the link from which
|
|||
|
the message arrived SHOULD be dropped for clients, and MUST be
|
|||
|
dropped for servers. In all cases, the message MUST be discarded.
|
|||
|
|
|||
|
The command MUST either be a valid IRC command or a three (3) digit
|
|||
|
number represented in ASCII text.
|
|||
|
|
|||
|
IRC messages are always lines of characters terminated with a CR-LF
|
|||
|
(Carriage Return - Line Feed) pair, and these messages SHALL NOT
|
|||
|
exceed 512 characters in length, counting all characters including
|
|||
|
the trailing CR-LF. Thus, there are 510 characters maximum allowed
|
|||
|
for the command and its parameters. There is no provision for
|
|||
|
continuation message lines. See section 5 for more details about
|
|||
|
current implementations.
|
|||
|
|
|||
|
3.3.1 Message format in Augmented BNF
|
|||
|
|
|||
|
The protocol messages must be extracted from the contiguous stream of
|
|||
|
octets. The current solution is to designate two characters, CR and
|
|||
|
LF, as message separators. Empty messages are silently ignored,
|
|||
|
which permits use of the sequence CR-LF between messages without
|
|||
|
extra problems.
|
|||
|
|
|||
|
The extracted message is parsed into the components <prefix>,
|
|||
|
<command> and list of parameters (<params>).
|
|||
|
|
|||
|
The Augmented BNF representation for this is found in "IRC Client
|
|||
|
Protocol" [IRC-CLIENT].
|
|||
|
|
|||
|
The extended prefix (["!" user "@" host ]) MUST NOT be used in server
|
|||
|
to server communications and is only intended for server to client
|
|||
|
messages in order to provide clients with more useful information
|
|||
|
about who a message is from without the need for additional queries.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 6]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
3.4 Numeric replies
|
|||
|
|
|||
|
Most of the messages sent to the server generate a reply of some
|
|||
|
sort. The most common reply is the numeric reply, used for both
|
|||
|
errors and normal replies. The numeric reply MUST be sent as one
|
|||
|
message consisting of the sender prefix, the three digit numeric, and
|
|||
|
the target of the reply. A numeric reply is not allowed to originate
|
|||
|
from a client; any such messages received by a server are silently
|
|||
|
dropped. In all other respects, a numeric reply is just like a normal
|
|||
|
message, except that the keyword is made up of 3 numeric digits
|
|||
|
rather than a string of letters. A list of different replies is
|
|||
|
supplied in "IRC Client Protocol" [IRC-CLIENT].
|
|||
|
|
|||
|
4. Message Details
|
|||
|
|
|||
|
All the messages recognized by the IRC server and client are
|
|||
|
described in the IRC Client Protocol specification.
|
|||
|
|
|||
|
Where the reply ERR_NOSUCHSERVER is returned, it means that the
|
|||
|
target of the message could not be found. The server MUST NOT send
|
|||
|
any other replies after this error for that command.
|
|||
|
|
|||
|
The server to which a client is connected is required to parse the
|
|||
|
complete message, returning any appropriate errors. If the server
|
|||
|
encounters a fatal error while parsing a message, an error MUST be
|
|||
|
sent back to the client and the parsing terminated. A fatal error
|
|||
|
may follow from incorrect command, a destination which is otherwise
|
|||
|
unknown to the server (server, client or channel names fit this
|
|||
|
category), not enough parameters or incorrect privileges.
|
|||
|
|
|||
|
If a full set of parameters is presented, then each MUST be checked
|
|||
|
for validity and appropriate responses sent back to the client. In
|
|||
|
the case of messages which use parameter lists using the comma as an
|
|||
|
item separator, a reply MUST be sent for each item.
|
|||
|
|
|||
|
In the examples below, some messages appear using the full format:
|
|||
|
|
|||
|
:Name COMMAND parameter list
|
|||
|
|
|||
|
Such examples represent a message from "Name" in transit between
|
|||
|
servers, where it is essential to include the name of the original
|
|||
|
sender of the message so remote servers may send back a reply along
|
|||
|
the correct path.
|
|||
|
|
|||
|
The message details for client to server communication are described
|
|||
|
in the "IRC Client Protocol" [IRC-CLIENT]. Some sections in the
|
|||
|
following pages apply to some of these messages, they are additions
|
|||
|
to the message specifications which are only relevant to server to
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 7]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
server communication, or to the server implementation. The messages
|
|||
|
which are introduced here are only used for server to server
|
|||
|
communication.
|
|||
|
|
|||
|
4.1 Connection Registration
|
|||
|
|
|||
|
The commands described here are used to register a connection with
|
|||
|
another IRC server.
|
|||
|
|
|||
|
4.1.1 Password message
|
|||
|
|
|||
|
Command: PASS
|
|||
|
Parameters: <password> <version> <flags> [<options>]
|
|||
|
|
|||
|
The PASS command is used to set a 'connection password'. The
|
|||
|
password MUST be set before any attempt to register the connection is
|
|||
|
made. Currently this means that servers MUST send a PASS command
|
|||
|
before any SERVER command. Only one (1) PASS command SHALL be
|
|||
|
accepted from a connection.
|
|||
|
|
|||
|
The last three (3) parameters MUST be ignored if received from a
|
|||
|
client (e.g. a user or a service). They are only relevant when
|
|||
|
received from a server.
|
|||
|
|
|||
|
The <version> parameter is a string of at least four (4) characters,
|
|||
|
and up to fourteen (14) characters. The first four (4) characters
|
|||
|
MUST be digits and indicate the protocol version known by the server
|
|||
|
issuing the message. The protocol described by this document is
|
|||
|
version 2.10 which is encoded as "0210". The remaining OPTIONAL
|
|||
|
characters are implementation dependent and should describe the
|
|||
|
software version number.
|
|||
|
|
|||
|
The <flags> parameter is a string of up to one hundred (100)
|
|||
|
characters. It is composed of two substrings separated by the
|
|||
|
character "|" (%x7C). If present, the first substring MUST be the
|
|||
|
name of the implementation. The reference implementation (See
|
|||
|
Section 8, "Current support and availability") uses the string "IRC".
|
|||
|
If a different implementation is written, which needs an identifier,
|
|||
|
then that identifier should be registered through publication of an
|
|||
|
RFC. The second substring is implementation dependent. Both
|
|||
|
substrings are OPTIONAL, but the character "|" is REQUIRED. The
|
|||
|
character "|" MUST NOT appear in either substring.
|
|||
|
|
|||
|
Finally, the last parameter, <options>, is used for link options.
|
|||
|
The only options defined by the protocol are link compression (using
|
|||
|
the character "Z"), and an abuse protection flag (using the character
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 8]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
"P"). See sections 5.3.1.1 (Compressed server to server links) and
|
|||
|
5.3.1.2 (Anti abuse protections) respectively for more information on
|
|||
|
these options.
|
|||
|
|
|||
|
Numeric Replies:
|
|||
|
|
|||
|
ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
PASS moresecretpassword 0210010000 IRC|aBgH$ Z
|
|||
|
|
|||
|
4.1.2 Server message
|
|||
|
|
|||
|
Command: SERVER
|
|||
|
Parameters: <servername> <hopcount> <token> <info>
|
|||
|
|
|||
|
The SERVER command is used to register a new server. A new connection
|
|||
|
introduces itself as a server to its peer. This message is also used
|
|||
|
to pass server data over whole net. When a new server is connected
|
|||
|
to net, information about it MUST be broadcasted to the whole
|
|||
|
network.
|
|||
|
|
|||
|
The <info> parameter may contain space characters.
|
|||
|
|
|||
|
<hopcount> is used to give all servers some internal information on
|
|||
|
how far away each server is. Local peers have a value of 0, and each
|
|||
|
passed server increments the value. With a full server list, it
|
|||
|
would be possible to construct a map of the entire server tree, but
|
|||
|
hostmasks prevent this from being done.
|
|||
|
|
|||
|
The <token> parameter is an unsigned number used by servers as an
|
|||
|
identifier. This identifier is subsequently used to reference a
|
|||
|
server in the NICK and SERVICE messages sent between servers. Server
|
|||
|
tokens only have a meaning for the point-to-point peering they are
|
|||
|
used and MUST be unique for that connection. They are not global.
|
|||
|
|
|||
|
The SERVER message MUST only be accepted from either (a) a connection
|
|||
|
which is yet to be registered and is attempting to register as a
|
|||
|
server, or (b) an existing connection to another server, in which
|
|||
|
case the SERVER message is introducing a new server behind that
|
|||
|
server.
|
|||
|
|
|||
|
Most errors that occur with the receipt of a SERVER command result in
|
|||
|
the connection being terminated by the destination host (target
|
|||
|
SERVER). Because of the severity of such event, error replies are
|
|||
|
usually sent using the "ERROR" command rather than a numeric.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 9]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
If a SERVER message is parsed and it attempts to introduce a server
|
|||
|
which is already known to the receiving server, the connection, from
|
|||
|
which that message arrived, MUST be closed (following the correct
|
|||
|
procedures), since a duplicate route to a server has been formed and
|
|||
|
the acyclic nature of the IRC tree breaks. In some conditions, the
|
|||
|
connection from which the already known server has registered MAY be
|
|||
|
closed instead. It should be noted that this kind of error can also
|
|||
|
be the result of a second running server, problem which cannot be
|
|||
|
fixed within the protocol and typically requires human intervention.
|
|||
|
This type of problem is particularly insidious, as it can quite
|
|||
|
easily result in part of the IRC network to be isolated, with one of
|
|||
|
the two servers connected to each partition therefore making it
|
|||
|
impossible for the two parts to unite.
|
|||
|
|
|||
|
Numeric Replies:
|
|||
|
|
|||
|
ERR_ALREADYREGISTRED
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
SERVER test.oulu.fi 1 1 :Experimental server ; New server
|
|||
|
test.oulu.fi introducing itself and
|
|||
|
attempting to register.
|
|||
|
|
|||
|
:tolsun.oulu.fi SERVER csd.bu.edu 5 34 :BU Central Server ; Server
|
|||
|
tolsun.oulu.fi is our uplink for
|
|||
|
csd.bu.edu which is 5 hops away. The
|
|||
|
token "34" will be used by
|
|||
|
tolsun.oulu.fi when introducing new
|
|||
|
users or services connected to
|
|||
|
csd.bu.edu.
|
|||
|
|
|||
|
4.1.3 Nick
|
|||
|
|
|||
|
Command: NICK
|
|||
|
Parameters: <nickname> <hopcount> <username> <host> <servertoken>
|
|||
|
<umode> <realname>
|
|||
|
|
|||
|
This form of the NICK message MUST NOT be allowed from user
|
|||
|
connections. However, it MUST be used instead of the NICK/USER pair
|
|||
|
to notify other servers of new users joining the IRC network.
|
|||
|
|
|||
|
This message is really the combination of three distinct messages:
|
|||
|
NICK, USER and MODE [IRC-CLIENT].
|
|||
|
|
|||
|
The <hopcount> parameter is used by servers to indicate how far away
|
|||
|
a user is from its home server. A local connection has a hopcount of
|
|||
|
0. The hopcount value is incremented by each passed server.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 10]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
The <servertoken> parameter replaces the <servername> parameter of
|
|||
|
the USER (See section 4.1.2 for more information on server tokens).
|
|||
|
|
|||
|
Examples:
|
|||
|
|
|||
|
NICK syrk 5 kalt millennium.stealth.net 34 +i :Christophe Kalt ; New
|
|||
|
user with nickname "syrk", username
|
|||
|
"kalt", connected from host
|
|||
|
"millennium.stealth.net" to server
|
|||
|
"34" ("csd.bu.edu" according to the
|
|||
|
previous example).
|
|||
|
|
|||
|
:krys NICK syrk ; The other form of the NICK message,
|
|||
|
as defined in "IRC Client Protocol"
|
|||
|
[IRC-CLIENT] and used between
|
|||
|
servers: krys changed his nickname to
|
|||
|
syrk
|
|||
|
|
|||
|
4.1.4 Service message
|
|||
|
|
|||
|
Command: SERVICE
|
|||
|
Parameters: <servicename> <servertoken> <distribution> <type>
|
|||
|
<hopcount> <info>
|
|||
|
|
|||
|
The SERVICE command is used to introduce a new service. This form of
|
|||
|
the SERVICE message SHOULD NOT be allowed from client (unregistered,
|
|||
|
or registered) connections. However, it MUST be used between servers
|
|||
|
to notify other servers of new services joining the IRC network.
|
|||
|
|
|||
|
The <servertoken> is used to identify the server to which the service
|
|||
|
is connected. (See section 4.1.2 for more information on server
|
|||
|
tokens).
|
|||
|
|
|||
|
The <hopcount> parameter is used by servers to indicate how far away
|
|||
|
a service is from its home server. A local connection has a hopcount
|
|||
|
of 0. The hopcount value is incremented by each passed server.
|
|||
|
|
|||
|
The <distribution> parameter is used to specify the visibility of a
|
|||
|
service. The service may only be known to servers which have a name
|
|||
|
matching the distribution. For a matching server to have knowledge
|
|||
|
of the service, the network path between that server and the server
|
|||
|
to which the service is connected MUST be composed of servers whose
|
|||
|
names all match the mask. Plain "*" is used when no restriction is
|
|||
|
wished.
|
|||
|
|
|||
|
The <type> parameter is currently reserved for future usage.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 11]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
Numeric Replies:
|
|||
|
|
|||
|
ERR_ALREADYREGISTRED ERR_NEEDMOREPARAMS
|
|||
|
ERR_ERRONEUSNICKNAME
|
|||
|
RPL_YOURESERVICE RPL_YOURHOST
|
|||
|
RPL_MYINFO
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
SERVICE dict@irc.fr 9 *.fr 0 1 :French Dictionary r" registered on
|
|||
|
server "9" is being announced to
|
|||
|
another server. This service will
|
|||
|
only be available on servers whose
|
|||
|
name matches "*.fr".
|
|||
|
|
|||
|
4.1.5 Quit
|
|||
|
|
|||
|
Command: QUIT
|
|||
|
Parameters: [<Quit Message>]
|
|||
|
|
|||
|
A client session ends with a quit message. The server MUST close the
|
|||
|
connection to a client which sends a QUIT message. If a "Quit
|
|||
|
Message" is given, this will be sent instead of the default message,
|
|||
|
the nickname or service name.
|
|||
|
|
|||
|
When "netsplit" (See Section 4.1.6) occur, the "Quit Message" is
|
|||
|
composed of the names of two servers involved, separated by a space.
|
|||
|
The first name is that of the server which is still connected and the
|
|||
|
second name is either that of the server which has become
|
|||
|
disconnected or that of the server to which the leaving client was
|
|||
|
connected:
|
|||
|
|
|||
|
<Quit Message> = ":" servername SPACE servername
|
|||
|
|
|||
|
Because the "Quit Message" has a special meaning for "netsplits",
|
|||
|
servers SHOULD NOT allow a client to use a <Quit Message> in the
|
|||
|
format described above.
|
|||
|
|
|||
|
If, for some other reason, a client connection is closed without the
|
|||
|
client issuing a QUIT command (e.g. client dies and EOF occurs on
|
|||
|
socket), the server is REQUIRED to fill in the quit message with some
|
|||
|
sort of message reflecting the nature of the event which caused it to
|
|||
|
happen. Typically, this is done by reporting a system specific
|
|||
|
error.
|
|||
|
|
|||
|
Numeric Replies:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 12]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
Examples:
|
|||
|
|
|||
|
:WiZ QUIT :Gone to have lunch ; Preferred message format.
|
|||
|
|
|||
|
4.1.6 Server quit message
|
|||
|
|
|||
|
Command: SQUIT
|
|||
|
Parameters: <server> <comment>
|
|||
|
|
|||
|
The SQUIT message has two distinct uses.
|
|||
|
|
|||
|
The first one (described in "Internet Relay Chat: Client Protocol"
|
|||
|
[IRC-CLIENT]) allows operators to break a local or remote server
|
|||
|
link. This form of the message is also eventually used by servers to
|
|||
|
break a remote server link.
|
|||
|
|
|||
|
The second use of this message is needed to inform other servers when
|
|||
|
a "network split" (also known as "netsplit") occurs, in other words
|
|||
|
to inform other servers about quitting or dead servers. If a server
|
|||
|
wishes to break the connection to another server it MUST send a SQUIT
|
|||
|
message to the other server, using the name of the other server as
|
|||
|
the server parameter, which then closes its connection to the
|
|||
|
quitting server.
|
|||
|
|
|||
|
The <comment> is filled in by servers which SHOULD place an error or
|
|||
|
similar message here.
|
|||
|
|
|||
|
Both of the servers which are on either side of the connection being
|
|||
|
closed are REQUIRED to send out a SQUIT message (to all its other
|
|||
|
server connections) for all other servers which are considered to be
|
|||
|
behind that link.
|
|||
|
|
|||
|
Similarly, a QUIT message MAY be sent to the other still connected
|
|||
|
servers on behalf of all clients behind that quitting link. In
|
|||
|
addition to this, all channel members of a channel which lost a
|
|||
|
member due to the "split" MUST be sent a QUIT message. Messages to
|
|||
|
channel members are generated by each client's local server.
|
|||
|
|
|||
|
If a server connection is terminated prematurely (e.g., the server on
|
|||
|
the other end of the link died), the server which detects this
|
|||
|
disconnection is REQUIRED to inform the rest of the network that the
|
|||
|
connection has closed and fill in the comment field with something
|
|||
|
appropriate.
|
|||
|
|
|||
|
When a client is removed as the result of a SQUIT message, the server
|
|||
|
SHOULD add the nickname to the list of temporarily unavailable
|
|||
|
nicknames in an attempt to prevent future nickname collisions. See
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 13]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
section 5.7 (Tracking recently used nicknames) for more information
|
|||
|
on this procedure.
|
|||
|
|
|||
|
Numeric replies:
|
|||
|
|
|||
|
ERR_NOPRIVILEGES ERR_NOSUCHSERVER
|
|||
|
ERR_NEEDMOREPARAMS
|
|||
|
|
|||
|
Example:
|
|||
|
|
|||
|
SQUIT tolsun.oulu.fi :Bad Link ? ; the server link tolson.oulu.fi
|
|||
|
has been terminated because of "Bad
|
|||
|
Link".
|
|||
|
|
|||
|
:Trillian SQUIT cm22.eng.umd.edu :Server out of control ; message
|
|||
|
from Trillian to disconnect
|
|||
|
"cm22.eng.umd.edu" from the net
|
|||
|
because "Server out of control".
|
|||
|
|
|||
|
4.2 Channel operations
|
|||
|
|
|||
|
This group of messages is concerned with manipulating channels, their
|
|||
|
properties (channel modes), and their contents (typically users). In
|
|||
|
implementing these, a number of race conditions are inevitable when
|
|||
|
users at opposing ends of a network send commands which will
|
|||
|
ultimately clash. It is also REQUIRED that servers keep a nickname
|
|||
|
history to ensure that wherever a <nick> parameter is given, the
|
|||
|
server check its history in case it has recently been changed.
|
|||
|
|
|||
|
4.2.1 Join message
|
|||
|
|
|||
|
Command: JOIN
|
|||
|
Parameters: <channel>[ %x7 <modes> ]
|
|||
|
*( "," <channel>[ %x7 <modes> ] )
|
|||
|
|
|||
|
The JOIN command is used by client to start listening a specific
|
|||
|
channel. Whether or not a client is allowed to join a channel is
|
|||
|
checked only by the local server the client is connected to; all
|
|||
|
other servers automatically add the user to the channel when the
|
|||
|
command is received from other servers.
|
|||
|
|
|||
|
Optionally, the user status (channel modes 'O', 'o', and 'v') on the
|
|||
|
channel may be appended to the channel name using a control G (^G or
|
|||
|
ASCII 7) as separator. Such data MUST be ignored if the message
|
|||
|
wasn't received from a server. This format MUST NOT be sent to
|
|||
|
clients, it can only be used between servers and SHOULD be avoided.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 14]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
The JOIN command MUST be broadcast to all servers so that each server
|
|||
|
knows where to find the users who are on the channel. This allows
|
|||
|
optimal delivery of PRIVMSG and NOTICE messages to the channel.
|
|||
|
|
|||
|
Numeric Replies:
|
|||
|
|
|||
|
ERR_NEEDMOREPARAMS ERR_BANNEDFROMCHAN
|
|||
|
ERR_INVITEONLYCHAN ERR_BADCHANNELKEY
|
|||
|
ERR_CHANNELISFULL ERR_BADCHANMASK
|
|||
|
ERR_NOSUCHCHANNEL ERR_TOOMANYCHANNELS
|
|||
|
ERR_TOOMANYTARGETS ERR_UNAVAILRESOURCE
|
|||
|
RPL_TOPIC
|
|||
|
|
|||
|
Examples:
|
|||
|
|
|||
|
:WiZ JOIN #Twilight_zone ; JOIN message from WiZ
|
|||
|
|
|||
|
4.2.2 Njoin message
|
|||
|
|
|||
|
Command: NJOIN
|
|||
|
Parameters: <channel> [ "@@" / "@" ] [ "+" ] <nickname>
|
|||
|
*( "," [ "@@" / "@" ] [ "+" ] <nickname> )
|
|||
|
|
|||
|
The NJOIN message is used between servers only. If such a message is
|
|||
|
received from a client, it MUST be ignored. It is used when two
|
|||
|
servers connect to each other to exchange the list of channel members
|
|||
|
for each channel.
|
|||
|
|
|||
|
Even though the same function can be performed by using a succession
|
|||
|
of JOIN, this message SHOULD be used instead as it is more efficient.
|
|||
|
The prefix "@@" indicates that the user is the "channel creator", the
|
|||
|
character "@" alone indicates a "channel operator", and the character
|
|||
|
'+' indicates that the user has the voice privilege.
|
|||
|
|
|||
|
Numeric Replies:
|
|||
|
|
|||
|
ERR_NEEDMOREPARAMS ERR_NOSUCHCHANNEL
|
|||
|
ERR_ALREADYREGISTRED
|
|||
|
|
|||
|
Examples:
|
|||
|
|
|||
|
:ircd.stealth.net NJOIN #Twilight_zone :@WiZ,+syrk,avalon ; NJOIN
|
|||
|
message from ircd.stealth.net
|
|||
|
announcing users joining the
|
|||
|
#Twilight_zone channel: WiZ with
|
|||
|
channel operator status, syrk with
|
|||
|
voice privilege and avalon with no
|
|||
|
privilege.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 15]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
4.2.3 Mode message
|
|||
|
|
|||
|
The MODE message is a dual-purpose command in IRC. It allows both
|
|||
|
usernames and channels to have their mode changed.
|
|||
|
|
|||
|
When parsing MODE messages, it is RECOMMENDED that the entire message
|
|||
|
be parsed first, and then the changes which resulted passed on.
|
|||
|
|
|||
|
It is REQUIRED that servers are able to change channel modes so that
|
|||
|
"channel creator" and "channel operators" may be created.
|
|||
|
|
|||
|
5. Implementation details
|
|||
|
|
|||
|
A the time of writing, the only current implementation of this
|
|||
|
protocol is the IRC server, version 2.10. Earlier versions may
|
|||
|
implement some or all of the commands described by this document with
|
|||
|
NOTICE messages replacing many of the numeric replies. Unfortunately,
|
|||
|
due to backward compatibility requirements, the implementation of
|
|||
|
some parts of this document varies with what is laid out. One
|
|||
|
notable difference is:
|
|||
|
|
|||
|
* recognition that any LF or CR anywhere in a message marks
|
|||
|
the end of that message (instead of requiring CR-LF);
|
|||
|
|
|||
|
The rest of this section deals with issues that are mostly of
|
|||
|
importance to those who wish to implement a server but some parts
|
|||
|
also apply directly to clients as well.
|
|||
|
|
|||
|
5.1 Connection 'Liveness'
|
|||
|
|
|||
|
To detect when a connection has died or become unresponsive, the
|
|||
|
server MUST poll each of its connections. The PING command (See "IRC
|
|||
|
Client Protocol" [IRC-CLIENT]) is used if the server doesn't get a
|
|||
|
response from its peer in a given amount of time.
|
|||
|
|
|||
|
If a connection doesn't respond in time, its connection is closed
|
|||
|
using the appropriate procedures.
|
|||
|
|
|||
|
5.2 Accepting a client to server connection
|
|||
|
|
|||
|
5.2.1 Users
|
|||
|
|
|||
|
When a server successfully registers a new user connection, it is
|
|||
|
REQUIRED to send to the user unambiguous messages stating: the user
|
|||
|
identifiers upon which it was registered (RPL_WELCOME), the server
|
|||
|
name and version (RPL_YOURHOST), the server birth information
|
|||
|
(RPL_CREATED), available user and channel modes (RPL_MYINFO), and it
|
|||
|
MAY send any introductory messages which may be deemed appropriate.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 16]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
In particular the server SHALL send the current user/service/server
|
|||
|
count (as per the LUSER reply) and finally the MOTD (if any, as per
|
|||
|
the MOTD reply).
|
|||
|
|
|||
|
After dealing with registration, the server MUST then send out to
|
|||
|
other servers the new user's nickname (NICK message), other
|
|||
|
information as supplied by itself (USER message) and as the server
|
|||
|
could discover (from DNS servers). The server MUST NOT send this
|
|||
|
information out with a pair of NICK and USER messages as defined in
|
|||
|
"IRC Client Protocol" [IRC-CLIENT], but MUST instead take advantage
|
|||
|
of the extended NICK message defined in section 4.1.3.
|
|||
|
|
|||
|
5.2.2 Services
|
|||
|
|
|||
|
Upon successfully registering a new service connection, the server is
|
|||
|
subject to the same kind of REQUIREMENTS as for a user. Services
|
|||
|
being somewhat different, only the following replies are sent:
|
|||
|
RPL_YOURESERVICE, RPL_YOURHOST, RPL_MYINFO.
|
|||
|
|
|||
|
After dealing with this, the server MUST then send out to other
|
|||
|
servers (SERVICE message) the new service's nickname and other
|
|||
|
information as supplied by the service (SERVICE message) and as the
|
|||
|
server could discover (from DNS servers).
|
|||
|
|
|||
|
5.3 Establishing a server-server connection.
|
|||
|
|
|||
|
The process of establishing a server-to-server connection is fraught
|
|||
|
with danger since there are many possible areas where problems can
|
|||
|
occur - the least of which are race conditions.
|
|||
|
|
|||
|
After a server has received a connection following by a PASS/SERVER
|
|||
|
pair which were recognized as being valid, the server SHOULD then
|
|||
|
reply with its own PASS/SERVER information for that connection as
|
|||
|
well as all of the other state information it knows about as
|
|||
|
described below.
|
|||
|
|
|||
|
When the initiating server receives a PASS/SERVER pair, it too then
|
|||
|
checks that the server responding is authenticated properly before
|
|||
|
accepting the connection to be that server.
|
|||
|
|
|||
|
5.3.1 Link options
|
|||
|
|
|||
|
Server links are based on a common protocol (defined by this
|
|||
|
document) but a particular link MAY set specific options using the
|
|||
|
PASS message (See Section 4.1.1).
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 17]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
5.3.1.1 Compressed server to server links
|
|||
|
|
|||
|
If a server wishes to establish a compressed link with its peer, it
|
|||
|
MUST set the 'Z' flag in the options parameter to the PASS message.
|
|||
|
If both servers request compression and both servers are able to
|
|||
|
initialize the two compressed streams, then the remainder of the
|
|||
|
communication is to be compressed. If any server fails to initialize
|
|||
|
the stream, it will send an uncompressed ERROR message to its peer
|
|||
|
and close the connection.
|
|||
|
|
|||
|
The data format used for the compression is described by RFC 1950
|
|||
|
[ZLIB], RFC 1951 [DEFLATE] and RFC 1952 [GZIP].
|
|||
|
|
|||
|
5.3.1.2 Anti abuse protections
|
|||
|
|
|||
|
Most servers implement various kinds of protections against possible
|
|||
|
abusive behaviours from non trusted parties (typically users). On
|
|||
|
some networks, such protections are indispensable, on others they are
|
|||
|
superfluous. To require that all servers implement and enable such
|
|||
|
features on a particular network, the 'P' flag is used when two
|
|||
|
servers connect. If this flag is present, it means that the server
|
|||
|
protections are enabled, and that the server REQUIRES all its server
|
|||
|
links to enable them as well.
|
|||
|
|
|||
|
Commonly found protections are described in sections 5.7 (Tracking
|
|||
|
recently used nicknames) and 5.8 (Flood control of clients).
|
|||
|
|
|||
|
5.3.2 State information exchange when connecting
|
|||
|
|
|||
|
The order of state information being exchanged between servers is
|
|||
|
essential. The REQUIRED order is as follows:
|
|||
|
|
|||
|
* all known servers;
|
|||
|
|
|||
|
* all known client information;
|
|||
|
|
|||
|
* all known channel information.
|
|||
|
|
|||
|
Information regarding servers is sent via extra SERVER messages,
|
|||
|
client information with NICK and SERVICE messages and channels with
|
|||
|
NJOIN/MODE messages.
|
|||
|
|
|||
|
NOTE: channel topics SHOULD NOT be exchanged here because the TOPIC
|
|||
|
command overwrites any old topic information, so at best, the two
|
|||
|
sides of the connection would exchange topics.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 18]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
By passing the state information about servers first, any collisions
|
|||
|
with servers that already exist occur before nickname collisions
|
|||
|
caused by a second server introducing a particular nickname. Due to
|
|||
|
the IRC network only being able to exist as an acyclic graph, it may
|
|||
|
be possible that the network has already reconnected in another
|
|||
|
location. In this event, the place where the server collision occurs
|
|||
|
indicates where the net needs to split.
|
|||
|
|
|||
|
5.4 Terminating server-client connections
|
|||
|
|
|||
|
When a client connection unexpectedly closes, a QUIT message is
|
|||
|
generated on behalf of the client by the server to which the client
|
|||
|
was connected. No other message is to be generated or used.
|
|||
|
|
|||
|
5.5 Terminating server-server connections
|
|||
|
|
|||
|
If a server-server connection is closed, either via a SQUIT command
|
|||
|
or "natural" causes, the rest of the connected IRC network MUST have
|
|||
|
its information updated by the server which detected the closure.
|
|||
|
The terminating server then sends a list of SQUITs (one for each
|
|||
|
server behind that connection). (See Section 4.1.6 (SQUIT)).
|
|||
|
|
|||
|
5.6 Tracking nickname changes
|
|||
|
|
|||
|
All IRC servers are REQUIRED to keep a history of recent nickname
|
|||
|
changes. This is important to allow the server to have a chance of
|
|||
|
keeping in touch of things when nick-change race conditions occur
|
|||
|
with commands manipulating them. Messages which MUST trace nick
|
|||
|
changes are:
|
|||
|
|
|||
|
* KILL (the nick being disconnected)
|
|||
|
|
|||
|
* MODE (+/- o,v on channels)
|
|||
|
|
|||
|
* KICK (the nick being removed from channel)
|
|||
|
|
|||
|
No other commands need to check nick changes.
|
|||
|
|
|||
|
In the above cases, the server is required to first check for the
|
|||
|
existence of the nickname, then check its history to see who that
|
|||
|
nick now belongs to (if anyone!). This reduces the chances of race
|
|||
|
conditions but they can still occur with the server ending up
|
|||
|
affecting the wrong client. When performing a change trace for an
|
|||
|
above command it is RECOMMENDED that a time range be given and
|
|||
|
entries which are too old ignored.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 19]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
For a reasonable history, a server SHOULD be able to keep previous
|
|||
|
nickname for every client it knows about if they all decided to
|
|||
|
change. This size is limited by other factors (such as memory, etc).
|
|||
|
|
|||
|
5.7 Tracking recently used nicknames
|
|||
|
|
|||
|
This mechanism is commonly known as "Nickname Delay", it has been
|
|||
|
proven to significantly reduce the number of nickname collisions
|
|||
|
resulting from "network splits"/reconnections as well as abuse.
|
|||
|
|
|||
|
In addition of keeping track of nickname changes, servers SHOULD keep
|
|||
|
track of nicknames which were recently used and were released as the
|
|||
|
result of a "network split" or a KILL message. These nicknames are
|
|||
|
then unavailable to the server local clients and cannot be re-used
|
|||
|
(even though they are not currently in use) for a certain period of
|
|||
|
time.
|
|||
|
|
|||
|
The duration for which a nickname remains unavailable SHOULD be set
|
|||
|
considering many factors among which are the size (user wise) of the
|
|||
|
IRC network, and the usual duration of "network splits". It SHOULD
|
|||
|
be uniform on all servers for a given IRC network.
|
|||
|
|
|||
|
5.8 Flood control of clients
|
|||
|
|
|||
|
With a large network of interconnected IRC servers, it is quite easy
|
|||
|
for any single client attached to the network to supply a continuous
|
|||
|
stream of messages that result in not only flooding the network, but
|
|||
|
also degrading the level of service provided to others. Rather than
|
|||
|
require every 'victim' to provide their own protection, flood
|
|||
|
protection was written into the server and is applied to all clients
|
|||
|
except services. The current algorithm is as follows:
|
|||
|
|
|||
|
* check to see if client's `message timer' is less than current time
|
|||
|
(set to be equal if it is);
|
|||
|
|
|||
|
* read any data present from the client;
|
|||
|
|
|||
|
* while the timer is less than ten (10) seconds ahead of the current
|
|||
|
time, parse any present messages and penalize the client by two (2)
|
|||
|
seconds for each message;
|
|||
|
|
|||
|
* additional penalties MAY be used for specific commands which
|
|||
|
generate a lot of traffic across the network.
|
|||
|
|
|||
|
This in essence means that the client may send one (1) message every
|
|||
|
two (2) seconds without being adversely affected. Services MAY also
|
|||
|
be subject to this mechanism.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 20]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
5.9 Non-blocking lookups
|
|||
|
|
|||
|
In a real-time environment, it is essential that a server process
|
|||
|
does as little waiting as possible so that all the clients are
|
|||
|
serviced fairly. Obviously this requires non-blocking IO on all
|
|||
|
network read/write operations. For normal server connections, this
|
|||
|
was not difficult, but there are other support operations that may
|
|||
|
cause the server to block (such as disk reads). Where possible, such
|
|||
|
activity SHOULD be performed with a short timeout.
|
|||
|
|
|||
|
5.9.1 Hostname (DNS) lookups
|
|||
|
|
|||
|
Using the standard resolver libraries from Berkeley and others has
|
|||
|
meant large delays in some cases where replies have timed out. To
|
|||
|
avoid this, a separate set of DNS routines were written for the
|
|||
|
current implementation. Routines were setup for non-blocking IO
|
|||
|
operations with local cache, and then polled from within the main
|
|||
|
server IO loop.
|
|||
|
|
|||
|
5.9.2 Username (Ident) lookups
|
|||
|
|
|||
|
Although there are numerous ident libraries (implementing the
|
|||
|
"Identification Protocol" [IDENT]) for use and inclusion into other
|
|||
|
programs, these caused problems since they operated in a synchronous
|
|||
|
manner and resulted in frequent delays. Again the solution was to
|
|||
|
write a set of routines which would cooperate with the rest of the
|
|||
|
server and work using non-blocking IO.
|
|||
|
|
|||
|
6. Current problems
|
|||
|
|
|||
|
There are a number of recognized problems with this protocol, all of
|
|||
|
which are hoped to be solved sometime in the near future during its
|
|||
|
rewrite. Currently, work is underway to find working solutions to
|
|||
|
these problems.
|
|||
|
|
|||
|
6.1 Scalability
|
|||
|
|
|||
|
It is widely recognized that this protocol does not scale
|
|||
|
sufficiently well when used in a large arena. The main problem comes
|
|||
|
from the requirement that all servers know about all other servers
|
|||
|
and clients and that information regarding them be updated as soon as
|
|||
|
it changes. It is also desirable to keep the number of servers low
|
|||
|
so that the path length between any two points is kept minimal and
|
|||
|
the spanning tree as strongly branched as possible.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 21]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
6.2 Labels
|
|||
|
|
|||
|
The current IRC protocol has 4 types of labels: the nickname, the
|
|||
|
channel name, the server name and the service name. Each of the four
|
|||
|
types has its own domain and no duplicates are allowed inside that
|
|||
|
domain. Currently, it is possible for users to pick the label for
|
|||
|
any of the first three, resulting in collisions. It is widely
|
|||
|
recognized that this needs reworking, with a plan for unique names
|
|||
|
for nicks that don't collide being desirable as well as a solution
|
|||
|
allowing a cyclic tree.
|
|||
|
|
|||
|
6.2.1 Nicknames
|
|||
|
|
|||
|
The idea of the nickname on IRC is very convenient for users to use
|
|||
|
when talking to each other outside of a channel, but there is only a
|
|||
|
finite nickname space and being what they are, it's not uncommon for
|
|||
|
several people to want to use the same nick. If a nickname is chosen
|
|||
|
by two people using this protocol, either one will not succeed or
|
|||
|
both will be removed by use of KILL (See Section 3.7.1 of "IRC Client
|
|||
|
Protocol" [IRC-CLIENT]).
|
|||
|
|
|||
|
6.2.2 Channels
|
|||
|
|
|||
|
The current channel layout requires that all servers know about all
|
|||
|
channels, their inhabitants and properties. Besides not scaling
|
|||
|
well, the issue of privacy is also a concern. A collision of
|
|||
|
channels is treated as an inclusive event (people from both nets on
|
|||
|
channel with common name are considered to be members of it) rather
|
|||
|
than an exclusive one such as used to solve nickname collisions.
|
|||
|
|
|||
|
This protocol defines "Safe Channels" which are very unlikely to be
|
|||
|
the subject of a channel collision. Other channel types are kept for
|
|||
|
backward compatibility.
|
|||
|
|
|||
|
6.2.3 Servers
|
|||
|
|
|||
|
Although the number of servers is usually small relative to the
|
|||
|
number of users and channels, they too are currently REQUIRED to be
|
|||
|
known globally, either each one separately or hidden behind a mask.
|
|||
|
|
|||
|
6.3 Algorithms
|
|||
|
|
|||
|
In some places within the server code, it has not been possible to
|
|||
|
avoid N^2 algorithms such as checking the channel list of a set of
|
|||
|
clients.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 22]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
In current server versions, there are only few database consistency
|
|||
|
checks, most of the time each server assumes that a neighbouring
|
|||
|
server is correct. This opens the door to large problems if a
|
|||
|
connecting server is buggy or otherwise tries to introduce
|
|||
|
contradictions to the existing net.
|
|||
|
|
|||
|
Currently, because of the lack of unique internal and global labels,
|
|||
|
there are a multitude of race conditions that exist. These race
|
|||
|
conditions generally arise from the problem of it taking time for
|
|||
|
messages to traverse and effect the IRC network. Even by changing to
|
|||
|
unique labels, there are problems with channel-related commands being
|
|||
|
disrupted.
|
|||
|
|
|||
|
7. Security Considerations
|
|||
|
|
|||
|
7.1 Authentication
|
|||
|
|
|||
|
Servers only have two means of authenticating incoming connections:
|
|||
|
plain text password, and DNS lookups. While these methods are weak
|
|||
|
and widely recognized as unsafe, their combination has proven to be
|
|||
|
sufficient in the past:
|
|||
|
|
|||
|
* public networks typically allow user connections with only few
|
|||
|
restrictions, without requiring accurate authentication.
|
|||
|
|
|||
|
* private networks which operate in a controlled environment often
|
|||
|
use home-grown authentication mechanisms not available on the
|
|||
|
internet: reliable ident servers [IDENT], or other proprietary
|
|||
|
mechanisms.
|
|||
|
|
|||
|
The same comments apply to the authentication of IRC Operators.
|
|||
|
|
|||
|
It should also be noted that while there has been no real demand over
|
|||
|
the years for stronger authentication, and no real effort to provide
|
|||
|
better means to safely authenticate users, the current protocol
|
|||
|
offers enough to be able to easily plug-in external authentication
|
|||
|
methods based on the information that a client can submit to the
|
|||
|
server upon connection: nickname, username, password.
|
|||
|
|
|||
|
7.2 Integrity
|
|||
|
|
|||
|
Since the PASS and OPER messages of the IRC protocol are sent in
|
|||
|
clear text, a stream layer encryption mechanism (like "The TLS
|
|||
|
Protocol" [TLS]) could be used to protect these transactions.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 23]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
8. Current support and availability
|
|||
|
|
|||
|
Mailing lists for IRC related discussion:
|
|||
|
General discussion: ircd-users@irc.org
|
|||
|
Protocol development: ircd-dev@irc.org
|
|||
|
|
|||
|
Software implementations:
|
|||
|
ftp://ftp.irc.org/irc/server
|
|||
|
ftp://ftp.funet.fi/pub/unix/irc
|
|||
|
ftp://coombs.anu.edu.au/pub/irc
|
|||
|
|
|||
|
Newsgroup: alt.irc
|
|||
|
|
|||
|
9. Acknowledgements
|
|||
|
|
|||
|
Parts of this document were copied from the RFC 1459 [IRC] which
|
|||
|
first formally documented the IRC Protocol. It has also benefited
|
|||
|
from many rounds of review and comments. In particular, the
|
|||
|
following people have made significant contributions to this
|
|||
|
document:
|
|||
|
|
|||
|
Matthew Green, Michael Neumayer, Volker Paulsen, Kurt Roeckx, Vesa
|
|||
|
Ruokonen, Magnus Tjernstrom, Stefan Zehl.
|
|||
|
|
|||
|
10. References
|
|||
|
|
|||
|
[KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate
|
|||
|
Requirement Levels", BCP 14, RFC 2119, March 1997.
|
|||
|
|
|||
|
[ABNF] Crocker, D. and P. Overell, "Augmented BNF for Syntax
|
|||
|
Specifications: ABNF", RFC 2234, November 1997.
|
|||
|
|
|||
|
[IRC] Oikarinen, J. and D. Reed, "Internet Relay Chat
|
|||
|
Protocol", RFC 1459, May 1993.
|
|||
|
|
|||
|
[IRC-ARCH] Kalt, C., "Internet Relay Chat: Architecture", RFC 2810,
|
|||
|
April 2000.
|
|||
|
|
|||
|
[IRC-CLIENT] Kalt, C., "Internet Relay Chat: Client Protocol", RFC
|
|||
|
2812, April 2000.
|
|||
|
|
|||
|
|
|||
|
[IRC-CHAN] Kalt, C., "Internet Relay Chat: Channel Management", RFC
|
|||
|
2811, April 2000.
|
|||
|
|
|||
|
[ZLIB] Deutsch, P. and J-L. Gailly, "ZLIB Compressed Data
|
|||
|
Format Specification version 3.3", RFC 1950, May 1996.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 24]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
[DEFLATE] Deutsch, P., "DEFLATE Compressed Data Format
|
|||
|
Specification version 1.3", RFC 1951, May 1996.
|
|||
|
|
|||
|
[GZIP] Deutsch, P., "GZIP file format specification version
|
|||
|
4.3", RFC 1952, May 1996.
|
|||
|
|
|||
|
[IDENT] St. Johns, M., "The Identification Protocol", RFC 1413,
|
|||
|
February 1993.
|
|||
|
|
|||
|
[TLS] Dierks, T. and C. Allen, "The TLS Protocol", RFC 2246,
|
|||
|
January 1999.
|
|||
|
|
|||
|
11. Author's Address
|
|||
|
|
|||
|
Christophe Kalt
|
|||
|
99 Teaneck Rd, Apt #117
|
|||
|
Ridgefield Park, NJ 07660
|
|||
|
USA
|
|||
|
|
|||
|
EMail: kalt@stealth.net
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 25]
|
|||
|
|
|||
|
RFC 2813 Internet Relay Chat: Server Protocol April 2000
|
|||
|
|
|||
|
|
|||
|
12. Full Copyright Statement
|
|||
|
|
|||
|
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 assist in its implementation may be prepared, copied, published
|
|||
|
and distributed, in whole or in part, without restriction of any
|
|||
|
kind, provided that 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, except as needed for the purpose of
|
|||
|
developing Internet standards in which case the procedures for
|
|||
|
copyrights defined in the Internet Standards process must be
|
|||
|
followed, or as required to translate it into languages other than
|
|||
|
English.
|
|||
|
|
|||
|
The limited permissions granted above are perpetual and will not be
|
|||
|
revoked by the Internet Society or its successors or assigns.
|
|||
|
|
|||
|
This document and the information contained herein 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.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Kalt Informational [Page 26]
|
|||
|
|