Export to GitHub

j-neuron - irc_4_messageDetails.wiki


4. 消息详细定义

下面将详细描述每个被IRC Server 和 IRC Client所识别的消息。 IRC Server 必须实现这里所描述的所有命令以兼容其协议。

如果服务端返回ERR_NOSUCHSERVER消息,则

<Server>

参数所指定的IRC Server没有找到,其后,IRC Server 不会再返回其它任何消息。

客户端连接的IRC服务器须解析其收到的消息,返回一些适当的错误消息。如果服务器在解析消息的时候遇到了致命错误,则错误必须返回客户端并终止消息解析。一个致命错误可能是一个非法命令、一个未知的目标(如服务器,昵称,频道名等)、没有足够的参数或者非法权限。

如果给定全部的参数,则必须对每个参数进行检查并返回适当响应到客户端。这里的参数列表的消息须用逗点分隔每个项,一个返回则必须依次单个返回。

下面是一个消息完整格式的例子: :Name COMMAND parameter list 这个例子代表一个消息传输在服务器之间名为“NAME”的通道,它包括了消息的发送者的名字以便远程服务器可以沿着正确的路线返回消息。

4.1 连接注册

这里描述的命令通常需要注册到一个连接,可以是一个到IRC Server、用户的连接,甚至是一个正常关闭的连接。

"PASS" 命令不需要注册任何连接, 但是必须先于服务器消息或随后是NICK/USER组合。强烈建议所有的服务器连接都提供密码以加强实际连接的安全性。客户端注册一个连接的顺序如下所示: 1.Pass message. 2.Nick message. 3.User message.

4.1.1 密码消息

Command: PASS Parameters:

<password>

PASS命令是用来设置连接密码的。密码必须在连接注册之前设定。客户端必须在NICK/USER命令之前发送PASS,服务器间必须在任何服务器消息发送前发送PASS。

设定的密码必须包含C/N lines(服务器用)或 I lines (客户端用)。可以发送多次PASS命令,但只有最后一次有效。

数字返回: ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED

例:

PASS secretpasswordhere

4.1.2 昵称消息

Command: NICK Parameters:

<nickname>

<hopcount> NICK命令是给用户设定一个昵称或更改用户昵称。

<hopcount>

参数是用来让服务器知道这个昵称距HOME Server有多远。 一个本地连接的hopcount=0,如果用户指定,须忽略。

如果一个昵称到达服务器,但是服务器上另外一个客户使用相同的昵称,这时冲突就发生了。 昵称冲突的结果是,删除服务器数据库中的所有昵称实例,并且发送KILL命令从另外的服务器上删除这个昵称。如果这个NICK消息造成的冲突是一个昵称列改操作,则旧的昵称必须也删除。

如果服务器从直接连接的客户端那收到一个同样的昵称,则会向这个客户返回ERR_NICKCOLLISION,并丢弃NICK命令,不产生任何KILL。

数字返回: ERR_NONICKNAMEGIVEN ERR_ERRONEUSNICKNAME ERR_NICKNAMEINUSE ERR_NICKCOLLISION

例: NICK Wiz ; 新昵称 :WiZ NICK Kilroy ; 更改昵称

4.1.3 用户消息

Command: USER Parameters:

<username>

<hostname>

<servername>

<realname>

USER命令是用来新用户指定用户名、主机名、服务器名、真实名等来建立连接的。 它也是用来让服务器之间可能相互知道有新的用户加入了IRC,从客户端收到USER和NICK命令后标志着一个用户已注册。

在服务器之间的USER命令必须以客户端的昵称为前缀。注意,对于直接连上来的客户,IRC 服务器一般忽略USER命令的

<hostname>

跟〈servername>参数,但是它们在服务器与服务器的通信中使用。也就是说,当USER命令发送之前有一个新用户注册到其它网络的时候NICK命令必须总是发送给一个远程服务器。

值得注意的是,〈realname>这个参数必须是最后一个参数,因为它可能包含空格并须以“:”为前缀。

这样客户端可以很容易的依靠USER命令假冒用户名,所以说一个认证服务器是必要的。如果一个客户端连接到一个指定主机,并且这个主机有这么一个认证服务器的话,用户名的设置就取决于这个认证服务器。

数字返回: ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED

例: USER guest tolmoon tolsun :Ronnie Reagan ; 用户以用户名“guest”,真实名“Ronnie Reagan”注册。

:testnick USER guest tolmoon tolsun :Ronnie Reagan ; 服务器之间以NICKNAME,“testnick” 传送用户信息。

4.1.4 服务器消息

Command: SERVER Parameters:

<servername>

<hopcount>

<info>

服务器消息是用来告诉其它的服务器,新连上来的是一个服务器,也用于在整个网络中传输服务器数据。当一个新的服务器连接到网络的时候,它的信息会广播到整个网络。〈hopcount>是用来给所有的服务器一些内部信息以说明相距有多远,即相距多少节点。如果有一个服务器列表,就可以构建一个服务器树形结构的MAP,但是HOSTMASK会阻止这么做。

接爱服务器消息的几种情况:

a. 连接想注册成为一个服务器。 b. 服务器之间的连接。

服务器命令接收当中发生的大部份错误是由于目标服务器终止了。错误返回一般用ERROR命令,因为这会比返回数字更好,ERROR命令有一些非常有用的属性可用。

如果一个服务器消息解析且试图注册自已成为一个服务器,但是接收方发现这个服务器已经存在,那么发送这个消息的连接必须按正确的程序关闭,因为如果到一个服务器的连接形成重复路由,IRC树就会破坏掉。

数字返回: ERR_ALREADYREGISTRED

例: SERVER test.oulu.fi 1 :[tolsun.oulu.fi] Experimental server ;新的服务器test.oulu.fi暴露自己试图注册。在.md中的名字是运行test.oulu.fi的主机名。

:tolsun.oulu.fi SERVER csd.bu.edu 5 :BU Central Server ;服务器tolsun.oulu.fi是csd.bu.edu的上级传输节点,共5点跳点。

4.1.5 操作

Command: OPER Parameters:

<user>

<password>

OPER消息是用户用来获得操作权限的。〈user>用户名和

<passworkd>

密码是获得操作权限的用户信息。

如果客户端发送OPER命令并提供了正确的用户名密码,则服务器将会通知所有网络针对客户端NICKNAME的“MODE +o”的新操作者加入其中。

OPER 命令只适用于CLIENT-SERVER通信。

数字返回:

ERR_NEEDMOREPARAMS RPL_YOUREOPER ERR_NOOPERHOST ERR_PASSWDMISMATCH

例:

OPER foo bar ;偿试以用户名foo密码bar注册成为一个操作者。

4.1.6 退出

Command: QUIT Parameters: []

一个客户以一个QUIT消息终止会话。服务器必须关闭发送QUIT消息的客户端连接。如果给定一个QUIT消息,它会被发送而不是默认的NICKNAME消息。当二个服务器之间连接断开时,QUIT消息包括这二个服务器的名字,以空格隔开。第一个服务器还是连接着的,而第二个服务器就要断开连接了。 如果因为某种原因,客户端没有发送QUIT消息而终止连接了(如客户端死掉,SOCKET EOF),服务器须填充QUIT消息,以反映出事件已发生。

数字返回:

None.

例:

QUIT :Gone to have lunch ; 首选的消息格式。

4.1.7 服务器退出消息

Command: SQUIT Parameters:

<server>

<comment>

SQUIT消息需要告诉一些要将要退出的或僵死的服务器。如果一个服务器想断开当前连接,则它必须以那个服务器名字为参数,调用SQUIT命令,发送到其它一些服务器,从而那些服务器会关闭它到退出服务器的连接。

操作者可以用这个命令维护整个IRC SERVER网络非常有序。操作员也可以向远程服务器连接发送SQUIT命令。在这种情况下,远程服务器到操作员这间的所有节点都要解析SQUIT消息,并更新网络结构。 操作员执行SQUIT操作时,建议提供

<comment>

参数,这样其它的操作员才知道为什么需要这个操作。服务器有错误的时候也会填充这个参数。

二个服务器当中不管任何一个要关闭连接,都必须往外发送SQUIT消息(到它所连的其它服务器),从而这些服务器可以通知其后的服务器。

类似的,为了连接之后的所有客户端,QUIT消息必须发送到网络当中其它连接着的服务器。除此之外,一个频道所有成员由于分离的时候丢失一个成员的时候必须发送QUIT消息。

如果一个服务器的连接进早的终止(服务器另一端的链接死掉了),服务器发现掉线需要通知道网络当中的其它服务器那个连接掉了,并填充合适的信息在comment参数里。

数字返回:

ERR_NOPRIVILEGES ERR_NOSUCHSERVER

例:

SQUIT tolsun.oulu.fi :Bad Link ? ; 服务连接tolsun.oulu.fi被终止,因为其坏链接。

:Trillian SQUIT cm22.eng.umd.edu :Server out of control

;消息来是自Trillian,断开cm22.eng.umd.edu到网络上的连接,因为服务器不在控制下。


4.2 频道操作(Channel Operations)

这里的消息主要用于修改频道的属性(频道模式 - channel modes),内容(典型为客户端)。 在网络两边的客户端会发送最终会产生冲突的命令,在实现这些消息时,这类竞争的状况是无法避免的。 服务器必须要保存昵称的历史,以保证当有昵称作为参数传来的时候,检查一下历史,万一昵称最近已经改变过。


4.2.1 加入消息 (Join message)

| 命令: | JOIN | |:------|:-------| | 参数: | <channel>{,<channel>} [<key>{,<key>}] |

| 数字返回: | |:--------| | ERR_NEEDMOREPARAMS | ERR_BANNEDFROMCHAN | | ERR_INVITEONLYCHAN | ERR_BADCHANNELKEY | | ERR_CHANNELISFULL | ERR_BADCHANMASK | | ERR_NOSUCHCHANNEL | ERR_TOOMANYCHANNELS | | RPL_TOPIC | |

| 例: | |:-----| | JOIN #foobar | 加入频道 #foobar。 | | JOIN &foo fubar | 使用 key "fubar" 加入频道 &foo 。 | | JOIN #foo,&bar fubar | 使用 key "fubar" 加入频道 #foo; 加入频道 &bar (不实用 key)。 | | JOIN #foo,#bar fubar,foobar | 使用 key "fubar" 加入频道 #foo; 使用 key "foobar" 加入频道 #bar。 | | JOIN #foo,#bar | 加入频道 #foo 和 #bar。 | | :WiZ JOIN #Twilight_zone | WiZ 加入频道 #Twilight_zone |

客户端使用 JOIN 开始监听某个频道。客户端所连接到的服务器会检查是否允许客户端加入,别的服务器当接收到服务器消息时,自动将用户加入频道。

影响条件如下:

  1. 如果频道是"只邀请"(invite-only)频道,用户必须被邀请才能加入频道;
  2. 用户的 昵称/用户名/主机 任何一个不能被禁;
  3. 如果有 key(密码),必须要正确提供。

这些在(4.2.3)关于 MODE 命令的讨论中会详细描述。

当用户加入到一个频道后,他们接收到所有改变服务器状态的命令的通知。包括(MODE, KICK, PART, QUIT, PRIVMSG/NOTICE)。 JOIN 命令必须被广播到所有服务器,一边让服务器知道到哪里可以找到频道上的用户。这样可以优化到频道的 PRIVMSG/NOTICE 消息的传递。

如果 JOIN 成功,服务器发送给用户频道的主题(RPL_TOPIC) 和频道上用户的列表(RPL_NAMREPLY),其中必须包括加入中的用户。


4.2.2 离开消息 (Part message)

| 命令: | PART | |:------|:-------| | 参数: | <channel>{,<channel>} |

| 数字返回: | |:--------| | ERR_NEEDMOREPARAMS | ERR_NOSUCHCHANNEL | | ERR_NOTONCHANNEL | |

| 例: | |:-----| | PART #twilight_zone | 离开频道 "#twilight_zone"。 | | PART #oz-ops,&group5 | 离开频道 "&group5" 和 "#oz-ops"。 |

发送 PART 消息的客户端将被从参数所列频道的活跃用户列表中去除。


4.2.3 模式消息 (Mode message)

| 命令: | MODE | |:------|:-------|

MODE 在 IRC 中是一个双重目的的命令。 它允许改变用户名和频道的模式。 这样做的道理是,有一天昵称会过时,频道会取而代之。

在解析 MODE 消息时, 推荐先解析整个消息, 然后是导致的变化, 然后再传上来。

4.2.3.1 频道模式 (Channel modes)

| 参数: | <channel> {[+|-]|o|p|s|i|t|n|b|v} [<limit>] [<user>] [<ban mask>] | |:------|:--------------------------------------------------------------------|

MODE 命令让频道管理员能改变他们的频道的特性。服务器也要能改变频道的模式,以创建频道的管理员。

频道拥有的模式如下: * o - 授予/收回 频道管理员权限; * p - 私有频道标志; * s - 秘密频道标志; * i - 只邀请频道标志; * t - (仅)频道管理员可设置频道主题的标志; * n - 频道外客户端不可发送消息到频道; * m - 受管制频道; * l - 设置频道用户数限制; * b - 设置用户禁止掩码; * v - 授予/收回 在管制频道的说话权; * k - 设置频道的键(密码);

当使用'o'和'b'选项时,隐式地有一个命令最多三个变化的限制。(原始文档不完整...)

4.2.3.2 用户模式 (User modes)

| 参数: | <nickname> {[+|-]|i|w|s|o} | |:------|:-----------------------------|

用户模式通常是对用户如何被别的客户端看到,或者有什么‘多余’信息要发送给客户端的改变。用户的 MODE 命令只有当消息的发送者和参数中的昵称是相同的时候才有效。

用户拥有的模式如下: * i - 用户不可见; * s - 标识用户接收服务器通知; * w - 用户接收 wallops; * o - 管理员标志.

以后可能会有其他模式.

如果用户试图用 "+o" 标志把自己变成管理员,这类消息应该忽略。但是没有限制用户使用 "-o" 将自己变为非管理员。

| 数字返回:| |:-------| | ERR_NEEDMOREPARAMS | RPL_CHANNELMODEIS | | ERR_CHANOPRIVSNEEDED | ERR_NOSUCHNICK | | ERR_NOTONCHANNEL | ERR_KEYSET | | RPL_BANLIST | RPL_ENDOFBANLIST | | ERR_UNKNOWNMODE | ERR_NOSUCHCHANNEL | | ERR_USERSDONTMATCH | RPL_UMODEIS | | ERR_UMODEUNKNOWNFLAG | |

| 例: | |:-----|

| 频道模式的使用: | |:-----------| | MODE #Finnish +im | 将频道 #Finnish 变为受管制频道和邀请频道。 | | MODE #Finnish +o Kilroy | 给予 Kilroy 频道 #Finnish 的管理员权限。 | | MODE #Finnish +v Wiz | 允许 WiZ 在频道 #Finnish 上发言。 | | MODE #Fins -s | 取消频道 #Fins 的秘密频道标志。 | | MODE #42 +k oulu | 设置频道的键为 "oulu"。 | | MODE #eu-opers +l 10 | 设置频道的用户上限为 10。 | | MODE &oulu +b | 列出频道上的禁止掩码。 | | MODE &oulu +b *!*@* | 阻止所有用户加入频道。 | | MODE &oulu +b *!*@*.edu | 阻止主机名匹配 *.edu 的用户加入频道。 |

| 用户模式的使用: | |:-----------| | :MODE WiZ -w | 关闭 WiZ 接受 WALLOPS 消息的标志。 | | :Angel MODE Angel +i | Angel 发送消息使自己不可见(隐身) | | MODE WiZ -o | WiZ 'deopping' (WiZ 去除自己的管理员状态)。 反过来,用户使不允许发送命令 ("MODE WiZ +o") 的,因为这样会绕过了 OPER 命令。|


4.2.4 主题消息 (Topic message)

| 命令: | TOPIC | |:------|:--------| | 参数: | <channel> [<topic>] |

TOPIC 消息用来更改或者查看频道的主题。 如果没有参数

<topic>

则返回频道

<channel>

的当前主题。 如果有参数

<topic>

, 频道的主题则改为

<topic>

参数指定的主题(如果频道模式允许这一操作)。

| 数字返回: | |:--------| | ERR_NEEDMOREPARAMS | ERR_NOTONCHANNEL | | RPL_NOTOPIC | RPL_TOPIC | | ERR_CHANOPRIVSNEEDED | |

| 例: | |:-----| | :Wiz TOPIC #test :New topic | 用户 Wiz 设定频道主题。 | | TOPIC #test :another topic | 设置频道 #test 的主题为 "another topic"。 | | OPIC #test | 查看频道 #test 的主题。 |


4.2.5 名字消息 (Names message)

| 命令: | NAMES | |:------|:--------| | 参数: | [<channel>{,<channel>}] |

用户使用 NAMES 命令可以列出所有可见频道上的可见用户昵称。 可见频道是指不是私有频道 (+p) 或 秘密频道(+s) 或用户所在的频道。

<channel>

参数指定需要返回的(有效)频道的信息。错误的频道名称不会引起错误返回。

如果

<channel>

参数没有给定, 所有频道和其成员列表将被返回。 在列表的最后,是所有可见的但是不在任何频道或可见频道上的用户列表,他们显示在频道 "*"上的。

| 数字返回: | |:--------| | RPL_NAMREPLY | RPL_ENDOFNAMES |

| 例: | |:-----| | NAMES #twilight_zone,#42 | 列出所有频道 #twilight_zone 和 #42 上的可见用户。 | | NAMES | 列出所有可见用户和频道 |


4.2.6 列表消息 (List message)

| 命令: | LIST | |:------|:-------| | 参数: | [<channel>{,<channel>} [<server>]] |

LIST 消息用来列出频道和频道的主题, 如果使用了

<channel>

参数, 只显示给定频道的状态。私有频道(不显示其主题)显示为 "Prv" 频道,除非发送查询的客户端在那个频道上。秘密频道不会被列出,除非用户在那个频道上。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | RPL_LISTSTART | | RPL_LIST | RPL_LISTEND |

| 例: | |:-----| | LIST | 列出所有频道。 | | LIST #twilight_zone,#42 | 列出频道 #twilight_zone 和 #42 |


4.2.7 邀请消息 (Invite message)

| 命令: | INVITE | |:------|:---------| | 参数: | <nickname> <channel> |

INVITE 消息用来邀请用户到一个频道。

<nickname>

是要被邀请到频道

<channel>

的人的昵称。 这里没有要求用户被邀请到的频道一定要有效或者存在。邀请一个用户到邀请频道(MODE +i),发送邀请的客户端必须是这个频道的频道管理员。

| 数字返回: | |:--------| | ERR_NEEDMOREPARAMS | ERR_NOSUCHNICK | | ERR_NOTONCHANNEL | ERR_USERONCHANNEL | | ERR_CHANOPRIVSNEEDED | | | RPL_INVITING | RPL_AWAY |

| 例: | |:-----| | :Angel INVITE Wiz #Dust | 用户 Angel 邀请 WiZ 到频道 #Dust | | INVITE Wiz #Twilight_Zone | 邀请 WiZ 到 #Twilight_zone |


4.2.8 踢人消息 (Kick command)

| 命令: | KICK | |:------|:-------| | 参数: | <channel> <user> [<comment>] |

KICK 命令可以用来强制把一个用户从频道中去掉。 命令把他们'踢出'频道 (强制 PART). 当然只有频道管理员才能把别的用户踢出去。 每台服务器接收到 KICK 命令后确认一下消息有效性 (比如命令发送者的确是这个频道的管理员) 才能把受害者从频道中去除。

| 数字返回: | |:--------| | ERR_NEEDMOREPARAMS | ERR_NOSUCHCHANNEL | | ERR_BADCHANMASK | ERR_CHANOPRIVSNEEDED | | ERR_NOTONCHANNEL | |

| 例: | |:-----| | KICK &Melbourne Matthew | 把 Matthew 踢出 &Melbourne | | KICK #Finnish John :Speaking English | 把 John 踢出 #Finnish,理由(注释):"Speaking English" | | :WiZ KICK #Finnish John | WiZ 把 John 从 #Finnish 踢出去 |

注意: KICK 命令的参数可以扩展为 - <channel>{,<channel>} <user>{,<user>} [<comment>]


4.3 服务器查询及命令 (Server queries and commands)

服务器的查询命令集合用来返回任何网络上服务器的相关信息。所有连接到网络上的服务器必须正确响应这些查询。 任何无效响应(或者没有)必须被视为服务器坏掉了,并且要尽快断开/禁用此服务器,以免情况进一步恶化。

在这些查询中出现像"

<server>

"这样的参数,通常可以是一个昵称,服务器或者是某种通配名。对于每个参数,只有一个查询和返回集合产生。


4.3.1 版本消息 (Version message)

| 命令: | VERSION | |:------|:----------| | 参数: | [<server>] |

版本消息用来查询服务器程序的版本。可选参数

<server>

用来指定查询客户端没有直接连接到的服务器版本。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | RPL_VERSION |

| 例: | |:-----| | :Wiz VERSION *.se | Wiz 查询服务器名匹配 "*.se" 的版本。 | | VERSION tolsun.oulu.fi | 查询 "tolsun.oulu.fi" 的版本。 |


4.3.2 统计消息 (Stats message)

| 命令: | STATS | |:------|:--------| | 参数: | [<query> [<server>]] |

stats 消息用来查询某台服务器的统计信息。如果没有给定

<server>

参数, 只有stats返回结果的结束部分被发回来。虽然服务器必须要能提供下面所描述的查询的返回信息, 但是具体命令返回内容的实现很大程度取决于发送返回信息的服务器。

查询带有一个字母参数,只有目标服务器

<server>

检查这个参数,其他中间服务器只是传递这个查询,不做任何处理。 目前的 IRC 有如下这些查询,提供了很大一部分服务器的设置信息。可能这些查询在别的版本中支持方式不一样,但所有服务器 应该能够返回有效的stats查询的返回结果,使之符合查询的返回格式和使用目的。

目前支持的查询: * c - 返回服务器可以连接到和被连接的服务器列表。 * h - 返回被强制设定为叶子服务器或者作为 hub 使用的服务器的列表。 * i - 返回允许客户端连接的服务器主机列表。 * k - 返回服务器上被禁用户名/主机名组的列表。 * l - 返回服务器的连接列表,显示每个连接的持续时间,流量(bytes),以及各个方向上的消息。 * m - 返回服务器支持的命令列表,及各个命令的使用次数,如果不是0。 * o - 返回普通客户端可以成为管理员的主机列表。 * y - 显示服务器配置文件中的 Y (Class) lines。 * u - 显示一个表示服务器运行时间的串。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | | | RPL_STATSCLINE | RPL_STATSNLINE | | RPL_STATSILINE | RPL_STATSKLINE | | RPL_STATSQLINE | RPL_STATSLLINE | | RPL_STATSLINKINFO | RPL_STATSUPTIME | | RPL_STATSCOMMANDS | RPL_STATSOLINE | | RPL_STATSHLINE | RPL_ENDOFSTATS |

| 例: | |:-----| | STATS m | 查询所连接到的服务器的命令说明 | | :Wiz STATS c eff.org | WiZ 查询服务器 eff.org 的 C/N line 信息 |


4.3.3 链路消息 (Links message)

| 命令: | LINKS | |:------|:--------| | 参数: | [[<remote server>] <server mask>] |

通过 LINKS,目标服务器可以列出所有已知的服务器。 返回的列表必须匹配服务器掩码。如果没有掩码,则列出所有服务器。

如果还提供了 参数,则查询被转送到第一台名字匹配

的服务器,并由这台服务器回答查询。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | | | RPL_LINKS | RPL_ENDOFLINKS |

| 例: | |:-----| | LINKS *.au | 列出所有名字匹配 *.au 的服务器。 | | :WiZ LINKS *.bu.edu *.edu | WiZ 发送 LINKS 到底一台名字匹配 *.edu 的服务器,查询名字匹配 *.bu.edu 的服务器列表。 |


4.3.4 时间消息 (Time message)

| 命令: | TIME | |:------|:-------| | 参数: | [<server>] |

time 消息用来查询特定服务器的本地时间,如果

<server>

参数没有指定,则处理此消息的服务器将回应消息。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | RPL_TIME |

| 例: | |:-----| | TIME tolsun.oulu.fi | 查询服务器 "tolson.oulu.fi" 的时间。 | | Angel TIME *.au | 用户 angel 查询名字符合 "*.au" 的服务器的时间。|


4.3.5 连接消息 (Connect message)

| 命令: | CONNECT | |:------|:----------| | 参数: | <target server> [<port> [<remote server>]] |

CONNECT 命令用来强行使服务器建立一个新连接到另外服务器。CONNECT 是只有 IRC 管理员才有权限使用的命令。 如果远给定 , 则 尝试连接到 和

<port>

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | ERR_NOPRIVILEGES | | ERR_NEEDMOREPARAMS |

| 例: | |:-----| | CONNECT tolsun.oulu.fi | 尝试连接到服务器 tolsun.oulu.fi。 | | :WiZ CONNECT eff.org 6667 csd.bu.edu | WiZ 用 CONNECT 尝试让服务器 csd.bu.edu 通过6667端口连接到服务器 eff.org。|


4.3.6 追踪消息 (Trace message)

| 命令: | TRACE | |:------|:--------| | 参数:| [<server>] |

TRACE 命令用来寻找到某台服务器的路由。每台处理这个消息的服务器必须发送返回信息告诉发送者, 说明自己是中间链路,类似于使用"traceroute"收集到的返回链,返回消息发送后,服务器必须把 TRACE 消息发送给下一个服务器,直到到达目标服务器。如果没有给定

<server>

参数,这里要求 当前服务器告诉消息发送者,现在直接连接到该服务器的服务器列表。

如果

<server>

是真实服务器,则目标服务器要把当前所有连接到它的服务器和用户报告给消息发送者。 当然用户的信息只有管理员才能看到。如果目标

<server>

是一个昵称,只有这个昵称的返回消息被返回。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | | 如果 TRACE 消息指向另外一台服务器,则所有的中间服务器必须要返回一个 RPL_TRACELINK 返回消息,表面 TRACE 消息经过它,及接下来消息要到那里。 | | RPL_TRACELINK | | 一个 TRACEA 返回可以由多个下列数字返回组成。 | | RPL_TRACECONNECTING | RPL_TRACEHANDSHAKE | | RPL_TRACEUNKNOWN | RPL_TRACEOPERATOR | | RPL_TRACEUSER | RPL_TRACESERVER | | RPL_TRACESERVICE | RPL_TRACENEWTYPE | | RPL_TRACECLASS |

| 例: | |:-----| | TRACE *.oulu.fi | 到服务器命匹配 *.oulu.fi 的追踪消息。 | | :WiZ TRACE AngelDust | WiZ 发送追踪消息,目标为昵称 AngelDust |


4.3.7 管理员消息 (Admin command)

| 命令: | ADMIN | |:------|:--------| | 参数: | [<server>] |

admin 消息用来查询指定服务器(若未指定

<server>

则为当前服务器)的管理员名。 每台服务器都该有递送 ADMIN 消息到其他服务器的能力。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | | | RPL_ADMINME | RPL_ADMINLOC1 | | RPL_ADMINLOC2 | RPL_ADMINEMAIL |

| 例: | |:-----| | ADMIN tolsun.oulu.fi | 请求服务器 tolsun.oulu.fi 的 ADMIN 响应。 | | :WiZ ADMIN *.edu | WiZ 发送请求服务器名匹配 match *.edu 的第一台服务器的 ADMIN 响应。 |


4.3.8 信息消息 (Info command)

| 命令: | INFO | |:------|:-------| | 参数: | [<server>] |

INFO 命令用来询问服务器的描述信息: 版本,编译时间,patchlevel,启动时间,以及其他一些相关信息。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | | RPL_INFO | RPL_ENDOFINFO |

| 例: | |:-----| | INFO csd.bu.edu | 请求服务器 csd.bu.edu 的 info 应答。 | | :Avalon INFO *.fi | Avalon 请求第一台名称匹配 *.fi 的服务器的 info 应答。 | | INFO Angel | 请求 Angel 所连接到的服务器的 info 应答。 |


4.4 消息发送 (Sending messages)

IRC 协议的主要目的是给客户端提供相互交流的基础。只有 PRIVMSG 和 NOTICE 消息是 提供单个客户端之间的消息递送 - 其他的则是用来保证其结构化和可靠性。


4.4.1 私人消息 (Private messages)

| 命令: | PRIVMSG | |:------|:----------| | 参数: | <receiver>{,<receiver>} <text to be sent> |

PRIVMSG 用来在用户之间发送私人消息。

<receiver>

是消息接收者的昵称。

<receiver>

也可以是以逗号分隔的 名字,频道的列表。

<receiver>

参数也可以是个主机掩码 (#mask) 或者服务器掩码 ($mask)。这两种情况下,服务器只会发送 PRIVMSG 消息 到名字匹配掩码的服务器或主机上的客户端。

掩码必须包含一个 "." 并且在最后一个 "." 后没有通配符。这样的要求是为了防止用户发送诸如"#*""$*"的消息, 这些消息会广播到所有用户。通配符是 '*''?'。这一 PRIVMSG 的扩展功能只提供给管理员。

| 数字返回: | |:--------| | ERR_NORECIPIENT | ERR_NOTEXTTOSEND | | ERR_CANNOTSENDTOCHAN | ERR_NOTOPLEVEL | | ERR_WILDTOPLEVEL | ERR_TOOMANYTARGETS | | ERR_NOSUCHNICK | | RPL_AWAY |

| 例: | |:-----| | :Angel PRIVMSG Wiz :Hello are you receiving this message ? | Angel 发送消息给 Wiz。 | | PRIVMSG Angel :yes I'm receiving it !receiving it !'u>(768u+1n) .br | 发送消息给 Angel。 | | PRIVMSG jto@tolsun.oulu.fi :Hello ! | 发送消息给服务器 tolsun.oulu.fi 上名为 "jto" 的客户端。 | | PRIVMSG $*.fi :Server tolsun.oulu.fi rebooting. | 发送消息给服务器名匹配 *.fi 的服务器上的所有人。 | | PRIVMSG #*.edu :NSFNet is undergoing work, expect interruptions | 发送消息给主机名匹配 *.edu 的所有人。 |


4.4.2 通知消息 (Notice)

| 命令: | NOTICE | |:------|:---------| | 参数: | <nickname> <text> |

NOTICE 的使用方法类似于 PRIVMSG。区别在于不能自动响应返回 NOTICE 消息 。 这一规则也适用于服务器 - 他们接收到 notice 消息后不能发送任何错误返回给客户端。 这一规则的目的是避免客户端针对接受到的消息自动发送响应。这常用于之返回消息的自动机 (有AI或 者交互程序控制响应的客户端) 以免被别的自动机终端。


4.5 基于用户的查询 (User based queries)

用户查询的命令集合主要用来查询特定用户或者组用户的详细信息。 当使用通配符时,命令只返回对你可见的匹配用户的信息。用户的可见性 是根据用户的模式及你所在频道的设定综合判断的。


4.5.1 "谁"查询 (Who query)

| 命令: | WHO | |:------|:------| | 参数: | [<name> [<o>]] |

客户端发送 WHO 消息,获得一个匹配

<name>

的信息列表。 如果省略

<name>

参数,则所有非隐身用户 (mode +i) 以及不和 请求查询的客户端在一个频道内的用户列表被返回。

同样的效果还可以通过使用值为 "0"

<name>

, 或可以匹配 所有记录的通配符来实现。

<name>

参数和用户的主机,服务器,真实名,昵称(如果频道

<name>

存在)作匹配。

如果有参数 "o",只返回匹配的管理员。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | | RPL_WHOREPLY | RPL_ENDOFWHO |

| 例: | |:-----| | WHO *.fi | 列出所有用户名匹配 "*.fi" 的用户。 | | WHO jto* o | 列出所有用户名匹配 "jto*" 的管理员。 |


4.5.2 "谁是" (Whois query)

| 命令: | WHOIS | |:------|:--------| | 参数: | [<server>] <nickmask>[,<nickmask>[,...]] |

这条命令用来查询特定用户的信息。服务器会以几个数字返回来告诉查询者匹 配 nickmask 的用户的不同状态(如果用户是可见的)。

如果

<nickmask>

没有通配符,则那个昵称所有允许你看到的信息会被列出来。

近些版本发送这个查询到特定服务器,这个对你想知道用户离开了服务器多长 时间是很有用的,因为只有本地直接连接用户的本地服务器才知道这一信息。 而其他信息则是全局都知道的。

| 数字返回: | |:--------| | ERR_NOSUCHSERVER | ERR_NONICKNAMEGIVEN | | RPL_WHOISUSER | RPL_WHOISCHANNELS | | RPL_WHOISCHANNELS | RPL_WHOISSERVER | | RPL_AWAY | RPL_WHOISOPERATOR | | RPL_WHOISIDLE | ERR_NOSUCHNICK | | RPL_ENDOFWHOIS |

| 例: | |:-----| | WHOIS wiz | 返回昵称为 WiZ 的相关可用信息 | | WHOIS eff.org trillian | 向服务器 eff.org 昵称为 trillian 的可用信息 |


4.5.3 "谁曾是" (Whowas)

| 命令: | WHOWAS | |:------|:---------| | 参数: | <nickname> [<count> [<server>]] |

WHOWAS 用来查询已经不存在了的昵称的信息。当用户改变了昵称或 者离开了 IRC,就有这样的情况。

服务器通过查询昵称的历史信息,找到和

<nickname>

完全匹配(无通配符)的昵称。

查询重最近的记录开始,返回

<count>

所指定的返回条数。如果没指定(或指定的数字不是正数),则返回所有结果。

| 数字返回: | |:--------| | ERR_NONICKNAMEGIVEN | ERR_WASNOSUCHNICK | | RPL_WHOWASUSER | RPL_WHOISSERVER | | RPL_ENDOFWHOWAS |

| 例子: | |:------| | WHOWAS Wiz | 查询昵称 "WiZ" 的所有历史信息。 | | WHOWAS Mermaid 9 | 查询最近九条昵称为 "Mermaid" 的历史信息。 | | WHOWAS Trillian 1 *.edu | 从第一台名字匹配 "*.edu" 的服务器上查询最近一条昵称为 "Trillian" 的历史信息。 |


4.6 未分类的消息 (Miscellaneous messages)

这一栏的消息不能被归属到上面的任何一类,但仍然是协议中必须的。


4.6.1 强杀消息 (Kill message)

| 命令: | KILL | |:------|:-------| | 参数: | <nickname> <comment> |

KILL 命令的用途是断开客户端与其服务器之间的连接。

当服务器发现有两个相同的有效昵称时,用 KILL 命令删除这两条记录。管理员也可以使用这个命令。

有自动重连功能的客户端使得这个命令没有什么用,因为断开只是短暂的。

但是这个命令的确可以打断数据流,并且阻止大量的滥用,任何用户可以选择接收对其他客户端产生 的 KILL 消息,这可能成为一个问题点。

当要求在全局范围内,昵称总是唯一时,KILL 消息被用来删除"重复"(试图注册两个相同昵称的用户), 期望使两个都消失,然后只有一个出现。

注释说明要能给出 KILL 命令的原因理由。服务器生成的 KILL 命令通常用两个有昵称冲突的客户端来源 作为注释内容,对于用户来说,就取决于他们,以给看到这条消息的其他人一个充分的理由。为了预防和阻止 假 KILL 消息被匿名生成,注释中同时显示一个"kill路径",每台消息经过的服务器添加自己的名字在后面, 来更新这一路径。

| 数字返回: | |:--------| | ERR_NOPRIVILEGES | ERR_NEEDMOREPARAMS | | ERR_NOSUCHNICK | ERR_CANTKILLSERVER |

| 例: | |:-----| | KILL David (csd.bu.edu <- tolsun.oulu.fi) | csd.bu.edu 与 tolson.oulu.fi 之间有昵称冲突,杀。 |

贴士: 推荐只有管理员能使用KILL命令,更理想化的情况下,只需要由服务器来处理。


4.6.2 "乒"消息 (Ping message)

| 命令: | PING | |:------|:-------| | 参数: | <server1> [<server2>] |

PING 消息用来探测远端客户端连接是否活跃。当没有探测到客户端的活动时,服务器有规律地发送 PING 消息,如果在一定时间内没有成功应答,则关闭连接。

客户端收到 PING 消息后要及时给

<server1>

(发送PING消息的服务器)一个正确的 PONG 消息应答, 告诉服务器它还在,还活着。服务器不要应答 PING 消息,只需要通过远端传来的 PING 消息来确保 连接是活着的。如果有

<server2>

参数, 转发 PING 消息到

<server2>

| 数字返回: | |:--------| | ERR_NOORIGIN | ERR_NOSUCHSERVER |

| 例: | |:-----| | PING tolsun.oulu.fi | 服务器发送PING到其他服务器,表面自己还活着。 | | PING WiZ | 发送给 昵称 WiZ 的 PING 消息。 |


4.6.3 "乓"消息 (Pong message)

| 命令: | PONG | |:------|:-------| | 参数: | <daemon> [<daemon2>] |

PONG 消息是 PING 消息的应答。 如果给定参数

<daemon2>

,则消息要被转发到给定的守护进程,

<daemon>

参数是产生应答这个PING消息的守护进程名。

| 数字返回:| |:| | ERR_NOORIGIN | ERR_NOSUCHSERVER |

| 例子: | |:------| | PONG csd.bu.edu tolsun.oulu.fi | 从 csd.bu.edu 到...(原文缺失) |


4.6.4 错误消息 (Error)

| 命令: | ERROR | |:------|:--------| | 参数: | <error message> |

服务器通过 ERROR 消息向管理员报告严重错误。ERROR 也可以从一台服务器 发送到另外的服务器,但是不能从普通的未知客户端接受此消息。

ERROR 消息只用来报告服务器间连接的错误,ERROR 消息被发送到另一端的 服务器(由他发送给所有连接到的管理员)和所有当前连接着的管理员。如果消息 来自一台服务器,则不会转送给其他服务器。

当 ERROR 消息发送给管理员时,消息要被封装在 NOTICE 消息中,表明客户端不 对消息做出回应。

| 数字返回: | |:--------| | 无 |

| 例: | |:-----| | ERROR :Server *.fi already exists | 发送错误消息给引起此错误的服务器 | | NOTICE WiZ :ERROR from csd.bu.edu -- Server *.fi already exists | 同于上面的错误,但是发送给管理员 WiZ |