CTCP SSTP 概説

天狼星の欠片2で使われているCTCP SSTPについて解説します。
Copyright (C) 2001 by YoR@Kyaratech

Create 2001/03/15
Update 2001/03/21
Update 2001/03/23
Update 2001/03/28
Update 2001/03/29
Update 2001/04/04
Update 2001/06/17
Update 2001/06/19
Last update 2001/09/29 УοR(yorzbszy@nifty.com)

CTCP SSTPについて

CTCPは、IRCクライアント間でのデータ交換の為に作られたIRCの拡張機能です。 この文章の目的は、これにSSTPを転送するためのCTCP SSTPを追加することです。

IRCとCTCPの技術的解説は他に文章があるので、ここでは必要な部分のみ触れます。
IRCについての詳細は、

RFC2810RFC2811RFC2812RFC2813 (原文)
RFC2810RFC2811RFC2812RFC2813 (日本語訳)

を参照してください。

CTCPについてはctcp.newという英文ドキュメントが存在します。 実は何度か日本語訳を作ろうとしたのですが、そのたびに挫折しています(涙)。
(2001/09/29追加)やっと日本語訳を完了しました。まだ準備稿みたいな物ですが、興味のある方は誤訳でも指摘するつもりで読んでみてください。

CTCPの基礎

(この文章では、数値や文字列の表現にC言語の表記を使っています。他の言語で実装する場合はそれぞれ読み替えてください)

CTCPはIRCのコマンドの PRIVMSG か NOTICE を使って送られます。 その際、通常のメッセージと区別を付けるために、0x01をCTCPメッセージの前後につけて送ります。
"PRIVMSG Sakura \x01VERSION\x01"
    

CTCPには、メッセージの中に8bitコードの全てを埋め込めるように、二種類のエンコードが用意されています。 CTCPのメッセージの内部用と、通常のIRCメッセージ用に分けられています。

CTCPは区切りとして0x01を利用しますが、それが通常のIRCのメッセージに入っていると誤認識してしまいます。それを防ぐために、IRCのメッセージの中の0x01を他の文字に変更します。 0x01は"\a"に、'\'は'\\'に変換されます。
0x01       → \ a (0x5c 0x61)
 \  (0x5c) → \ \ (0x5c 0x5c)
    
\hえんい〜\uえんい〜\e
    
はこう変換されます。
\\hえんい〜\\uえんい〜\\e
    
もう一つの変換は、NULL文字(0x00)や改行文字(0x0a,0x0d)をメッセージの中に埋め込む為のものです。この変換によって、あらゆる文字を送ることができます。
この変換は、次の4種の文字の交換で行います。
0x00 → 0x10 0    (0x10 0x30)
0x0a → 0x10 n    (0x10 0x6e)
0x0d → 0x10 r    (0x10 0x72)
0x10 → 0x10 0x10 (0x10 0x10)
    
受け取った側では、この二段階の変換を逆にしてデコードします。

CTCP SSTPの詳細

CTCP SSTPでは、CTCPのコマンドタグとして、"SSTP"を使います。 その後にスペース(0x20)を一つ入れてSSTPの本文を続けます。
IRCの一行の文字数が512文字(改行コードを含む)に制限されているので、 SSTPを埋め込むとそれを越えることがあります。 そのようなときには、適当に区切れる所でスクリプトを分割し、 複数回に分けて送信してください。
update 2001/04/04
スクリプトの分割はCTCPに埋め込むためのエンコードに引っかからなければ、どこで切ってもかまいません。
受信した後文字化けを起こすことなく結合されることが要求されます。
ただし分割した最後のメッセージには"\e"を含めてください。 この2文字がスクリプトの最後を示す目印になります。

CTCP SSTPで送られるスクリプトは、ここで述べられているものをそのまま送ります。
実際にIRCサーバーに送られるメッセージは、上記のエンコードを行った後、以下のようなものになります。
(書式をCの文字列のものにしているので、\の文字は\\となっていることに注意してください)

"PRIVMSG sakura \x01SSTP SEND SSTP/1.1\x10r\x10nSender: カードキャプター\x10r\x10nScript: \\\\h\\\\s0いくら大学教授とはいえ‥‥\\\\w8\\\\w8書斎に偶然あんな本が置いてあったと思うか?\\\\e\x10r\x10nOption: nodescript,notranslate\x10r\x10nCharset: Shift_JIS\x10r\x10n\x10r\x10n"
   
これは元々はこのようなスクリプトです。
SEND SSTP/1.1
Sender: カードキャプター
Script: \h\s0いくら大学教授とはいえ‥‥\w8\w8書斎に偶然あんな本が置いてあったと思うか?\e
Option: nodescript,notranslate
Charset: Shift_JIS


これをそのまま何か。に送れば反応します。

update 2001/04/04
現在の天狼星の欠片2では、スクリプト中の2バイト文字は変換せずにCTCP SSTPに埋め込んでいます。
CTCP SSTPはスクリプトの文字コードについては規定しません。

update 2001/03/21
何か。に送るSSTPはPRIVMSGで送ります。
何か。からのリターンはNOTICEで返されます。
update 2001/03/28
そのときには、PRIVMSGで送ってきた相手に直接送り返します。

"NOTICE shaoran :\x01SSTP SSTP/1.1 200 OK\x10r\x10n\x10r\x10n\x01\x0d\x0a"

以下は著者のメモです
チャンネルに送ったメッセージからのリターンは、送り主に戻されるべきだろうが、 大量のリターンが来る可能性はある。
チャンネルに送るSSTPに制限を加えるべきだろうか。
SSTPで送られるタグのセキュリティについて指摘された。基本的にローカルでSSTPは何か。に送られる訳なので、セキュリティについては厳しくする必要があると思われる。
サーバースプリットの為の予防策は必要だろうか。
時系列の混乱に対処する必要はあるか。

リンクについて
以下はこのページ(http://homepage1.nifty.com/YoR/ctcpsstp.html)についてのリンクの要件です。

このページはフリーリンクです

当ページへのリンクはご自由にしていただいてかまいません。
書籍にURLを掲載することもURL及び出典の表記を条件に許可いたします。
また内容の改変がない転載はURLの表記を条件に全て許可いたします。
その他、ご質問がある場合はお問い合わせ下さい。

この文章について気がついた点が有ればこちらへメールか シリウス掲示板へどうぞ
天狼星の欠片2のページ