サイズ: 10999
コメント:
|
サイズ: 11169
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 74: | 行 74: |
なお、チャンネルから脱退する場合にはPARTコマンドが使用されます。 | |
行 76: | 行 77: |
また、誰もいなくなったチャンネルは削除されます。 |
査読依頼
この記事は査読を必要としています。
目次
構造から見るIRC基礎知識
主にRFCの概念部分に書かれている内容をかいつまんで解説します。
ただし、IRCの仕様はRFCには納められてはいるものの扱いはStandard TrackではなくInformationalです。 実際に使用されているサーバでは、RFCに書かれていても使用できない機能があるのでご注意ください。
参考文献 RFC2810, RFC2811, RFC2812, ngircd
ネットワーク構造
IRCはInternet Relay Chatの略であり、その名の通りリレー(バケツリレーですね)によってメッセージを届けるチャットシステムです。 複数のサーバ間でスパニングツリー状のネットワークを構成し、ネットワークにループは存在しません。 クライアントは一つのサーバに接続しておき、サーバを介してメッセージを他のクライアントに届けます。 クライアントの属するサーバが異なる場合には、サーバ同士でメッセージを交換して複数のサーバを経由して目的のクライアントまで届けます。 クライアント同士が直接通信することはありません。
サーバはクライアントにメッセージを選択的に届けるために、どのクライアントがどのサーバにいるかという情報を知らなければなりません。 そこで、どのクライアントがどのサーバにログインしているかという情報がサーバ間で共有されます。
- スパニングツリー
- 全域木。グラフ理論では、辺の部分集合からなる全ての頂点を含む木のこと。つまり、ここでは接続先となるサーバの候補が複数あったとしても、実際に接続される先はネットワーク全体として閉路を許さない木構造になるものでなければならないことを意味する。
メッセージの流れ
1対1通信
二つのクライアントが属するサーバが同一であれば、そのサーバが仲介してメッセージを届けます。メッセージは他のサーバには伝わりません。
二つのクライアントが属するサーバが異なる場合には、経路上にあるサーバをいくつか経由して目的のクライアントまでメッセージを届けます。やはり経路上にはないサーバにはメッセージは伝わりません。
例として、サーバAにログインしているクライアントxと、サーバCにログインしているクライアントyの間でメッセージをやりとりするとします。 サーバAはサーバB、さらにサーバBはサーバCとサーバDに接続されているとしましょう。 クライアントxからクライアントyにメッセージを送る場合に、その経路上にはサーバA,B,Cがあります。 よってサーバAからはサーバBに送信され、サーバBからサーバCに送信されることによってクライアントyの元までメッセージが届きます。 経路上にないサーバDにはメッセージが送られません。
対チャンネル
チャンネルに送信されたメッセージは、そのチャンネルに参加しているクライアントにのみ送られます。 そのチャンネルに参加しているユーザがいないサーバに対しては、そのサーバが途中経路になっていない限り送信されません。
ラベルとグローバル・ステータス・データベース
ネットワークに参加しているサーバやクライアントやチャンネルの情報は、サーバローカルなものを除いて基本的には全てのサーバで共有されている必要があります。 それらの情報は独立した名前空間で次の情報を識別子として管理されています。これらはラベルと呼ばれます。
- サーバ名
- ニックネーム
- チャンネル名
また、どのクライアントがどのサーバにログインしているかや、どのチャンネルに参加しているかの情報も全てのサーバに保持されます。 すなわち、メッセージを送信する時に、リレーして送信する必要のあるサーバがどれなのかそれぞれのサーバが自分で判断することができます。
クライアントの接続
クライアントが接続するときには次の手順を踏みます。
- 必要に応じてPASSコマンドでパスワードをサーバに送信
- USERコマンドでユーザ名や本名をサーバに送信
- NICKコマンドでニックネームをサーバに送信
提出した情報に問題がなければ以上でログインが完了し、あなたの接続情報は全てのサーバに登録されて、 サーバからウェルカムメッセージが帰ってきます。
ニックネームは9文字以下かつ英数字と記号の一部("[", "]", "\", "`", "_", "^", "{", "|", "}", "-")で構成されていなくてはならず、さらに最初の文字には数字と"-"を使用出来ません。また、大文字小文字は区別されません。
ここでラベルとしてはニックネームが使用されていたことを思い出してください。 つまり、ニックネームはネットワークで一意的でなくてはなりません。 一方ユーザ名は同じでも複数ログインすることが出来ます。
チャンネル
チャンネルはIRCの中核を成すグループチャットの「場所」です。 一つのIRCネットワーク上に多数のチャンネルが存在することが出来ます。 クライアントは参加したいチャンネル(もちろん複数可能)にJOINコマンドで参加して、 チャンネルに発言したり他の人がチャンネルに投稿した発言を受信して複数人で会話を行います。 なお、チャンネルから脱退する場合にはPARTコマンドが使用されます。
存在しないチャンネルに参加しようとした場合には、可能であれば新たなチャンネルが作成されます。 また、誰もいなくなったチャンネルは削除されます。
チャンネル名
チャンネル名にはいくつかの制約があります。
'&'か'#'か'+'か'!'で始まる。(チャンネルプレフィックス)
- 50文字以下
- スペース' '、ベル文字(0x7)、コンマ','を含まない
- 大文字小文字は区別されない
なお、コロン':'に特別な意味がありチャンネルマスクのデリミタとして用いられますがMMAのIRCサーバではサポートされていません。
チャンネルプレフィックスは名前の一部であることに注意してください。 チャンネルプレフィックスが異なれば別のチャンネル名として扱われます。
チャンネルプレフィックスの意味
チャンネルプレフィックスは次のような意味を持ちます。「チャンネルモード」については後述します。
prefix |
説明 |
'#' シャープ |
普通のチャンネル |
'&' アンパサンド |
サーバローカル。他のサーバに情報が送られないので、サーバ内部で独立したチャンネルになる。 |
'+' プラス |
チャンネルモードをサポートしないチャンネル |
'!' エクスクラメーション |
セーフチャンネル。チャンネル名が重複しないように注意深い手順によって作成される。(サポートされていない) |
チャンネルオペレータ
チャンネルオペレータは権限を割り当てられた参加者です。名前の前に@などを付けて表現されます。 チャンネルオペレータのみが行うことの出来るコマンドとして次のようなものがあります。
- KICK: クライアントをチャンネルから追い出す
- MODE: チャンネルのモードを変更する
さらに、以下のモードが有効の場合には次のコマンドも制限されます。
モードが+iの場合
- INVITE: 招待専用チャンネルに他のユーザを招待する
モードが+mの場合
- PRIVMSG: (クライアントや)チャンネルにメッセージを送る
モードが+tの場合
- TOPIC: トピックを変更する
チャンネルモード
主に管理に関わるチャンネルの設定を指します。チャンネルモードはIRC上からMODEコマンドによって変更できるようになっています。 MODEコマンドは一般的にはクライアントからは
/mode (チャンネル名) +t
あるいは、チャンネル上で
/mode +t
のようにして操作します。+tで有効に-tで無効にします。
チャンネルモードの一部を挙げると次のようなものがあります。詳しくはRFC2811の4. Channel Modesなどをご参照ください。
文字 |
説明 |
o |
+o (ユーザ)のように用いて、ユーザをオペレータにする |
i |
招待によってのみ参加可能 |
n |
参加者以外からのメッセージを受け付けない |
p |
参加者以外にチャンネルを隠す |
s |
参加者以外にチャンネルを隠し、情報を取得させない |
t |
トピックの変更をオペレータに限る |
トピック
トピックには、現在チャンネルで話し合われている内容などを表すための任意の文字列を設定できます。 トピックの変更はTOPICコマンドで行います。TOPICコマンドは一般的にはクライアントから
/topic (チャンネル名) 新トピック文字列
あるいは、チャンネル上で
/topic 新トピック文字列
のようにして行うことができます。
チャンネルモードが+tの場合は、トピックを変更できるのはチャンネルオペレータに限られます。
Ping/Pong
ネットワーク障害などの理由で接続されているが応答しない状態になったクライアントやサーバを検出するために、 Pingメッセージが送られてくることがあります。 これに対してPongメッセージを一定時間内に送らなかった場合、強制的に切断されます。
この処理はもちろんIRCクライアントが自動で行いますが、何らかの理由でPongが返信されなかった場合には "Ping timeout"という理由で切断されたと表示されることでしょう。