Inside.
DirectSSTPにおける追加ヘッダ送出について
仕様
SSTP Bottle Clientは、SSTP送信時に以下の追加ヘッダを送信します。
追加ヘッダについて、元のSSTP仕様では何ら言及されていないため、この追加ヘッダの存在によってエラーを返すSSTPサーバがあってもおかしくないのですが、現在のところそのようなものは存在しないようです。
クライアント側の設定でこれら追加ヘッダの送出は禁止できます。
- X-Bottle-IfGhost
- SSTP Bottleサーバから送られてきた「指定ゴースト」です。つまりメッセージ送信元が指定したゴーストです。
selfname側のみが返り、keronameは含まれません。(例「さくら」)
解説
X-Bottle-IfGhostの存在する理由については少々説明が必要なので、具体的に例を挙げます。
SSTP Bottle
Clientでは、allowunspecified対策のために、「SSTP送信対象のゴーストに向けてIfGhostを必ず付けて送る」ことにしています。
FMOによると「さくら」が起動していないが「なる」だけが起動している、という状況で、「さくら」が対象のボトルが流れてきたとします。
SSTP Bottle Clientは、まず「さくら」を探しますが、FMOに「さくら」が存在していないので、仕方なく「なる」に「IfGhost:
なる,ゆうか」というヘッダを付けて、「これは奈留向けのSSTPである」と偽装してSSTPを送信します。(IfGhostが付いていない場合にSSTP受信を拒否するゴーストが少数ですが存在しますし、最近ではむしろIfGhostの指定によってその指定ゴーストが起動してくれるものも多いため、IfGhostは必ず付けることにしています)
ところが、大量ゴースト環境が整備されるようになり、FMOが大きくなりすぎると困る(速度とかサイズ制限とか国勢調査とか)、仮想起動はしたくない、或いはそもそもFMO自体が頻繁に壊れる、といった理由で、設定によっては「いつでも再生可能なゴーストをFMOに登録していない」という挙動をするSSTPサーバが(複数)存在します。
本来なら再生先のゴーストはSSTP
Bottle側で検索して判断しているのですが、FMOに登録されていない場合はどうしようもありません。そこでこの例では、「奈留しかFMOには見つからないから奈留に送ります、でも実は本当はさくら宛てだったんですけどね」という意味で、「X-Bottle-IfGhost:
さくら」を送出するわけです。
最終的に送信されるのは、たとえば以下のようなものになります。
SEND SSTP/1.4
Sender: SSTP Bottle / チャンネル / さくら
Charset: Shift_JIS
IfGhost: なる,ゆうか
Script: \t\h\s[5]\_sな~。\e
HWnd: 7743
X-Bottle-IfGhost: さくら
SSTPサーバ側は、こういう事情や追加ヘッダを全く無視して、普通に起動している「奈留」でSSTPを再生しても、まったく問題ありません。通常の仕様はそうなっています。
でも、もしSSTPサーバ側で、「FMOには登録してないんだけど、実はさくらで再生してもいいんだよね」といった事情がある場合には、「さくら」のゴーストを検索して、そちらで再生するのもいいかもしれません。
この仕様は、SSTPサーバ自体が複数起動している場合にはうまく動作しません。
サーバAが「なる」を起動していて、サーバBがX-Bottle-IfGhostに対応して「さくら」も再生できるが、「双葉」しかFMOに登録していない、という状況を考えます。「さくら」宛てのボトルを、SSTP
Bottle
ClientがサーバAに送信するかサーバBに送信するかは不定(今のところはFMOに登録されていた順になっていますが)です。サーバBに届けば「さくら」がしゃべるでしょうが、サーバAに行った場合には「なる」が喋るしかありません。
方針 | 利点 | 欠点 |
---|---|---|
FMOに全部登録 | 標準に準拠 | FMOが大きくなりすぎる |
追加ヘッダを見る | FMOに全部登録しなくていい | 追加ヘッダが気持ち悪い/サーバが複数あると意図通り動作しない |
注意
Senderヘッダにも、「SSTP Bottle / チャンネル名 /
ゴースト名」の形で、元々ボトルサーバによって指定されていたゴースト名が含まれています。
従来から、いくつかのSSTPサーバが、この仕様を利用して、X-Bottle-IfGhostと同じ目的でゴースト名を取得しています。
ただし、Senderがころころ変わるのは本来のSSTPの思想的によろしくない「かも」しれませんので、Senderにゴースト名が含まれる仕様は将来的に廃止されるかもしれません。X-Bottle-IfGhostに対応するほうが、まだ幸せになれると思います。
また、この追加ヘッダの仕様が嫌いな場合は、普通にFMOに再生可能なゴーストをすべて登録すればいいだけなので、そうしてください。
「真の意味での起動はしていないがSSTPが受信可能なゴーストをFMOに登録して起動しているように見せかけ
る(仮想起動)」方が気持ち悪いのか、「SSTPに規定されていない追加ヘッダを送信している」方が気持ち悪いのか、といった、思想の問題ということになります。