Various RFCs and other documentation that we (I) may need
This commit is contained in:
parent
4b7cc141e5
commit
14010af147
|
@ -0,0 +1,914 @@
|
|||
Ed. Note: The following note is from the author's original email
|
||||
announcing this CTCP specification file. All of this came after the
|
||||
original RFC 1459 for the IRC protocol. -Jolo
|
||||
|
||||
From: ben@gnu.ai.mit.edu
|
||||
Subject: REVISED AND UPDATED CTCP SPECIFICATION
|
||||
Date: Fri, 12 Aug 94 00:21:54 edt
|
||||
|
||||
As part of documenting the ZenIRC client, I expanded, revised, and
|
||||
merged two text files that have been around on IRC archive sites for
|
||||
some time: ctcp.doc, and dcc.protocol. The file "ctcp.doc" by Klaus
|
||||
Zeuge described the basic CTCP protocol, and most of the CTCP commands
|
||||
other than DCC. The file Troy Rollo wrote, "dcc.protocol", contained
|
||||
a description of the CTCP DCC messages as well as the protocols used
|
||||
by DCC CHAT and DCC file transfers. I have merged the two documents to
|
||||
produce this one, edited them for clarity, and expanded on them where I
|
||||
found them unclear while implementing CTCP in the ZenIRC client.
|
||||
|
||||
--Ben
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
The Client-To-Client Protocol (CTCP)
|
||||
|
||||
Klaus Zeuge <sojge@Minsk.DoCS.UU.SE>
|
||||
Troy Rollo <troy@plod.cbme.unsw.oz.au>
|
||||
Ben Mesander <ben@gnu.ai.mit.edu>
|
||||
|
||||
|
||||
The Client-To-Client Protocol is meant to be used as a way to
|
||||
1/ in general send structured data (such as graphics,
|
||||
voice and different font information) between users
|
||||
clients, and in a more specific case:
|
||||
2/ place a query to a users client and getting an answer.
|
||||
|
||||
*****************************************
|
||||
BASIC PROTOCOL BETWEEN CLIENTS AND SERVER
|
||||
*****************************************
|
||||
|
||||
Characters between an Internet Relay Chat (IRC) client and server are
|
||||
8 bit bytes (also known as octets) and can have numeric values from
|
||||
octal \000 to \377 inclusive (0 to 255 decimal). Some characters are
|
||||
special:
|
||||
|
||||
CHARS ::= '\000' .. '\377'
|
||||
NUL ::= '\000'
|
||||
NL ::= '\n'
|
||||
CR ::= '\r'
|
||||
|
||||
Note: `\' followed by three digits is used to denote an octal value in this
|
||||
paper. `\' followed by an alphabetic character is used to denote a C
|
||||
language style special character, and `..' denotes a range of characters.
|
||||
|
||||
A line sent to a server, or received from a server (here called "low
|
||||
level messages") consist or zero or more octets (expcept NUL, NL or
|
||||
CR) with either a NL or CR appended.
|
||||
|
||||
L-CHARS ::= '\001' .. '\011' | '\013' | '\014' |
|
||||
'\016' .. '\377'
|
||||
L-LINE ::= L-CHARS* CR LF
|
||||
|
||||
Note: The `*' is used here to denote "zero or more of the preceding class of
|
||||
characters", and the `|' is used to denote alternation.
|
||||
|
||||
A NUL is never sent to the server.
|
||||
|
||||
*****************
|
||||
LOW LEVEL QUOTING
|
||||
*****************
|
||||
|
||||
Even though messages to and from IRC servers cannot contain NUL, NL,
|
||||
or CR, it still might be desirable to send ANY character (in so called
|
||||
"middle level messages") between clients. In order for this to be
|
||||
possible, those three characters have to be quoted. Therefore a quote
|
||||
character is needed. Of course, the quote character itself has to be
|
||||
quoted too, since it is in-band.
|
||||
|
||||
M-QUOTE ::= '\020'
|
||||
|
||||
(Ie a CNTRL/P).
|
||||
|
||||
When sending a middle level message, if there is a character in the
|
||||
set { NUL, NL, CR, M-QUOTE } present in the message, that character is
|
||||
replaced by a two character sequence according to the following table:
|
||||
|
||||
NUL --> M-QUOTE '0'
|
||||
NL --> M-QUOTE 'n'
|
||||
CR --> M-QUOTE 'r'
|
||||
M-QUOTE --> M-QUOTE M-QUOTE
|
||||
|
||||
When receiving a low level message, if there is a M-QUOTE, look at the
|
||||
next character, and replace those two according to the following table
|
||||
to get the corresponding middle level message:
|
||||
|
||||
M-QUOTE '0' --> NUL
|
||||
M-QUOTE 'n' --> NL
|
||||
M-QUOTE 'r' --> CR
|
||||
M-QUOTE M-QUOTE --> M-QUOTE
|
||||
|
||||
If the character following M-QUOTE is not any of the listed
|
||||
characters, that is an error, so drop the M-QUOTE character from the
|
||||
message, optionally warning the user about it. For example, a string
|
||||
'x' M-QUOTE 'y' 'z' from a server dequotes into 'x 'y' 'z'.
|
||||
|
||||
Before low level quoting, a message to the server (and in the opposite
|
||||
direction: after low level dequoting, a message from the server) looks
|
||||
like:
|
||||
|
||||
M-LINE ::= CHARS*
|
||||
|
||||
***********
|
||||
TAGGED DATA
|
||||
***********
|
||||
|
||||
To send both extended data and query/reply pairs between clients, an
|
||||
extended data format is needed. The extended data are sent in the text
|
||||
part of a middle level message (and after low level quoting, in the
|
||||
text part of the low level message).
|
||||
|
||||
To send extended data inside the middle level message, we need some
|
||||
way to delimit it. This is done by starting and ending extended data
|
||||
with a delimiter character, defined as:
|
||||
|
||||
X-DELIM ::= '\001'
|
||||
|
||||
As both the starting and ending delimiter looks the same, the first
|
||||
X-DELIM is called the odd delimiter, and the one that follows, the
|
||||
even delimiter. The next one after that, an odd delimiter, then and
|
||||
even, and so on.
|
||||
|
||||
When data are quoted (and conversely, before being dequoted) any number
|
||||
of characters of any kind except X-DELIM can be used in the extended
|
||||
data inside the X-DELIM pair.
|
||||
|
||||
X-CHR ::= '\000' | '\002' .. '\377'
|
||||
|
||||
An extended message is either empty (nothing between the odd and even
|
||||
delimiter), has one or more non-space characters (any character but
|
||||
'\040') or has one or more non-space characters followed by a space
|
||||
followed by zero or more characters.
|
||||
|
||||
X-N-AS ::= '\000' | '\002' .. '\037' | '\041' .. '\377'
|
||||
SPC ::= '\040'
|
||||
X-MSG ::= | X-N-AS+ | X-N-AS+ SPC X-CHR*
|
||||
|
||||
Note: Here `+' is used to denote "one or more of the previous class of
|
||||
characters", and `*' is used to denote "zero or more of the previous
|
||||
class of characters".
|
||||
|
||||
The characters up until the first SPC (or if no SPC, all of the X-MSG)
|
||||
is called the tag of the extended message. The tag is used to denote
|
||||
what kind of extended data is used.
|
||||
|
||||
The tag can be *any* string of characters, and if it contains
|
||||
alphabetics, it is case sensitive, so upper and lower case matters.
|
||||
|
||||
Extended data is only valid in PRIVMSG and NOTICE commands. If the
|
||||
extended data is a reply to a query, it is sent in a NOTICE, otherwise
|
||||
it is sent in a PRIVMSG. Both PRIVMSG and NOTICE to a user and to a
|
||||
channel may contain extended data.
|
||||
|
||||
The text part of a PRIVMSG or NOTICE might contain zero or more
|
||||
extended messages, intermixed with zero or more chunks of non-extended
|
||||
data.
|
||||
|
||||
******************
|
||||
CTCP LEVEL QUOTING
|
||||
******************
|
||||
|
||||
In order to be able to send the delimiter X-DELIM inside an extended
|
||||
data message, it has to be quoted. This introduces another quote
|
||||
character (which differs from the low level quote character so it
|
||||
won't have to be quoted yet again).
|
||||
|
||||
X-QUOTE ::= '\134'
|
||||
|
||||
(a back slash - `\').
|
||||
|
||||
When quoting on the CTCP level, only the actual CTCP message (extended
|
||||
data, queries, replies) are quoted. This enables users to actually
|
||||
send X-QUOTE characters at will. The following translations should be
|
||||
used:
|
||||
|
||||
X-DELIM --> X-QUOTE 'a'
|
||||
X-QUOTE --> X-QUOTE X-QUOTE
|
||||
|
||||
and when dequoting on the CTCP level, only CTCP messages are dequoted
|
||||
whereby the following table is used.
|
||||
|
||||
X-QUOTE 'a' --> X-DELIM
|
||||
X-QUOTE X-QUOTE --> X-QUOTE
|
||||
|
||||
If an X-QUOTE is seen with a character following it other than the
|
||||
ones above, that is an error and the X-QUOTE character should be
|
||||
dropped. For example the CTCP-quoted string 'x' X-QUOTE 'y' 'z'
|
||||
becomes after dequoting, the three character string 'x' 'y' 'z'.
|
||||
|
||||
If a X-DELIM is found outside a CTCP message, the message will contain
|
||||
the X-DELIM. (This should only happen with the last X-DELIM when there
|
||||
are an odd number of X-DELIM's in a middle level message.)
|
||||
|
||||
****************
|
||||
QUOTING EXAMPLES
|
||||
****************
|
||||
|
||||
There are three levels of messages. The highest level (H) is the text
|
||||
on the user-to-client level. The middle layer (M) is on the level
|
||||
where CTCP quoting has been applied to the H-level message. The lowest
|
||||
level (L) is on the client-to-server level, where low level quoting
|
||||
has been applied to the M-level message.
|
||||
|
||||
The following relations are true, with lowQuote(message) being a
|
||||
function doing the low level quoting, lowDequote(message) the low
|
||||
level dequoting function, ctcpQuote(message) the CTCP level quoting
|
||||
function, ctcpDequote(message) the CTCP level dequoting function, and
|
||||
ctcpExtract(message) the function which removes all CTCP messages from
|
||||
a message:
|
||||
|
||||
L = lowQuote(M)
|
||||
M = ctcpDequote(L)
|
||||
|
||||
M = ctcpQuote(H)
|
||||
H = ctcpDequote(ctcpExtract(M))
|
||||
|
||||
When sending a CTCP message embedded in normal text:
|
||||
|
||||
M = ctcpQuote(H1) || '\001' || ctcpQuote(X) || '\001' || ctcpQuote(H2)
|
||||
|
||||
Note: The operator || denotes string concatenation.
|
||||
|
||||
Of course, there might be zero or more normal text messages and zero
|
||||
or more CTCP messages mixed.
|
||||
|
||||
- --- Example 1 -----------------------------------------------------------------
|
||||
|
||||
A user (called actor) wanting to send the string:
|
||||
|
||||
Hi there!\nHow are you?
|
||||
|
||||
to user victim, i.e. a message where the user has entered an inline
|
||||
newline (how this is done, if at all, differs from client to client),
|
||||
will result internaly in the client in the command:
|
||||
|
||||
PRIVMSG victim :Hi there!\nHow are you? \K?
|
||||
|
||||
which will be CTCP quoted into:
|
||||
|
||||
PRIVMSG victim :Hi there!\nHow are you? \\K?
|
||||
|
||||
which in turn will be low level quoted into:
|
||||
|
||||
PRIVMSG victim :Hi there!\020nHow are you? \\K?
|
||||
|
||||
and sent to the server after appending a newline at the end.
|
||||
|
||||
This will arrive on victim's side as:
|
||||
|
||||
:actor PRIVMSG victim :Hi there!\020nHow are you? \\K?
|
||||
|
||||
(where the \\K would look similar to OK in SIS D47 et. al.) which after
|
||||
low level dequoting becomes:
|
||||
|
||||
:actor PRIVMSG victim :Hi there!\nHow are you? \\K?
|
||||
|
||||
and after CTCP dequoting:
|
||||
|
||||
:actom PRIVMSG victim :Hi there!\nHow are you? \K?
|
||||
|
||||
How this is displayed differs from client to client, but it suggested
|
||||
that a line break should occour between the words "there" and "How".
|
||||
|
||||
- --- Example 2 -----------------------------------------------------------------
|
||||
|
||||
If actor's client wants to send the string "Emacs wins" this might
|
||||
become the string "\n\t\big\020\001\000\\:" when being SED-encrypted
|
||||
[SED is a simple encryption protocol between IRC clients implemented
|
||||
with CTCP. I don't have any reference for it -- Ben] using some key,
|
||||
so the client starts by CTCP-quoting this string into the string
|
||||
"\n\t\big\020\\a\000\\\\:" and builds the M-level message:
|
||||
|
||||
PRIVMSG victim :\001SED \n\t\big\020\\a\000\\\\:\001
|
||||
|
||||
which after low level quoting becomes:
|
||||
|
||||
PRIVMSG victim :\001SED \020n\t\big\020\020\\a\0200\\\\:\001
|
||||
|
||||
which will be sent to the server, with a newline tacked on.
|
||||
|
||||
On victim's side, the string:
|
||||
|
||||
:actor PRIVMSG victim :\001SED \020n\t\big\020\020\\a\0200\\\\:\001
|
||||
|
||||
will be received from the server and low level dequoted into:
|
||||
|
||||
:actor PRIVMSG victim :\001SED \n\t\big\020\\a\000\\\\:\001
|
||||
|
||||
whereafter the string "\n\t\big\020\\a\000\\\\:" will be extracted
|
||||
and first CTCP dequoted into "\n\t\big\020\001\000\\:" and then
|
||||
SED decoded getting back "Emacs wins" when using the same key.
|
||||
|
||||
- --- Example 3 -----------------------------------------------------------------
|
||||
|
||||
If the user actor wants to query the USERINFO of user victim, and is
|
||||
in the middle of a conversation, the client may decide to tack on
|
||||
USERINFO request on the end of a normal text message. Let's say actor
|
||||
wants to send the textmessage "Say hi to Ron\n\t/actor" and the CTCP
|
||||
request "USERINFO" to victim:
|
||||
|
||||
PRIVMSG victim :Say hi to Ron\n\t/actor
|
||||
|
||||
plus:
|
||||
|
||||
USERINFO
|
||||
|
||||
which after CTCP quoting become:
|
||||
|
||||
PRIVMSG victim :Say hi to Ron\n\t/actor
|
||||
|
||||
plus:
|
||||
|
||||
USERINFO
|
||||
|
||||
which gets merged into:
|
||||
|
||||
PRIVMSG victim :Say hi to Ron\n\t/actor\001USERINFO\001
|
||||
|
||||
and after low level quoting:
|
||||
|
||||
PRIVMSG victim :Say hi to Ron\020n\t/actor\001USERINFO\001
|
||||
|
||||
and sent off to the server.
|
||||
|
||||
On victim's side, the message:
|
||||
|
||||
:actor PRIVMSG victim :Say hi to Ron\020n\t/actor\001USERINFO\001
|
||||
|
||||
arrives. This gets low level dequoted into:
|
||||
|
||||
:actor PRIVMSG victim :Say hi to Ron\n\t/actor\001USERINFO\001
|
||||
|
||||
and thereafter split up into:
|
||||
|
||||
:actor PRIVMSG victim :Say hi to Ron\n\t/actor
|
||||
|
||||
plus:
|
||||
|
||||
USERINFO
|
||||
|
||||
After CTCP dequoting both, the message:
|
||||
|
||||
:actor PRIVMSG victim :Say hi to Ron\n\t/actor
|
||||
|
||||
gets displayed, while the CTCP command:
|
||||
|
||||
USERINFO
|
||||
|
||||
gets replied to. The reply might be:
|
||||
|
||||
USERINFO :CS student\n\001test\001
|
||||
|
||||
which gets CTCP quoted into:
|
||||
|
||||
USERINFO :CS student\n\\atest\\a
|
||||
|
||||
and sent in a NOTICE as it is a reply:
|
||||
|
||||
NOTICE actor :\001USERINFO :CS student\n\\atest\\a\001
|
||||
|
||||
and low level quoted into:
|
||||
|
||||
NOTICE actor :\001USERINFO :CS student\020n\\atest\\a\001
|
||||
|
||||
after which is it sent to victim's server.
|
||||
|
||||
When arriving on actor's side, the message:
|
||||
|
||||
:victim NOTICE actor :\001USERINFO :CS student\020n\\atest\\a\001
|
||||
|
||||
gets low level dequoted into:
|
||||
|
||||
:victim NOTICE actor :\001USERINFO :CS student\n\\atest\\a\001
|
||||
|
||||
At this point, all CTCP replies get extracted, giving 1 CTCP reply and
|
||||
no normal NOTICE:
|
||||
|
||||
USERINFO :CS student\n\\atest\\a
|
||||
|
||||
The remaining reply gets CTCP dequoted into:
|
||||
|
||||
USERINFO :CS student\n\001test\001
|
||||
|
||||
and presumly displayed to user actor.
|
||||
|
||||
*******************
|
||||
KNOWN EXTENDED DATA
|
||||
*******************
|
||||
|
||||
Extended data passed between clients can be used to pass structured
|
||||
information between them. Currently known extended data types are:
|
||||
|
||||
ACTION - Used to simulate "role playing" on IRC.
|
||||
DCC - Negotiates file transfers and direct tcp chat
|
||||
connections between clients.
|
||||
SED - Used to send encrypted messages between clients.
|
||||
|
||||
ACTION
|
||||
======
|
||||
This is used by losers on IRC to simulate "role playing" games. An
|
||||
action message looks like the following:
|
||||
|
||||
\001ACTION barfs on the floor.\001
|
||||
|
||||
Clients that recieve such a message should format them to indicate the
|
||||
user who did this is performing an "action". For example, if the user
|
||||
"actor" sent the above message to the channel "#twilight_zone", other
|
||||
users clients might display the message as:
|
||||
|
||||
[ACTION] actor->#twilight_zone: barfs on the floor.
|
||||
|
||||
Presumably other users on the channel are suitably impressed.
|
||||
|
||||
DCC
|
||||
===
|
||||
DCC stands for something like "Direct Client Connection". CTCP DCC
|
||||
extended data messages are used to negotiate file transfers between
|
||||
clients and to negotiate chat connections over tcp connections between
|
||||
two clients, with no IRC server involved. Connections between clients
|
||||
involve protocols other than the usual IRC protocol. Due to this
|
||||
complexity, a full description of the DCC protocol is included
|
||||
separately at the end of this document in Appendix A.
|
||||
|
||||
SED
|
||||
===
|
||||
SED probably stands for something like "Simple Encryption D???". It is
|
||||
used by clients to exchange encrypted messages between clients. A
|
||||
message encoded by SED probably looks something like:
|
||||
|
||||
\001SED encrypted-text-goes-here\001
|
||||
|
||||
Clients which accept such messages should display them in decrypted
|
||||
form. It would be nice if someone documented this, and included the
|
||||
encryption scheme in an Appendix B.
|
||||
|
||||
*************************
|
||||
KNOWN REQUEST/REPLY PAIRS
|
||||
*************************
|
||||
|
||||
A request/reply pair is sent between the two clients in two phases.
|
||||
The first phase is to send the request. This is done with a "privmsg"
|
||||
command (either to a nick or to a channel -- it doesn't matter).
|
||||
|
||||
The second phase is to send a reply. This is done with a "notice"
|
||||
command.
|
||||
|
||||
The known request/reply pairs are for the following commands.
|
||||
|
||||
FINGER - Returns the user's full name, and idle time.
|
||||
VERSION - The version and type of the client.
|
||||
SOURCE - Where to obtain a copy of a client.
|
||||
USERINFO - A string set by the user (never the client coder)
|
||||
CLIENTINFO - Dynamic master index of what a client knows.
|
||||
ERRMSG - Used when an error needs to be replied with.
|
||||
PING - Used to measure the delay of the IRC network
|
||||
between clients.
|
||||
TIME - Gets the local date and time from other clients.
|
||||
|
||||
FINGER
|
||||
======
|
||||
This is used to get a user's real name, and perhaps also the idle time
|
||||
of the user (this usage has been obsoleted by enhancements to the IRC
|
||||
protocol. The request is in a "privmsg" and looks like
|
||||
|
||||
\001FINGER\001
|
||||
|
||||
while the reply is in a "notice" and looks like
|
||||
|
||||
\001FINGER :#\001
|
||||
|
||||
where the # denotes contains information about the users real name,
|
||||
login name at clientmachine and idle time and is of type X-N-AS.
|
||||
|
||||
VERSION
|
||||
=======
|
||||
This is used to get information about the name of the other client and
|
||||
the version of it. The request in a "privmsg" is simply
|
||||
|
||||
\001VERSION\001
|
||||
|
||||
and the reply
|
||||
|
||||
\001VERSION #:#:#\001
|
||||
|
||||
where the first # denotes the name of the client, the second # denotes
|
||||
the version of the client, the third # the enviroment the client is
|
||||
running in.
|
||||
|
||||
Using
|
||||
|
||||
X-N-CLN ::= '\000' .. '\071' | '\073' .. '\377'
|
||||
|
||||
the client name is a string of type X-N-CLN saying things like "Kiwi"
|
||||
or "ircII", the version saying things like "5.2" or "2.1.5c", the
|
||||
enviroment saying things like "GNU Emacs 18.57.19 under SunOS 4.1.1 on
|
||||
Sun SLC" or "Compiled with gcc -ansi under Ultrix 4.0 on VAX-11/730".
|
||||
|
||||
|
||||
SOURCE
|
||||
|
||||
This is used to get information about where to get a copy of the
|
||||
client. The request in a "privmsg" is simply
|
||||
|
||||
\001SOURCE\001
|
||||
|
||||
and the reply is zero or more CTCP replies of the form
|
||||
|
||||
\001SOURCE #:#:#\001
|
||||
|
||||
followed by an end marker
|
||||
|
||||
\001SOURCE\001
|
||||
|
||||
where the first # is the name of an Internet host where the client can
|
||||
be gotten from with anonymous FTP the second # a directory names, and
|
||||
the third # a space separated list of files to be gotten from that
|
||||
directory.
|
||||
|
||||
Using
|
||||
|
||||
X-N-SPC ::= '\000' .. '\037' | '\041' .. '\377'
|
||||
|
||||
the name of the FTP site is to be given by name like "cs.bu.edu" or
|
||||
"funic.funet.fi".
|
||||
|
||||
The file name field is a directory specification optionally followed
|
||||
by one or more file names, delimited by spaces. If only a directory
|
||||
name is given, all files in that directory should be copied when
|
||||
retrieving the clients source. If some files are given, only those
|
||||
files in that directpry should be copied. Note that the spcification
|
||||
allows for all characters but space in the names, this includes
|
||||
allowing :. Examples are "pub/emacs/irc/" to get all files in
|
||||
directory pub/emacs/irc/, the client should be able to first login as
|
||||
user "ftp" and the give the command "CD pub/emacs/irc/", followed by
|
||||
the command "mget *". (It of course has to take care of binary and
|
||||
prompt mode too). Another example is "/pub/irc Kiwi.5.2.el.Z" in which
|
||||
case a "CD /pub/irc" and "get Kiwi.5.2.el.Z" is what should be done.
|
||||
|
||||
|
||||
USERINFO
|
||||
========
|
||||
This is used to transmit a string which is settable by the user (and
|
||||
never should be set by the client). The query is simply
|
||||
|
||||
\001USERINFO\001
|
||||
|
||||
with the reply
|
||||
|
||||
\001USERINFO :#\001
|
||||
|
||||
where the # is the value of the string the client's user has set.
|
||||
|
||||
CLIENTINFO
|
||||
==========
|
||||
This is for client developers use to make it easier to show other
|
||||
client hackers what a certain client knows when it comes to CTCP. The
|
||||
replies should be fairly verbose explaining what CTCP commands are
|
||||
understood, what arguments are expected of what type, and what replies
|
||||
might be expected from the client.
|
||||
|
||||
The query is the word CLIENTINFO in a "privmsg" optionally followed by
|
||||
a colon and one or more specifying words delimited by spaces, where
|
||||
the word CLIENTINFO by itself,
|
||||
|
||||
\001CLIENTINFO\001
|
||||
|
||||
should be replied to by giving a list of known tags (see above in
|
||||
section TAGGED DATA). This is only intended to be read by humans.
|
||||
|
||||
With one argument, the reply should be a description of how to use
|
||||
that tag. With two arguments, a description of how to use that
|
||||
tag's subcommand. And so on.
|
||||
|
||||
ERRMSG
|
||||
======
|
||||
This is used as a reply whenever an unknown query is seen. Also, when
|
||||
used as a query, the reply should echo back the text in the query,
|
||||
together with an indication that no error has happened. Should the
|
||||
query form be used, it is
|
||||
|
||||
\001ERRMSG #\001
|
||||
|
||||
where # is a string containing any character, with the reply
|
||||
|
||||
\001ERRMSG # :#\001
|
||||
|
||||
where the first # is the same string as in the query and the second #
|
||||
a short text notifying the user that no error has occurred.
|
||||
|
||||
A normal ERRMSG reply which is sent when a corrupted query or some
|
||||
corrupted extended data is received, looks like
|
||||
|
||||
\001ERRMSG # :#\001
|
||||
|
||||
where the first # is the the failed query or corrupted extended data
|
||||
and the second # a text explaining what the problem is, like "unknown
|
||||
query" or "failed decrypting text".
|
||||
|
||||
PING
|
||||
====
|
||||
Ping is used to measure the time delay between clients on the IRC
|
||||
network. A ping query is encoded in a privmsg, and has the form:
|
||||
|
||||
\001PING timestamp\001
|
||||
|
||||
where `timestamp' is the current time encoded in any form the querying
|
||||
client finds convienent. The replying client sends back an identical
|
||||
message inside a notice:
|
||||
|
||||
\001PING timestamp\001
|
||||
|
||||
The querying client can then subtract the recieved timestamp from the
|
||||
current time to obtain the delay between clients over the IRC network.
|
||||
|
||||
TIME
|
||||
====
|
||||
Time queries are used to determine what time it is where another
|
||||
user's client is running. This can be useful to determine if someone
|
||||
is probably awake or not, or what timezone they are in. A time query
|
||||
has the form:
|
||||
|
||||
\001TIME\001
|
||||
|
||||
On reciept of such a query in a privmsg, clients should reply with a
|
||||
notice of the form:
|
||||
|
||||
\001TIME :human-readable-time-string\001
|
||||
|
||||
For example:
|
||||
|
||||
\001TIME :Thu Aug 11 22:52:51 1994 CST\001
|
||||
|
||||
********
|
||||
EXAMPLES
|
||||
********
|
||||
|
||||
|
||||
Sending
|
||||
|
||||
PRIVMSG victim :\001FINGER\001
|
||||
|
||||
might return
|
||||
|
||||
:victim NOTICE actor :\001FINGER :Please check my USERINFO
|
||||
instead :Klaus Zeuge (sojge@mizar) 1 second has passed since
|
||||
victim gave a command last.\001
|
||||
|
||||
(this is only one line) or why not
|
||||
|
||||
:victim NOTICE actor :\001FINGER :Please check my USERINFO
|
||||
instead :Klaus Zeuge (sojge@mizar) 427 seconds (7 minutes and
|
||||
7 seconds) have passed since victim gave a command last.\001
|
||||
|
||||
if Klaus Zeuge happens to be lazy? :-)
|
||||
|
||||
Sending
|
||||
|
||||
PRIVMSG victim :\001CLIENTINFO\001
|
||||
|
||||
might return
|
||||
|
||||
:victim NOTICE actor :\001CLIENTINFO :You can request help of the
|
||||
commands CLIENTINFO ERRMSG FINGER USERINFO VERSION by giving
|
||||
an argument to CLIENTINFO.\001
|
||||
|
||||
Sending
|
||||
|
||||
PRIVMSG victim :\001CLIENTINFO CLIENTINFO\001
|
||||
|
||||
might return
|
||||
|
||||
:victim NOTICE actor :\001CLIENTINFO :CLIENTINFO with 0
|
||||
arguments gives a list of known client query keywords. With 1
|
||||
argument, a description of the client query keyword is
|
||||
returned.\001
|
||||
|
||||
while sending
|
||||
|
||||
PRIVMSG victim :\001clientinfo clientinfo\001
|
||||
|
||||
probably will return something like
|
||||
|
||||
:victim NOTICE actor :\001ERRMSG clientinfo clientinfo :Query is
|
||||
unknown\001
|
||||
|
||||
as tag "clientinfo" isn't known.
|
||||
|
||||
Sending
|
||||
|
||||
PRIVMSG victim :\001CLIENTINFO ERRMSG\001
|
||||
|
||||
might return
|
||||
|
||||
:victim NOTICE actor :\001CLIENTINFO :ERRMSG is the given answer
|
||||
on seeing an unknown keyword. When seeing the keyword ERRMSG,
|
||||
it works like an echo.\001
|
||||
|
||||
Sending
|
||||
|
||||
PRIVMSG victim :\001USERINFO\001
|
||||
|
||||
might return the somewhat pathetically long
|
||||
|
||||
:victim NOTICE actor :\001USERINFO :I'm studying computer
|
||||
science in Uppsala, I'm male (somehow, that seems to be an
|
||||
important matter on IRC:-) and I speak fluent swedish, decent
|
||||
german, and some english.\001
|
||||
|
||||
Sending
|
||||
|
||||
PRIVMSG victim :\001VERSION\001
|
||||
|
||||
might return:
|
||||
|
||||
:victim NOTICE actor :\001VERSION Kiwi:5.2:GNU Emacs
|
||||
18.57.19 under SunOS 4.1.1 on Sun
|
||||
SLC:FTP.Lysator.LiU.SE:/pub/emacs Kiwi-5.2.el.Z
|
||||
Kiwi.README\001
|
||||
|
||||
if the client is named Kiwi of version 5.2 and is used under GNU Emacs
|
||||
18.57.19 running on a Sun SLCwith SunOS 4.1.1. The client claims a
|
||||
copy of it can be found with anonymous FTP on FTP.Lysator.LiU.SE after
|
||||
giving the FTP command "cd /pub/emacs/". There, one should get files
|
||||
Kiwi-5.2.el.Z and Kiwi.README; presumably one of the files tells how to
|
||||
proceed with building the client after having gotten the files.
|
||||
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
|
||||
**********************************************************************
|
||||
Appendix A -- A description of the DCC protocol
|
||||
**********************************************************************
|
||||
|
||||
By Troy Rollo (troy@plod.cbme.unsw.oz.au)
|
||||
Revised by Ben Mesander (ben@gnu.ai.mit.edu)
|
||||
|
||||
Troy Rollo, the original implementor of the DCC protocol, said
|
||||
that the DCC protocol was never designed to be portable to clients
|
||||
other than IRCII. However, time has shown that DCC is useable in
|
||||
environments other than IRCII. IRC clients in diverse languages, such
|
||||
as ksh, elisp, C, and perl have all had DCC implementations.
|
||||
|
||||
Why DCC?
|
||||
========
|
||||
|
||||
DCC allows the user to overcome some limitations of the IRC
|
||||
server network and to have a somewhat more secure chat connection
|
||||
while still in an IRC-oriented protocol.
|
||||
|
||||
DCC uses direct TCP connections between the clients taking
|
||||
part to carry data. There is no flood control, so packets can be sent
|
||||
at full speed, and there is no dependance on server links (or load
|
||||
imposed on them). In addition, since only the initial handshake for
|
||||
DCC conections is passed through the IRC network, it makes it harder
|
||||
for operators with cracked servers to spy on personal messages.
|
||||
|
||||
How?
|
||||
====
|
||||
|
||||
The initial socket for a DCC connection is created
|
||||
by the side that initiates (Offers) the connection. This socket
|
||||
should be a TCP socket bound to INADDR_ANY, listening for
|
||||
connections.
|
||||
|
||||
The Initiating client, on creating the socket, should
|
||||
send its details to the target client using the CTCP command
|
||||
DCC. This command takes the form:
|
||||
|
||||
DCC type argument address port [size]
|
||||
|
||||
type - The connection type.
|
||||
argument - The connectin type dependant argument.
|
||||
address - The host address of the initiator as an integer.
|
||||
port - The port or the socket on which the initiator expects
|
||||
to receive the connection.
|
||||
size - If the connection type is "SEND" (see below), then size
|
||||
will indicate the size of the file being offered. Obsolete
|
||||
IRCII clients do not send this, so be prepared if this is
|
||||
not present.
|
||||
|
||||
The address, port, and size should be sent as ASCII representations of
|
||||
the decimal integer formed by converting the values to host byte order
|
||||
and treating them as an unsigned long, unsigned short, and unsigned
|
||||
long respectively.
|
||||
|
||||
Implementations of the DCC protocol should be prepared to
|
||||
accept further arguments in a CTCP DCC message. There has been some
|
||||
discussion of adding another argument that would specify the type of
|
||||
file being transferred - text, binary, and perhaps others if DCC is
|
||||
implemented on operating systems other than UNIX. If additional
|
||||
arguments are added to the protocol, they should have semantics such
|
||||
that clients which ignore them will interoperate with clients that
|
||||
don't in a sensible way.
|
||||
|
||||
The following DCC connection types are defined:
|
||||
|
||||
Type Purpose Argument
|
||||
CHAT To carry on a semi-secure conversation the string "chat"
|
||||
SEND To send a file to the recipient the file name
|
||||
|
||||
Although the following subcommand is included in the IRCII DCC command,
|
||||
it does _not_ transmit a DCC request via IRC, and thus is not
|
||||
discussed in this document:
|
||||
|
||||
TALK Establishes a TALK connection
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
The CHAT and SEND connection types should not be
|
||||
accepted automatically as this would create the potential for
|
||||
terrorism. Instead, they should notify the user that an
|
||||
offer has been made, and allow the user to accept it.
|
||||
|
||||
The recipient should have the opportunity to rename a file
|
||||
offered with the DCC SEND command prior to retrieving it. It is also
|
||||
desirable to ensure that the offered file will not overwrite an
|
||||
existing file.
|
||||
|
||||
Older IRCII clients send the entire pathname of the file being
|
||||
transmitted. This is annoying, and newer clients should simply send
|
||||
the filename portion of the file being transmitted.
|
||||
|
||||
The port number should be scrutinized - if the port number is
|
||||
in the UNIX reserved port range, the connection should only be
|
||||
accepted with caution.
|
||||
|
||||
If it is not possible in the client implementation language to
|
||||
handle a 32-bit integer (for instance emacs 18 elisp and ksh 88), then
|
||||
it is often possible to use the hostname in the originating PRIVMSG.
|
||||
|
||||
The following are the steps which should occur in the clients
|
||||
(this description assumes use of the BSD socket interface on a UNIX
|
||||
system).
|
||||
|
||||
Initiator:
|
||||
DCC command issued.
|
||||
Create a socket, bind it to INADDR_ANY, port 0, and
|
||||
make it passive (a listening socket).
|
||||
Send the recipient a DCC request via CTCP supplying
|
||||
the address and port of the socket. (This
|
||||
is ideally taken from the address of the local
|
||||
side of the socket which is connected to a
|
||||
server. This is presumably the interface on
|
||||
the host which is closest to the rest of
|
||||
the net, and results in one less routing hop
|
||||
in the case of gateway nodes).
|
||||
Continue normally until a connection is received.
|
||||
|
||||
On a connection:
|
||||
Accept the connection.
|
||||
Close the original passive socket.
|
||||
Conduct transaction on the new socket.
|
||||
|
||||
Acceptor:
|
||||
CTCP DCC request received.
|
||||
Record information on the DCC request and notify the user.
|
||||
|
||||
At this point, the USER should be able to abort (close) the
|
||||
request, or accept it. The request should be accepted with
|
||||
a command specifying the sender, type, and argument, or
|
||||
a subset of these where no ambiguity exists.
|
||||
|
||||
If accepted, create a TCP socket.
|
||||
Connect the new socket to the address and port supplied.
|
||||
Conduct the transaction over the socket.
|
||||
|
||||
|
||||
Type specific details.
|
||||
======================
|
||||
|
||||
CHAT Data sent across a CHAT connection should be sent line-by-line
|
||||
without any prefixes or commands. A CHAT connection ends when
|
||||
one party issues the DCC CLOSE command to their clients, which
|
||||
causes the socket to be closed and the information on the connection
|
||||
to be discarded. The terminating character of each line is a
|
||||
newline character, '\n'.
|
||||
|
||||
FILE Data is sent in packets, rather than dumped in a stream manner.
|
||||
This allows the DCC SEND connection to survive where an FTP
|
||||
connection might fail. The size of the packets is up to the
|
||||
client, and may be set by the user. Smaller packets result
|
||||
in a higher probability of survival over bad links.
|
||||
The recipient should acknowledge each packet by transmitting
|
||||
the total number of bytes received as an unsigned, 4 byte
|
||||
integer in network byte order. The sender should not continue
|
||||
to transmit until the recipient has acknowledged all data
|
||||
already transmitted. Additionally, the sender should not
|
||||
close the connection until the last byte has been
|
||||
acknowledged by the recipient.
|
||||
|
||||
Older IRCII clients do not send the file size of the file
|
||||
being transmitted via DCC. For those clients, note that it is
|
||||
not possible for the recipient to tell if the entire file has
|
||||
been received - only the sender has that information, although
|
||||
IRCII does not report it. Users generally verify the transfer
|
||||
by checking file sizes. Authors of clients are urged to use
|
||||
the size feature.
|
||||
|
||||
Note also that no provision is made for text translation.
|
||||
|
||||
The original block size used by IRCII was 1024. Other clients
|
||||
have adopted this. Note, however, that an implementation should accept
|
||||
any blocksize. IRCII currently allows a user-settable blocksize.
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,455 @@
|
|||
RFC 2810 (RFC2810)
|
||||
|
||||
Internet RFC/STD/FYI/BCP Archives
|
||||
|
||||
[ RFC Index | RFC Search | Usenet FAQs | Web FAQs | Documents | Cities ]
|
||||
|
||||
Alternate Formats: rfc2810.txt | rfc2810.txt.pdf
|
||||
|
||||
RFC 2810 - Internet Relay Chat: Architecture
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
|
||||
Network Working Group C. Kalt
|
||||
Request for Comments: 2810 April 2000
|
||||
Updates: 1459
|
||||
Category: Informational
|
||||
|
||||
Internet Relay Chat: Architecture
|
||||
|
||||
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
|
||||
|
||||
The IRC (Internet Relay Chat) protocol is for use with text based
|
||||
conferencing. It has been developed since 1989 when it was originally
|
||||
implemented as a mean for users on a BBS to chat amongst themselves.
|
||||
|
||||
First formally documented in May 1993 by RFC 1459 [IRC], the protocol
|
||||
has kept evolving. This document is an update describing the
|
||||
architecture of the current IRC protocol and the role of its
|
||||
different components. Other documents describe in detail the
|
||||
protocol used between the various components defined here.
|
||||
|
||||
Table of Contents
|
||||
|
||||
1. Introduction ............................................... 2
|
||||
2. Components ................................................. 2
|
||||
2.1 Servers ................................................ 2
|
||||
2.2 Clients ................................................ 3
|
||||
2.2.1 User Clients ...................................... 3
|
||||
2.2.2 Service Clients ................................... 3
|
||||
3. Architecture ............................................... 3
|
||||
4. IRC Protocol Services ...................................... 4
|
||||
4.1 Client Locator ......................................... 4
|
||||
4.2 Message Relaying ....................................... 4
|
||||
4.3 Channel Hosting And Management ......................... 4
|
||||
5. IRC Concepts ............................................... 4
|
||||
5.1 One-To-One Communication ............................... 5
|
||||
5.2 One-To-Many ............................................ 5
|
||||
5.2.1 To A Channel ...................................... 5
|
||||
5.2.2 To A Host/Server Mask ............................. 6
|
||||
|
||||
5.2.3 To A List ......................................... 6
|
||||
5.3 One-To-All ............................................. 6
|
||||
5.3.1 Client-to-Client .................................. 6
|
||||
5.3.2 Client-to-Server .................................. 7
|
||||
5.3.3 Server-to-Server .................................. 7
|
||||
6. Current Problems ........................................... 7
|
||||
6.1 Scalability ............................................ 7
|
||||
6.2 Reliability ............................................ 7
|
||||
6.3 Network Congestion ..................................... 7
|
||||
6.4 Privacy ................................................ 8
|
||||
7. Security Considerations .................................... 8
|
||||
8. Current Support And Availability ........................... 8
|
||||
9. Acknowledgements ........................................... 8
|
||||
10. References ................................................ 8
|
||||
11. Author's Address .......................................... 9
|
||||
12. Full Copyright Statement .................................. 10
|
||||
|
||||
1. Introduction
|
||||
|
||||
The IRC (Internet Relay Chat) protocol has been designed over a
|
||||
number of years for use with text based conferencing. This document
|
||||
describes its current architecture.
|
||||
|
||||
The IRC Protocol is based on the client-server model, and is well
|
||||
suited to running on many machines in a distributed fashion. A
|
||||
typical setup involves a single process (the server) forming a
|
||||
central point for clients (or other servers) to connect to,
|
||||
performing the required message delivery/multiplexing and other
|
||||
functions.
|
||||
|
||||
This distributed model, which requires each server to have a copy
|
||||
of the global state information, is still the most flagrant problem
|
||||
of the protocol as it is a serious handicap, which limits the maximum
|
||||
size a network can reach. If the existing networks have been able to
|
||||
keep growing at an incredible pace, we must thank hardware
|
||||
manufacturers for giving us ever more powerful systems.
|
||||
|
||||
2. Components
|
||||
|
||||
The following paragraphs define the basic components of the IRC
|
||||
protocol.
|
||||
|
||||
2.1 Servers
|
||||
|
||||
The server forms the backbone of IRC as it is the only component
|
||||
of the protocol which is able to link all the other components
|
||||
together: it provides a point to which clients may connect to talk to
|
||||
|
||||
each other [IRC-CLIENT], and a point for other servers to connect to
|
||||
[IRC-SERVER]. The server is also responsible for providing the basic
|
||||
services defined by the IRC protocol.
|
||||
|
||||
2.2 Clients
|
||||
|
||||
A client is anything connecting to a server that is not another
|
||||
server. There are two types of clients which both serve a different
|
||||
purpose.
|
||||
|
||||
2.2.1 User Clients
|
||||
|
||||
User clients are generally programs providing a text based
|
||||
interface that is used to communicate interactively via IRC. This
|
||||
particular type of clients is often referred as "users".
|
||||
|
||||
2.2.2 Service Clients
|
||||
|
||||
Unlike users, service clients are not intended to be used manually
|
||||
nor for talking. They have a more limited access to the chat
|
||||
functions of the protocol, while optionally having access to more
|
||||
private data from the servers.
|
||||
|
||||
Services are typically automatons used to provide some kind of
|
||||
service (not necessarily related to IRC itself) to users. An example
|
||||
is a service collecting statistics about the origin of users
|
||||
connected on the IRC network.
|
||||
|
||||
3. Architecture
|
||||
|
||||
An IRC network is defined by a group of servers connected to each
|
||||
other. A single server forms the simplest IRC network.
|
||||
|
||||
The only network configuration allowed for IRC servers is that of
|
||||
a spanning tree where each server acts as a central node for the rest
|
||||
of the network it sees.
|
||||
|
||||
1--\
|
||||
A D---4
|
||||
2--/ \ /
|
||||
B----C
|
||||
/ \
|
||||
3 E
|
||||
|
||||
Servers: A, B, C, D, E Clients: 1, 2, 3, 4
|
||||
|
||||
[ Fig. 1. Sample small IRC network ]
|
||||
|
||||
The IRC protocol provides no mean for two clients to directly
|
||||
communicate. All communication between clients is relayed by the
|
||||
server(s).
|
||||
|
||||
4. IRC Protocol Services
|
||||
|
||||
This section describes the services offered by the IRC protocol. The
|
||||
combination of these services allow real-time conferencing.
|
||||
|
||||
4.1 Client Locator
|
||||
|
||||
To be able to exchange messages, two clients must be able to locate
|
||||
each other.
|
||||
|
||||
Upon connecting to a server, a client registers using a label which
|
||||
is then used by other servers and clients to know where the client is
|
||||
located. Servers are responsible for keeping track of all the labels
|
||||
being used.
|
||||
|
||||
4.2 Message Relaying
|
||||
|
||||
The IRC protocol provides no mean for two clients to directly
|
||||
communicate. All communication between clients is relayed by the
|
||||
server(s).
|
||||
|
||||
4.3 Channel Hosting And Management
|
||||
|
||||
A channel is a named group of one or more users which will all
|
||||
receive messages addressed to that channel. A channel is
|
||||
characterized by its name and current members, it also has a set of
|
||||
properties which can be manipulated by (some of) its members.
|
||||
|
||||
Channels provide a mean for a message to be sent to several clients.
|
||||
Servers host channels, providing the necessary message multiplexing.
|
||||
Servers are also responsible for managing channels by keeping track
|
||||
of the channel members. The exact role of servers is defined in
|
||||
"Internet Relay Chat: Channel Management" [IRC-CHAN].
|
||||
|
||||
5. IRC Concepts
|
||||
|
||||
This section is devoted to describing the actual concepts behind the
|
||||
organization of the IRC protocol and how different classes of
|
||||
messages are delivered.
|
||||
|
||||
5.1 One-To-One Communication
|
||||
|
||||
Communication on a one-to-one basis is usually performed by clients,
|
||||
since most server-server traffic is not a result of servers talking
|
||||
only to each other. To provide a means for clients to talk to each
|
||||
other, it is REQUIRED that all servers be able to send a message in
|
||||
exactly one direction along the spanning tree in order to reach any
|
||||
client. Thus the path of a message being delivered is the shortest
|
||||
path between any two points on the spanning tree.
|
||||
|
||||
The following examples all refer to Figure 1 above.
|
||||
|
||||
Example 1: A message between clients 1 and 2 is only seen by server
|
||||
A, which sends it straight to client 2.
|
||||
|
||||
Example 2: A message between clients 1 and 3 is seen by servers A &
|
||||
B, and client 3. No other clients or servers are allowed see the
|
||||
message.
|
||||
|
||||
Example 3: A message between clients 2 and 4 is seen by servers A, B,
|
||||
C & D and client 4 only.
|
||||
|
||||
5.2 One-To-Many
|
||||
|
||||
The main goal of IRC is to provide a forum which allows easy and
|
||||
efficient conferencing (one to many conversations). IRC offers
|
||||
several means to achieve this, each serving its own purpose.
|
||||
|
||||
5.2.1 To A Channel
|
||||
|
||||
In IRC the channel has a role equivalent to that of the multicast
|
||||
group; their existence is dynamic and the actual conversation carried
|
||||
out on a channel MUST only be sent to servers which are supporting
|
||||
users on a given channel. Moreover, the message SHALL only be sent
|
||||
once to every local link as each server is responsible to fan the
|
||||
original message to ensure that it will reach all the recipients.
|
||||
|
||||
The following examples all refer to Figure 2.
|
||||
|
||||
Example 4: Any channel with 1 client in it. Messages to the channel
|
||||
go to the server and then nowhere else.
|
||||
|
||||
Example 5: 2 clients in a channel. All messages traverse a path as if
|
||||
they were private messages between the two clients outside a
|
||||
channel.
|
||||
|
||||
Example 6: Clients 1, 2 and 3 in a channel. All messages to the
|
||||
channel are sent to all clients and only those servers which must
|
||||
be traversed by the message if it were a private message to a
|
||||
single client. If client 1 sends a message, it goes back to
|
||||
client 2 and then via server B to client 3.
|
||||
|
||||
5.2.2 To A Host/Server Mask
|
||||
|
||||
To provide with some mechanism to send messages to a large body of
|
||||
related users, host and server mask messages are available. These
|
||||
messages are sent to users whose host or server information match
|
||||
that of the mask. The messages are only sent to locations where
|
||||
users are, in a fashion similar to that of channels.
|
||||
|
||||
5.2.3 To A List
|
||||
|
||||
The least efficient style of one-to-many conversation is through
|
||||
clients talking to a 'list' of targets (client, channel, mask). How
|
||||
this is done is almost self explanatory: the client gives a list of
|
||||
destinations to which the message is to be delivered and the server
|
||||
breaks it up and dispatches a separate copy of the message to each
|
||||
given destination.
|
||||
|
||||
This is not as efficient as using a channel since the destination
|
||||
list MAY be broken up and the dispatch sent without checking to make
|
||||
sure duplicates aren't sent down each path.
|
||||
|
||||
5.3 One-To-All
|
||||
|
||||
The one-to-all type of message is better described as a broadcast
|
||||
message, sent to all clients or servers or both. On a large network
|
||||
of users and servers, a single message can result in a lot of traffic
|
||||
being sent over the network in an effort to reach all of the desired
|
||||
destinations.
|
||||
|
||||
For some class of messages, there is no option but to broadcast it to
|
||||
all servers so that the state information held by each server is
|
||||
consistent between servers.
|
||||
|
||||
5.3.1 Client-to-Client
|
||||
|
||||
There is no class of message which, from a single message, results in
|
||||
a message being sent to every other client.
|
||||
|
||||
5.3.2 Client-to-Server
|
||||
|
||||
Most of the commands which result in a change of state information
|
||||
(such as channel membership, channel mode, user status, etc.) MUST be
|
||||
sent to all servers by default, and this distribution SHALL NOT be
|
||||
changed by the client.
|
||||
|
||||
5.3.3 Server-to-Server
|
||||
|
||||
While most messages between servers are distributed to all 'other'
|
||||
servers, this is only required for any message that affects a user,
|
||||
channel or server. Since these are the basic items found in IRC,
|
||||
nearly all messages originating from a server are broadcast to all
|
||||
other connected servers.
|
||||
|
||||
6. Current Problems
|
||||
|
||||
There are a number of recognized problems with this protocol, this
|
||||
section only addresses the problems related to the architecture of
|
||||
the protocol.
|
||||
|
||||
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,
|
||||
clients and channels and that information regarding them be updated
|
||||
as soon as it changes.
|
||||
|
||||
6.2 Reliability
|
||||
|
||||
As the only network configuration allowed for IRC servers is that of
|
||||
a spanning tree, each link between two servers is an obvious and
|
||||
quite serious point of failure. This particular issue is addressed
|
||||
more in detail in "Internet Relay Chat: Server Protocol" [IRC-
|
||||
SERVER].
|
||||
|
||||
6.3 Network Congestion
|
||||
|
||||
Another problem related to the scalability and reliability issues, as
|
||||
well as the spanning tree architecture, is that the protocol and
|
||||
architecture for IRC are extremely vulnerable to network congestions.
|
||||
This problem is endemic, and should be solved for the next
|
||||
generation: if congestion and high traffic volume cause a link
|
||||
between two servers to fail, not only this failure generates more
|
||||
network traffic, but the reconnection (eventually elsewhere) of two
|
||||
servers also generates more traffic.
|
||||
|
||||
In an attempt to minimize the impact of these problems, it is
|
||||
strongly RECOMMENDED that servers do not automatically try to
|
||||
reconnect too fast, in order to avoid aggravating the situation.
|
||||
|
||||
6.4 Privacy
|
||||
|
||||
Besides not scaling well, the fact that servers need to know all
|
||||
information about other entities, the issue of privacy is also a
|
||||
concern. This is in particular true for channels, as the related
|
||||
information is quite a lot more revealing than whether a user is
|
||||
online or not.
|
||||
|
||||
7. Security Considerations
|
||||
|
||||
Asides from the privacy concerns mentioned in section 6.4 (Privacy),
|
||||
security is believed to be irrelevant to this document.
|
||||
|
||||
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.
|
||||
|
||||
[IRC] Oikarinen, J. and D. Reed, "Internet Relay Chat
|
||||
Protocol", RFC 1459, May 1993.
|
||||
|
||||
[IRC-CLIENT] Kalt, C., "Internet Relay Chat: Client Protocol", RFC
|
||||
2812, April 2000.
|
||||
|
||||
[IRC-SERVER] Kalt, C., "Internet Relay Chat: Server Protocol", RFC
|
||||
2813, April 2000.
|
||||
|
||||
[IRC-CHAN] Kalt, C., "Internet Relay Chat: Channel Management", RFC
|
||||
2811, April 2000.
|
||||
|
||||
11. Author's Address
|
||||
|
||||
Christophe Kalt
|
||||
99 Teaneck Rd, Apt #117
|
||||
Ridgefield Park, NJ 07660
|
||||
USA
|
||||
|
||||
EMail: kalt@stealth.net
|
||||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
|
||||
Comments about this RFC:
|
||||
|
||||
* RFC 2810: Hi, Here goes the text in section 5.2.1 : "The following
|
||||
examples all... by AkA (6/2/2007)
|
||||
|
||||
Previous: RFC 2809 - Implementation of Next: RFC 2811 - Internet Relay Chat:
|
||||
L2TP Compulsory Tunneling via RADIUS Channel Management
|
||||
|
||||
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
[ RFC Index | RFC Search | Usenet FAQs | Web FAQs | Documents | Cities ]
|
|
@ -0,0 +1,866 @@
|
|||
RFC 2811 (RFC2811)
|
||||
|
||||
Internet RFC/STD/FYI/BCP Archives
|
||||
|
||||
[ RFC Index | RFC Search | Usenet FAQs | Web FAQs | Documents | Cities ]
|
||||
|
||||
Alternate Formats: rfc2811.txt | rfc2811.txt.pdf
|
||||
|
||||
RFC 2811 - Internet Relay Chat: Channel Management
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
|
||||
Network Working Group C. Kalt
|
||||
Request for Comments: 2811 April 2000
|
||||
Updates: 1459
|
||||
Category: Informational
|
||||
|
||||
Internet Relay Chat: Channel Management
|
||||
|
||||
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
|
||||
|
||||
One of the most notable characteristics of the IRC (Internet Relay
|
||||
Chat) protocol is to allow for users to be grouped in forums, called
|
||||
channels, providing a mean for multiple users to communicate
|
||||
together.
|
||||
|
||||
There was originally a unique type of channels, but with the years,
|
||||
new types appeared either as a response to a need, or for
|
||||
experimental purposes.
|
||||
|
||||
This document specifies how channels, their characteristics and
|
||||
properties are managed by IRC servers.
|
||||
|
||||
Table of Contents
|
||||
|
||||
1. Introduction ............................................... 2
|
||||
2. Channel Characteristics .................................... 3
|
||||
2.1 Namespace .............................................. 3
|
||||
2.2 Channel Scope .......................................... 3
|
||||
2.3 Channel Properties ..................................... 4
|
||||
2.4 Privileged Channel Members ............................. 4
|
||||
2.4.1 Channel Operators ................................. 5
|
||||
2.4.2 Channel Creator ................................... 5
|
||||
3. Channel lifetime ........................................... 5
|
||||
3.1 Standard channels ...................................... 5
|
||||
3.2 Safe Channels .......................................... 6
|
||||
4. Channel Modes .............................................. 7
|
||||
4.1 Member Status .......................................... 7
|
||||
4.1.1 "Channel Creator" Status .......................... 7
|
||||
|
||||
4.1.2 Channel Operator Status ........................... 8
|
||||
4.1.3 Voice Privilege ................................... 8
|
||||
4.2 Channel Flags .......................................... 8
|
||||
4.2.1 Anonymous Flag .................................... 8
|
||||
4.2.2 Invite Only Flag .................................. 8
|
||||
4.2.3 Moderated Channel Flag ............................ 9
|
||||
4.2.4 No Messages To Channel From Clients On The Outside 9
|
||||
4.2.5 Quiet Channel ..................................... 9
|
||||
4.2.6 Private and Secret Channels ....................... 9
|
||||
4.2.7 Server Reop Flag .................................. 10
|
||||
4.2.8 Topic ............................................. 10
|
||||
4.2.9 User Limit ........................................ 10
|
||||
4.2.10 Channel Key ...................................... 10
|
||||
4.3 Channel Access Control ................................. 10
|
||||
4.3.1 Channel Ban and Exception ......................... 11
|
||||
4.3.2 Channel Invitation ................................ 11
|
||||
5. Current Implementations .................................... 11
|
||||
5.1 Tracking Recently Used Channels ........................ 11
|
||||
5.2 Safe Channels .......................................... 12
|
||||
5.2.1 Channel Identifier ................................ 12
|
||||
5.2.2 Channel Delay ..................................... 12
|
||||
5.2.3 Abuse Window ...................................... 13
|
||||
5.2.4 Preserving Sanity In The Name Space ............... 13
|
||||
5.2.5 Server Reop Mechanism ............................. 13
|
||||
6. Current problems ........................................... 14
|
||||
6.1 Labels ................................................. 14
|
||||
6.1.1 Channel Delay ..................................... 14
|
||||
6.1.2 Safe Channels ..................................... 15
|
||||
6.2 Mode Propagation Delays ................................ 15
|
||||
6.3 Collisions And Channel Modes ........................... 15
|
||||
6.4 Resource Exhaustion .................................... 16
|
||||
7. Security Considerations .................................... 16
|
||||
7.1 Access Control ......................................... 16
|
||||
7.2 Channel Privacy ........................................ 16
|
||||
7.3 Anonymity ............................................... 17
|
||||
8. Current support and availability ........................... 17
|
||||
9. Acknowledgements ........................................... 17
|
||||
10. References ................................................ 18
|
||||
11. Author's Address .......................................... 18
|
||||
12. Full Copyright Statement ................................... 19
|
||||
|
||||
1. Introduction
|
||||
|
||||
This document defines in detail on how channels are managed by the
|
||||
IRC servers and will be mostly useful to people working on
|
||||
implementing an IRC server.
|
||||
|
||||
While the concepts defined here are an important part of IRC, they
|
||||
remain non essential for implementing clients. While the trend seems
|
||||
to be towards more and more complex and "intelligent" clients which
|
||||
are able to take advantage of knowing the internal workings of
|
||||
channels to provide the users with a more friendly interface, simple
|
||||
clients can be implemented without reading this document.
|
||||
|
||||
Many of the concepts defined here were designed with the IRC
|
||||
architecture [IRC-ARCH] in mind and mostly make sense in this
|
||||
context. However, many others could be applied to other
|
||||
architectures in order to provide forums for a conferencing system.
|
||||
|
||||
Finally, it is to be noted that IRC users may find some of the
|
||||
following sections of interest, in particular sections 2 (Channel
|
||||
Characteristics) and 4 (Channel Modes).
|
||||
|
||||
2. Channel Characteristics
|
||||
|
||||
A channel is a named group of one or more users which will all
|
||||
receive messages addressed to that channel. A channel is
|
||||
characterized by its name, properties and current members.
|
||||
|
||||
2.1 Namespace
|
||||
|
||||
Channels names are strings (beginning with a '&', '#', '+' or '!'
|
||||
character) of length up to fifty (50) characters. Channel names are
|
||||
case insensitive.
|
||||
|
||||
Apart from the the requirement that the first character being either
|
||||
'&', '#', '+' or '!' (hereafter called "channel prefix"). The only
|
||||
restriction on a channel name is that it SHALL NOT contain any spaces
|
||||
(' '), a control G (^G or ASCII 7), a comma (',' which is used as a
|
||||
list item separator by the protocol). Also, a colon (':') is used as
|
||||
a delimiter for the channel mask. The exact syntax of a channel name
|
||||
is defined in "IRC Server Protocol" [IRC-SERVER].
|
||||
|
||||
The use of different prefixes effectively creates four (4) distinct
|
||||
namespaces for channel names. This is important because of the
|
||||
protocol limitations regarding namespaces (in general). See section
|
||||
6.1 (Labels) for more details on these limitations.
|
||||
|
||||
2.2 Channel Scope
|
||||
|
||||
A channel entity is known by one or more servers on the IRC network.
|
||||
A user can only become member of a channel known by the server to
|
||||
which the user is directly connected. The list of servers which know
|
||||
|
||||
of the existence of a particular channel MUST be a contiguous part of
|
||||
the IRC network, in order for the messages addressed to the channel
|
||||
to be sent to all the channel members.
|
||||
|
||||
Channels with '&' as prefix are local to the server where they are
|
||||
created.
|
||||
|
||||
Other channels are known to one (1) or more servers that are
|
||||
connected to the network, depending on the channel mask:
|
||||
|
||||
If there is no channel mask, then the channel is known to all
|
||||
the servers.
|
||||
|
||||
If there is a channel mask, then the channel MUST only be known
|
||||
to servers which has a local user on the channel, and to its
|
||||
neighbours if the mask matches both the local and neighbouring
|
||||
server names. Since other servers have absolutely no knowledge of
|
||||
the existence of such a channel, the area formed by the servers
|
||||
having a name matching the mask has to be contiguous for the
|
||||
channel to be known by all these servers. Channel masks are best
|
||||
used in conjunction with server hostmasking [IRC-SERVER].
|
||||
|
||||
2.3 Channel Properties
|
||||
|
||||
Each channel has its own properties, which are defined by channel
|
||||
modes. Channel modes can be manipulated by the channel members. The
|
||||
modes affect the way servers manage the channels.
|
||||
|
||||
Channels with '+' as prefix do not support channel modes. This means
|
||||
that all the modes are unset, with the exception of the 't' channel
|
||||
flag which is set.
|
||||
|
||||
2.4 Privileged Channel Members
|
||||
|
||||
In order for the channel members to keep some control over a channel,
|
||||
and some kind of sanity, some channel members are privileged. Only
|
||||
these members are allowed to perform the following actions on the
|
||||
channel:
|
||||
|
||||
INVITE - Invite a client to an invite-only channel (mode +i)
|
||||
KICK - Eject a client from the channel
|
||||
MODE - Change the channel's mode, as well as
|
||||
members' privileges
|
||||
PRIVMSG - Sending messages to the channel (mode +n, +m, +v)
|
||||
TOPIC - Change the channel topic in a mode +t channel
|
||||
|
||||
2.4.1 Channel Operators
|
||||
|
||||
The channel operators (also referred to as a "chop" or "chanop") on a
|
||||
given channel are considered to 'own' that channel. Ownership of a
|
||||
channel is shared among channel operators.
|
||||
|
||||
Channel operators are identified by the '@' symbol next to their
|
||||
nickname whenever it is associated with a channel (i.e., replies to
|
||||
the NAMES, WHO and WHOIS commands).
|
||||
|
||||
Since channels starting with the character '+' as prefix do not
|
||||
support channel modes, no member can therefore have the status of
|
||||
channel operator.
|
||||
|
||||
2.4.2 Channel Creator
|
||||
|
||||
A user who creates a channel with the character '!' as prefix is
|
||||
identified as the "channel creator". Upon creation of the channel,
|
||||
this user is also given channel operator status.
|
||||
|
||||
In recognition of this status, the channel creators are endowed with
|
||||
the ability to toggle certain modes of the channel which channel
|
||||
operators may not manipulate.
|
||||
|
||||
A "channel creator" can be distinguished from a channel operator by
|
||||
issuing the proper MODE command. See the "IRC Client Protocol"
|
||||
[IRC-CLIENT] for more information on this topic.
|
||||
|
||||
3. Channel lifetime
|
||||
|
||||
In regard to the lifetime of a channel, there are typically two
|
||||
groups of channels: standard channels which prefix is either '&', '#'
|
||||
or '+', and "safe channels" which prefix is '!'.
|
||||
|
||||
3.1 Standard channels
|
||||
|
||||
These channels are created implicitly when the first user joins it,
|
||||
and cease to exist when the last user leaves it. While the channel
|
||||
exists, any client can reference the channel using the name of the
|
||||
channel.
|
||||
|
||||
The user creating a channel automatically becomes channel operator
|
||||
with the notable exception of channels which name is prefixed by the
|
||||
character '+', see section 4 (Channel modes). See section 2.4.1
|
||||
(Channel Operators) for more details on this title.
|
||||
|
||||
In order to avoid the creation of duplicate channels (typically when
|
||||
the IRC network becomes disjoint because of a split between two
|
||||
servers), channel names SHOULD NOT be allowed to be reused by a user
|
||||
if a channel operator (See Section 2.4.1 (Channel Operators)) has
|
||||
recently left the channel because of a network split. If this
|
||||
happens, the channel name is temporarily unavailable. The duration
|
||||
while a channel remains unavailable should be tuned on a per IRC
|
||||
network basis. It is important to note that this prevents local
|
||||
users from creating a channel using the same name, but does not
|
||||
prevent the channel to be recreated by a remote user. The latter
|
||||
typically happens when the IRC network rejoins. Obviously, this
|
||||
mechanism only makes sense for channels which name begins with the
|
||||
character '#', but MAY be used for channels which name begins with
|
||||
the character '+'. This mechanism is commonly known as "Channel
|
||||
Delay".
|
||||
|
||||
3.2 Safe Channels
|
||||
|
||||
Unlike other channels, "safe channels" are not implicitly created. A
|
||||
user wishing to create such a channel MUST request the creation by
|
||||
sending a special JOIN command to the server in which the channel
|
||||
identifier (then unknown) is replaced by the character '!'. The
|
||||
creation process for this type of channel is strictly controlled.
|
||||
The user only chooses part of the channel name (known as the channel
|
||||
"short name"), the server automatically prepends the user provided
|
||||
name with a channel identifier consisting of five (5) characters.
|
||||
The channel name resulting from the combination of these two elements
|
||||
is unique, making the channel safe from abuses based on network
|
||||
splits.
|
||||
|
||||
The user who creates such a channel automatically becomes "channel
|
||||
creator". See section 2.4.2 (Channel Creator) for more details on
|
||||
this title.
|
||||
|
||||
A server MUST NOT allow the creation of a new channel if another
|
||||
channel with the same short name exists; or if another channel with
|
||||
the same short name existed recently AND any of its member(s) left
|
||||
because of a network split. Such channel ceases to exist after last
|
||||
user leaves AND no other member recently left the channel because of
|
||||
a network split.
|
||||
|
||||
Unlike the mechanism described in section 5.2.2 (Channel Delay), in
|
||||
this case, channel names do not become unavailable: these channels
|
||||
may continue to exist after the last user left. Only the user
|
||||
creating the channel becomes "channel creator", users joining an
|
||||
existing empty channel do not automatically become "channel creator"
|
||||
nor "channel operator".
|
||||
|
||||
To ensure the uniqueness of the channel names, the channel identifier
|
||||
created by the server MUST follow specific rules. For more details
|
||||
on this, see section 5.2.1 (Channel Identifier).
|
||||
|
||||
4. Channel Modes
|
||||
|
||||
The various modes available for channels are as follows:
|
||||
|
||||
O - give "channel creator" status;
|
||||
o - give/take channel operator privilege;
|
||||
v - give/take the voice privilege;
|
||||
|
||||
a - toggle the anonymous channel flag;
|
||||
i - toggle the invite-only channel flag;
|
||||
m - toggle the moderated channel;
|
||||
n - toggle the no messages to channel from clients on the
|
||||
outside;
|
||||
q - toggle the quiet channel flag;
|
||||
p - toggle the private channel flag;
|
||||
s - toggle the secret channel flag;
|
||||
r - toggle the server reop channel flag;
|
||||
t - toggle the topic settable by channel operator only flag;
|
||||
|
||||
k - set/remove the channel key (password);
|
||||
l - set/remove the user limit to channel;
|
||||
|
||||
b - set/remove ban mask to keep users out;
|
||||
e - set/remove an exception mask to override a ban mask;
|
||||
I - set/remove an invitation mask to automatically override
|
||||
the invite-only flag;
|
||||
|
||||
Unless mentioned otherwise below, all these modes can be manipulated
|
||||
by "channel operators" by using the MODE command defined in "IRC
|
||||
Client Protocol" [IRC-CLIENT].
|
||||
|
||||
4.1 Member Status
|
||||
|
||||
The modes in this category take a channel member nickname as argument
|
||||
and affect the privileges given to this user.
|
||||
|
||||
4.1.1 "Channel Creator" Status
|
||||
|
||||
The mode 'O' is only used in conjunction with "safe channels" and
|
||||
SHALL NOT be manipulated by users. Servers use it to give the user
|
||||
creating the channel the status of "channel creator".
|
||||
|
||||
4.1.2 Channel Operator Status
|
||||
|
||||
The mode 'o' is used to toggle the operator status of a channel
|
||||
member.
|
||||
|
||||
4.1.3 Voice Privilege
|
||||
|
||||
The mode 'v' is used to give and take voice privilege to/from a
|
||||
channel member. Users with this privilege can talk on moderated
|
||||
channels. (See section 4.2.3 (Moderated Channel Flag).
|
||||
|
||||
4.2 Channel Flags
|
||||
|
||||
The modes in this category are used to define properties which
|
||||
affects how channels operate.
|
||||
|
||||
4.2.1 Anonymous Flag
|
||||
|
||||
The channel flag 'a' defines an anonymous channel. This means that
|
||||
when a message sent to the channel is sent by the server to users,
|
||||
and the origin is a user, then it MUST be masked. To mask the
|
||||
message, the origin is changed to "anonymous!anonymous@anonymous."
|
||||
(e.g., a user with the nickname "anonymous", the username "anonymous"
|
||||
and from a host called "anonymous."). Because of this, servers MUST
|
||||
forbid users from using the nickname "anonymous". Servers MUST also
|
||||
NOT send QUIT messages for users leaving such channels to the other
|
||||
channel members but generate a PART message instead.
|
||||
|
||||
On channels with the character '&' as prefix, this flag MAY be
|
||||
toggled by channel operators, but on channels with the character '!'
|
||||
as prefix, this flag can be set (but SHALL NOT be unset) by the
|
||||
"channel creator" only. This flag MUST NOT be made available on
|
||||
other types of channels.
|
||||
|
||||
Replies to the WHOIS, WHO and NAMES commands MUST NOT reveal the
|
||||
presence of other users on channels for which the anonymous flag is
|
||||
set.
|
||||
|
||||
4.2.2 Invite Only Flag
|
||||
|
||||
When the channel flag 'i' is set, new members are only accepted if
|
||||
their mask matches Invite-list (See section 4.3.2) or they have been
|
||||
invited by a channel operator. This flag also restricts the usage of
|
||||
the INVITE command (See "IRC Client Protocol" [IRC-CLIENT]) to
|
||||
channel operators.
|
||||
|
||||
4.2.3 Moderated Channel Flag
|
||||
|
||||
The channel flag 'm' is used to control who may speak on a channel.
|
||||
When it is set, only channel operators, and members who have been
|
||||
given the voice privilege may send messages to the channel.
|
||||
|
||||
This flag only affects users.
|
||||
|
||||
4.2.4 No Messages To Channel From Clients On The Outside
|
||||
|
||||
When the channel flag 'n' is set, only channel members MAY send
|
||||
messages to the channel.
|
||||
|
||||
This flag only affects users.
|
||||
|
||||
4.2.5 Quiet Channel
|
||||
|
||||
The channel flag 'q' is for use by servers only. When set, it
|
||||
restricts the type of data sent to users about the channel
|
||||
operations: other user joins, parts and nick changes are not sent.
|
||||
From a user's point of view, the channel contains only one user.
|
||||
|
||||
This is typically used to create special local channels on which the
|
||||
server sends notices related to its operations. This was used as a
|
||||
more efficient and flexible way to replace the user mode 's' defined
|
||||
in RFC 1459 [IRC].
|
||||
|
||||
4.2.6 Private and Secret Channels
|
||||
|
||||
The channel flag 'p' is used to mark a channel "private" and the
|
||||
channel flag 's' to mark a channel "secret". Both properties are
|
||||
similar and conceal the existence of the channel from other users.
|
||||
|
||||
This means that there is no way of getting this channel's name from
|
||||
the server without being a member. In other words, these channels
|
||||
MUST be omitted from replies to queries like the WHOIS command.
|
||||
|
||||
When a channel is "secret", in addition to the restriction above, the
|
||||
server will act as if the channel does not exist for queries like the
|
||||
TOPIC, LIST, NAMES commands. Note that there is one exception to
|
||||
this rule: servers will correctly reply to the MODE command.
|
||||
Finally, secret channels are not accounted for in the reply to the
|
||||
LUSERS command (See "Internet Relay Chat: Client Protocol" [IRC-
|
||||
CLIENT]) when the <mask> parameter is specified.
|
||||
|
||||
The channel flags 'p' and 's' MUST NOT both be set at the same time.
|
||||
If a MODE message originating from a server sets the flag 'p' and the
|
||||
flag 's' is already set for the channel, the change is silently
|
||||
ignored. This should only happen during a split healing phase
|
||||
(mentioned in the "IRC Server Protocol" document [IRC-SERVER]).
|
||||
|
||||
4.2.7 Server Reop Flag
|
||||
|
||||
The channel flag 'r' is only available on channels which name begins
|
||||
with the character '!' and MAY only be toggled by the "channel
|
||||
creator".
|
||||
|
||||
This flag is used to prevent a channel from having no channel
|
||||
operator for an extended period of time. When this flag is set, any
|
||||
channel that has lost all its channel operators for longer than the
|
||||
"reop delay" period triggers a mechanism in servers to reop some or
|
||||
all of the channel inhabitants. This mechanism is described more in
|
||||
detail in section 5.2.4 (Channel Reop Mechanism).
|
||||
|
||||
4.2.8 Topic
|
||||
|
||||
The channel flag 't' is used to restrict the usage of the TOPIC
|
||||
command to channel operators.
|
||||
|
||||
4.2.9 User Limit
|
||||
|
||||
A user limit may be set on channels by using the channel flag 'l'.
|
||||
When the limit is reached, servers MUST forbid their local users to
|
||||
join the channel.
|
||||
|
||||
The value of the limit MUST only be made available to the channel
|
||||
members in the reply sent by the server to a MODE query.
|
||||
|
||||
4.2.10 Channel Key
|
||||
|
||||
When a channel key is set (by using the mode 'k'), servers MUST
|
||||
reject their local users request to join the channel unless this key
|
||||
is given.
|
||||
|
||||
The channel key MUST only be made visible to the channel members in
|
||||
the reply sent by the server to a MODE query.
|
||||
|
||||
4.3 Channel Access Control
|
||||
|
||||
The last category of modes is used to control access to the channel,
|
||||
they take a mask as argument.
|
||||
|
||||
In order to reduce the size of the global database for control access
|
||||
modes set for channels, servers MAY put a maximum limit on the number
|
||||
of such modes set for a particular channel. If such restriction is
|
||||
imposed, it MUST only affect user requests. The limit SHOULD be
|
||||
homogeneous on a per IRC network basis.
|
||||
|
||||
4.3.1 Channel Ban and Exception
|
||||
|
||||
When a user requests to join a channel, his local server checks if
|
||||
the user's address matches any of the ban masks set for the channel.
|
||||
If a match is found, the user request is denied unless the address
|
||||
also matches an exception mask set for the channel.
|
||||
|
||||
Servers MUST NOT allow a channel member who is banned from the
|
||||
channel to speak on the channel, unless this member is a channel
|
||||
operator or has voice privilege. (See Section 4.1.3 (Voice
|
||||
Privilege)).
|
||||
|
||||
A user who is banned from a channel and who carries an invitation
|
||||
sent by a channel operator is allowed to join the channel.
|
||||
|
||||
4.3.2 Channel Invitation
|
||||
|
||||
For channels which have the invite-only flag set (See Section 4.2.2
|
||||
(Invite Only Flag)), users whose address matches an invitation mask
|
||||
set for the channel are allowed to join the channel without any
|
||||
invitation.
|
||||
|
||||
5. Current Implementations
|
||||
|
||||
The only current implementation of these rules as part of the IRC
|
||||
protocol is the IRC server, version 2.10.
|
||||
|
||||
The rest of this section deals with issues that are mostly of
|
||||
importance to those who wish to implement a server but some parts may
|
||||
also be of interest for client writers.
|
||||
|
||||
5.1 Tracking Recently Used Channels
|
||||
|
||||
This mechanism is commonly known as "Channel Delay" and generally
|
||||
only applies to channels which names is prefixed with the character
|
||||
'#' (See Section 3.1 "Standard channels").
|
||||
|
||||
When a network split occurs, servers SHOULD keep track of which
|
||||
channels lost a "channel operator" as the result of the break. These
|
||||
channels are then in a special state which lasts for a certain period
|
||||
of time. In this particular state, the channels cannot cease to
|
||||
|
||||
exist. If all the channel members leave the channel, the channel
|
||||
becomes unavailable: the server local clients cannot join the channel
|
||||
as long as it is empty.
|
||||
|
||||
Once a channel is unavailable, it will become available again either
|
||||
because a remote user has joined the channel (most likely because the
|
||||
network is healing), or because the delay period has expired (in
|
||||
which case the channel ceases to exist and may be re-created).
|
||||
|
||||
The duration for which a channel death is delayed 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.2 Safe Channels
|
||||
|
||||
This document introduces the notion of "safe channels". These
|
||||
channels have a name prefixed with the character '!' and great effort
|
||||
is made to avoid collisions in this name space. Collisions are not
|
||||
impossible, however they are very unlikely.
|
||||
|
||||
5.2.1 Channel Identifier
|
||||
|
||||
The channel identifier is a function of the time. The current time
|
||||
(as defined under UNIX by the number of seconds elapsed since
|
||||
00:00:00 GMT, January 1, 1970) is converted in a string of five (5)
|
||||
characters using the following base:
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" (each character has a decimal
|
||||
value starting from 0 for 'A' to 35 for '0').
|
||||
|
||||
The channel identifier therefore has a periodicity of 36^5 seconds
|
||||
(about 700 days).
|
||||
|
||||
5.2.2 Channel Delay
|
||||
|
||||
These channels MUST be subject to the "channel delay" mechanism
|
||||
described in section 5.1 (Channel Delay). However, the mechanism is
|
||||
slightly adapted to fit better.
|
||||
|
||||
Servers MUST keep track of all such channels which lose members as
|
||||
the result of a network split, no matter whether the user is a
|
||||
"channel operator" or not.
|
||||
|
||||
However, these channels do NOT ever become unavailable, it is always
|
||||
possible to join them even when they are empty.
|
||||
|
||||
5.2.3 Abuse Window
|
||||
|
||||
Because the periodicity is so long, attacks on a particular channel
|
||||
(name) may only occur once in a very long while. However, with luck
|
||||
and patience, it is still possible for a user to cause a channel
|
||||
collision. In order to avoid this, servers MUST "look in the future"
|
||||
and keep a list of channel names which identifier is about to be used
|
||||
(in the coming few days for example). Such list should remain small,
|
||||
not be a burden for servers to maintain and be used to avoid channel
|
||||
collisions by preventing the re-creation of such channel for a longer
|
||||
period of time than channel delay does.
|
||||
|
||||
Eventually a server MAY choose to extend this procedure to forbid
|
||||
creation of channels with the same shortname only (then ignoring the
|
||||
channel identifier).
|
||||
|
||||
5.2.4 Preserving Sanity In The Name Space
|
||||
|
||||
The combination of the mechanisms described in sections 5.2.2 and
|
||||
5.2.3 makes it quite difficult for a user to create a channel
|
||||
collision. However, another type of abuse consists of creating many
|
||||
channels having the same shortname, but different identifiers. To
|
||||
prevent this from happening, servers MUST forbid the creation of a
|
||||
new channel which has the same shortname of a channel currently
|
||||
existing.
|
||||
|
||||
5.2.5 Server Reop Mechanism
|
||||
|
||||
When a channel has been opless for longer than the "reop delay"
|
||||
period and has the channel flag 'r' set (See Section 4.2.7 (Server
|
||||
Reop Flag)), IRC servers are responsible for giving the channel
|
||||
operator status randomly to some of the members.
|
||||
|
||||
The exact logic used for this mechanism by the current implementation
|
||||
is described below. Servers MAY use a different logic, but that it
|
||||
is strongly RECOMMENDED that all servers use the same logic on a
|
||||
particular IRC network to maintain coherence as well as fairness.
|
||||
For the same reason, the "reop delay" SHOULD be uniform on all
|
||||
servers for a given IRC network. As for the "channel delay", the
|
||||
value of the "reop delay" SHOULD be set considering many factors
|
||||
among which are the size (user wise) of the IRC network, and the
|
||||
usual duration of network splits.
|
||||
|
||||
a) the reop mechanism is triggered after a random time following the
|
||||
expiration of the "reop delay". This should limit the eventuality
|
||||
of the mechanism being triggered at the same time (for the same
|
||||
channel) on two separate servers.
|
||||
|
||||
b) If the channel is small (five (5) users or less), and the "channel
|
||||
delay" for this channel has expired,
|
||||
Then reop all channel members if at least one member is local to
|
||||
the server.
|
||||
|
||||
c) If the channel is small (five (5) users or less), and the "channel
|
||||
delay" for this channel has expired, and the "reop delay" has
|
||||
expired for longer than its value,
|
||||
Then reop all channel members.
|
||||
|
||||
d) For other cases, reop at most one member on the channel, based on
|
||||
some method build into the server. If you don't reop a member, the
|
||||
method should be such that another server will probably op
|
||||
someone. The method SHOULD be the same over the whole network. A
|
||||
good heuristic could be just random reop.
|
||||
(The current implementation actually tries to choose a member
|
||||
local to the server who has not been idle for too long, eventually
|
||||
postponing action, therefore letting other servers have a chance
|
||||
to find a "not too idle" member. This is over complicated due to
|
||||
the fact that servers only know the "idle" time of their local
|
||||
users)
|
||||
|
||||
6. Current problems
|
||||
|
||||
There are a number of recognized problems with the way IRC channels
|
||||
are managed. Some of these can be directly attributed to the rules
|
||||
defined in this document, while others are the result of the
|
||||
underlying "IRC Server Protocol" [IRC-SERVER]. Although derived from
|
||||
RFC 1459 [IRC], this document introduces several novelties in an
|
||||
attempt to solve some of the known problems.
|
||||
|
||||
6.1 Labels
|
||||
|
||||
This document defines one of the many labels used by the IRC
|
||||
protocol. Although there are several distinct namespaces (based on
|
||||
the channel name prefix), duplicates inside each of these are not
|
||||
allowed. Currently, it is possible for users on different servers to
|
||||
pick the label which may result in collisions (with the exception of
|
||||
channels known to only one server where they can be averted).
|
||||
|
||||
6.1.1 Channel Delay
|
||||
|
||||
The channel delay mechanism described in section 5.1 (Tracking
|
||||
Recently Used Channels) and used for channels prefixed with the
|
||||
character '#' is a simple attempt at preventing collisions from
|
||||
happening. Experience has shown that, under normal circumstances, it
|
||||
|
||||
is very efficient; however, it obviously has severe limitations
|
||||
keeping it from being an adequate solution to the problem discussed
|
||||
here.
|
||||
|
||||
6.1.2 Safe Channels
|
||||
|
||||
"Safe channels" described in section 3.2 (Safe Channels) are a better
|
||||
way to prevent collisions from happening as it prevents users from
|
||||
having total control over the label they choose. The obvious
|
||||
drawback for such labels is that they are not user friendly.
|
||||
However, it is fairly trivial for a client program to improve on
|
||||
this.
|
||||
|
||||
6.2 Mode Propagation Delays
|
||||
|
||||
Because of network delays induced by the network, and because each
|
||||
server on the path is REQUIRED to check the validity of mode changes
|
||||
(e.g., user exists and has the right privileges), it is not unusual
|
||||
for a MODE message to only affect part of the network, often creating
|
||||
a discrepancy between servers on the current state of a channel.
|
||||
|
||||
While this may seem easy to fix (by having only the original server
|
||||
check the validity of mode changes), it was decided not to do so for
|
||||
various reasons. One concern is that servers cannot trust each
|
||||
other, and that a misbehaving servers can easily be detected. This
|
||||
way of doing so also stops wave effects on channels which are out of
|
||||
synch when mode changes are issued from different directions.
|
||||
|
||||
6.3 Collisions And Channel Modes
|
||||
|
||||
The "Internet Relay Chat: Server Protocol" document [IRC-SERVER]
|
||||
describes how channel data is exchanged when two servers connect to
|
||||
each other. Channel collisions (either legitimate or not) are
|
||||
treated as inclusive events, meaning that the resulting channel has
|
||||
for members all the users who are members of the channel on either
|
||||
server prior to the connection.
|
||||
|
||||
Similarly, each server sends the channel modes to the other one.
|
||||
Therefore, each server also receives these channel modes. There are
|
||||
three types of modes for a given channel: flags, masks, and data.
|
||||
The first two types are easy to deal with as they are either set or
|
||||
unset. If such a mode is set on one server, it MUST be set on the
|
||||
other server as a result of the connection.
|
||||
|
||||
As topics are not sent as part of this exchange, they are not a
|
||||
problem. However, channel modes 'l' and 'k' are exchanged, and if
|
||||
they are set on both servers prior to the connection, there is no
|
||||
mechanism to decide which of the two values takes precedence. It is
|
||||
left up to the users to fix the resulting discrepancy.
|
||||
|
||||
6.4 Resource Exhaustion
|
||||
|
||||
The mode based on masks defined in section 4.3 make the IRC servers
|
||||
(and network) vulnerable to a simple abuse of the system: a single
|
||||
channel operator can set as many different masks as possible on a
|
||||
particular channel. This can easily cause the server to waste
|
||||
memory, as well as network bandwidth (since the info is propagated to
|
||||
other servers). For this reason it is RECOMMENDED that a limit be
|
||||
put on the number of such masks per channels as mentioned in section
|
||||
4.3.
|
||||
|
||||
Moreover, more complex mechanisms MAY be used to avoid having
|
||||
redundant masks set for the same channel.
|
||||
|
||||
7. Security Considerations
|
||||
|
||||
7.1 Access Control
|
||||
|
||||
One of the main ways to control access to a channel is to use masks
|
||||
which are based on the username and hostname of the user connections.
|
||||
This mechanism can only be efficient and safe if the IRC servers have
|
||||
an accurate way of authenticating user connections, and if users
|
||||
cannot easily get around it. While it is in theory possible to
|
||||
implement such a strict authentication mechanism, most IRC networks
|
||||
(especially public networks) do not have anything like this in place
|
||||
and provide little guaranty about the accuracy of the username and
|
||||
hostname for a particular client connection.
|
||||
|
||||
Another way to control access is to use a channel key, but since this
|
||||
key is sent in plaintext, it is vulnerable to traditional man in the
|
||||
middle attacks.
|
||||
|
||||
7.2 Channel Privacy
|
||||
|
||||
Because channel collisions are treated as inclusive events (See
|
||||
Section 6.3), it is possible for users to join a channel overriding
|
||||
its access control settings. This method has long been used by
|
||||
individuals to "take over" channels by "illegitimately" gaining
|
||||
channel operator status on the channel. The same method can be used
|
||||
to find out the exact list of members of a channel, as well as to
|
||||
eventually receive some of the messages sent to the channel.
|
||||
|
||||
7.3 Anonymity
|
||||
|
||||
The anonymous channel flag (See Section 4.2.1) can be used to render
|
||||
all users on such channel "anonymous" by presenting all messages to
|
||||
the channel as originating from a pseudo user which nickname is
|
||||
"anonymous". This is done at the client-server level, and no
|
||||
anonymity is provided at the server-server level.
|
||||
|
||||
It should be obvious to readers, that the level of anonymity offered
|
||||
is quite poor and insecure, and that clients SHOULD display strong
|
||||
warnings for users joining such channels.
|
||||
|
||||
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.
|
||||
|
||||
[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-SERVER] Kalt, C., "Internet Relay Chat: Server Protocol", RFC
|
||||
2813, April 2000.
|
||||
|
||||
11. Author's Address
|
||||
|
||||
Christophe Kalt
|
||||
99 Teaneck Rd, Apt #117
|
||||
Ridgefield Park, NJ 07660
|
||||
USA
|
||||
|
||||
EMail: kalt@stealth.net
|
||||
|
||||
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.
|
||||
|
||||
|
||||
|
||||
|
||||
Previous: RFC 2810 - Internet Relay Next: RFC 2812 - Internet Relay Chat:
|
||||
Chat: Architecture Client Protocol
|
||||
|
||||
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
[ RFC Index | RFC Search | Usenet FAQs | Web FAQs | Documents | Cities ]
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue