RFC2812 Internet Relay Chat: Client Protocolを読んでみた。（3.7 Miscellaneous messages）

# はじめに
どうも。こんにちは。
[42tokyo](https://42tokyo.jp/)といったところで、簡単なIRCサーバの実装を行なっています。
今回は、[RFC2812 Internet Relay Chat: Client Protocol 3.7 Miscellaneous messages](https://datatracker.ietf.org/doc/html/rfc2812#section-3.7)を読み、PINGコマンド、PONGコマンド、ERRORコマンドについて学んで行きたいと思います。

この記事の対象範囲は以下のとおりです。
* 3.7 Miscellaneous messages
  * ~~3.7.1 Kill message~~
  * 3.7.2 Ping message
  * 3.7.3 Pong message
  * 3.7.4 Error

間違い等があれば、ご指摘ください。

## 3.7 Miscellaneous messages
* 本節は、それまでの節には分類できないが、プロトコルに必要なメッセージについて説明する **[REQUIRED]**

### ~~3.7.1 Kill message~~
※ いまのところ実装対象外のため省略。
参考：[RFC2812 Internet Relay Chat: Client Protocol 3.7.1 Kill message](https://datatracker.ietf.org/doc/html/rfc2812#section-3.7.1)

### 3.7.2 Ping message
```
Command   : PING
Parameters: <server1> [ <server2> ]

Numeric Replies:
            409 ERR_NOORIGIN     ":No origin specified"
            402 ERR_NOSUCHSERVER "<server name> :No such server"

Examples:
  PING tolsun.oulu.fi             ; Command to send a PING message to server
  PING WiZ tolsun.oulu.fi         ; Command from WiZ to send a PING message to server "tolsun.oulu.fi"
  PING :irc.funet.fi              ; Ping message sent by server "irc.funet.fi"
```
* PINGコマンドは、正常に接続できているか確認するために使用
* クライアント＝サーバ間、サーバ＝サーバ間の両方で使用する
* サーバは、一定期間活動がなかった接続先に、PINGメッセージを送信する
* PINGメッセージ送信後、接続先（送信先）が設定された時間内に応答しなかった場合、その接続は閉じられる
* PINGメッセージは、その接続（コネクション）が、アクティブであっても送信してよい **[MAY]**
* PINGメッセージを受信した場合、できるだけ早く適切なPONGメッセージを\<server1\>宛に返信しなければならない **[MUST]**
* \<server1\>パラメータは、PINGメッセージの送信元を表す
* \<server2\>パラメータは、PINGコマンドのターゲットを表す
* \<server2\>パラメータが指定されている場合、PONGメッセージはそこに転送される

### 3.7.3 Pong message
```
   Command: PONG
Parameters: <server> [ <server2> ]

Numeric Replies:
           409 ERR_NOORIGIN     ":No origin specified"
           402 ERR_NOSUCHSERVER "<server name> :No such server"

Example:
  PONG csd.bu.edu tolsun.oulu.fi  ; PONG message from csd.bu.edu to tolsun.oulu.fi
```
* PONGメッセージは、PINGメッセージへの応答に使用する
* \<server2\>パラメータが与えられたPONGメッセージを受け取った場合、このメッセージは与えられたターゲット（\<server2\>）に転送されなければならない **[MUST]**
* \<server\>パラメータは、メッセージを生成したもの（エンティティ）の名前

### 3.7.4 Error

```
   Command: ERROR
Parameters: <error message>

  Numerics:
            None.

Examples:
   ERROR :Server *.fi already exists ; ERROR message to the other server which caused this error.
   NOTICE WiZ :ERROR from csd.bu.edu -- Server *.fi already exists
                                     ; Same ERROR message as above but sent to user WiZ on the other server.
```

* このコマンドは、サーバが使用する
* このコマンドは、サーバが仲間に重大（serious）なエラーや、致命的（fatal）なエラーを報告するときに使用する
* このコマンドは、サーバから別のサーバに送ることもできるが、知らないノーマルクライアントからは受け入れてはならない **[MUST NOT]**
（知らないノーマルクライアントが送ってきたERRORメッセージは無視する？）
* ERRORメッセージは、サーバ間リンクで発生したエラーの報告にのみ使用されるべき **[SHOULD]**
* ERRORメッセージは、相手側のサーバと適切なローカルユーザとログに送られる
(ERRORメッセージを受け取った相手側のサーバは、それを適切なローカルユーザとログに報告する)
* ERRORメッセージは、あるサーバから受信した場合、そのサーバから他のサーバに渡されることはない
* ERRORメッセージは、クライアント接続を終了する前にも使用する
* サーバが受信したERRORメッセージをオペレータに送るとき、そのメッセージはNOTICEメッセージの中にカプセル化されるべき **[SHOULD]**
（こうすることで、クライアントにエラーの責任がないことを示す）

# 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.

# さいごに
今回、コマンド実装は、PONGコマンドから始めてみました。
お試し感覚で実装し、全体の設計や処理の流れを把握するのに役立ったと思います。

次回は、PRIVMSG（NOTICE）コマンドの実装に入り始めたいと思います。
ありがとうございました！

# 参考
https://datatracker.ietf.org/doc/html/rfc2812

エンティティとは

https://wa3.i-3-i.info/word11594.html