VOS 上での loopback network の注意点2006年07月03日 11時28分42秒

今回のは Continuum 上でのみの話。まずは、簡単に背景を。VOS には現在二通りの TCP/IP の実装がある。OS TCP と Stream TCP である。OS TCP は Stratus 実装の古いもの。Stream TCP は新しい実装だ。Stream TCP は BSD の実装を移植したものだったはず。ftServer には Stream TCP しかない。

今回、問題があったのが UDP。もしかしたら TCP でも同じことが当てはまるかも知れないが、実証実験はしていない。

問題は、OS TCP 実装のプログラムと Stream TCP 実装のプログラムが通信できなかったこと。

OS TCP 側が送り手で、Stream TCP 側が受け手だった。これが、ループバックを通して UDP を送る。netstat -a で試したところ、UDP を listen しているのは確認した。送り手も送っているのであるが、受信側が受け取れないのである。

ループバックを通した場合の TCP スタックフレームの実装の違いが問題だった。

外部からの接続の場合は、OS TCP も Stream TCP も関係ない。お互いに通信もできる。しかし、ループバックを使った場合は、できないらしい。普通のネットワークデバイスであれば、送信時に TCP スタックを積み、IP に分割し、物理層に電気を流す。それがループバックだと TCP 層のスタックのまま、受け取り手に渡されるらしい。

それゆえ、実装の違う OS TCP と Stream TCP はループバックを通しての通信はできないらしい。この事実を知らなかったのと、実装が入れ替わっていたのを知らなかったので、余計な時間を喰ってしまった。

なお、ループバックで listen したいときは 127.0.0.1 のアドレスを使い、外部からの接続を受けたいときは 0.0.0.0 のアドレスを使うらしい。この部分は VOS 特有らしいと聞いたが定かではない。