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に規定されていない追加ヘッダを送信している」方が気持ち悪いのか、といった、思想の問題ということになります。