SPP(4P) — NEWS-OS Programmer’s Manual
名称
spp − Xerox の順次パケットプロトコル
形式
#include <sys/socket.h>
#include <netns/ns.h>
s = socket(AF_NS, SOCK_STREAM, 0);
#include <netns/sp.h>
s = socket(AF_NS, SOCK_SEQPACKET, 0);
解説
SPP プロトコルは、データの信頼できる、フロー制御の、双方向の伝送を提供します。 これは、SOCK_STREAM のアブストラクトをサポートするために使用される バイトストリームのプロトコルです。 SPP は、標準の NS(tm) アドレスフォーマットを使用します。
SPP プロトコルを利用しているソケットは、“アクティブ” か “パッシブ” のいずれかです。 アクティブなソケットは、パッシブなソケットへのコネクションを始めます。 デフォルトにより、SPP ソケットは、アクティブに作成されます。 パッシブなソケットを作成するためには、 listen(2) システムコールは、 ソケットと、 bind(2) システムコールをバインドしたあとで使用しなければなりません。 パッシブなソケットだけが、 accept(2) コールを使用して、入ってくるコネクションを受け入れることができます。 また、アクティブなソケットだけが、 connect(2) コールを使用して、コネクションを開始します。
パッシブなソケットは、複数のネットワークから入ってくるコネクションの リクエストを適合させるために、それらの位置を “指定下” におきます。 “ワイルドカードのアドレス指定” と名付けられたこの技法により、 サーバ 1 つで、複数のネットワーク上のクライアントへのサービスを 提供することができます。 すべてのネットワーク上でリッスンするソケットを作成するために、 すべてがゼロの NS アドレスを設定しなければなりません。 SPP ポートは、この時点でも指定されています。 ポートが指定されていない場合は、システムはポートを設定します(割当てます)。 いったんコネクションが確立されると、ソケットのアドレスは、 それに匹敵するエンティティの位置により固定されます。 ソケットが割当てられているアドレスは、ネットワークインターフェース (このインターフェースを介してパケットが伝送されたり、 受信されたりします)に対応するアドレスです。 通常、このアドレスは、匹敵するエンティティのネットワークに対応します。 SOCK_SEQPACKET ソケットの型が指定されている場合は、 受信された各パケットは、検査のためにユーザーに残された 実際の 12 バイトの順次パケットヘッダをもっています。
struct sphdr {
u_char sp_cc; /∗ コネクションの制御 ∗/
#define SP_EM 0x10 /∗ メッセージの終わり ∗/
u_char sp_dt; /∗ データストリームの型 ∗/
u_short sp_sid;
u_short sp_did;
u_short sp_seq;
u_short sp_ack;
u_short sp_alo;
};
これは、データストリームの型のフィールドおよびメッセージの終わりの ビットを利用する高水準の Xerox プロトコルのインプリメンテーションを 容易にします。 逆に、ユーザは、12 バイトのヘッダを供給するように要求されます。 検査されたその部分だけが、データストリームの型、 およびメッセージの終わりのフィールドです。 いずれのソケットタイプについても、送られたアテンションビットとともに 受信されたパケットは、out-of-band データとして解釈されます。 send(..., ..., ..., MSG_OOB) の形式で送られたデータは、 アテンションビットを設定させます。
診断
ソケットの操作は、返される次のエラーのうちの 1 つにより失敗します。
[EISCONN] すでにコネクションをもっているソケット上にコネクションを 確立しようとした。
[ENOBUFS] システムが内部データ構造のメモリを使い果たしてしまった。
[ETIMEDOUT] 過度の再伝送によりコネクションが外れた。
[ECONNRESET] リモートピアがコネクションをクローズさせた。
[ECONNREFUSED] リモートピアがアクティブに、コネクションの確立を拒んだ (通常、ポートに注意を向けている(リッスンしている)プロセスがないので)。
[EADDRINUSE] すでに割当てられているポートをもつソケットを作成しようとした。
[EADDRNOTAVAIL] ネットワークインターフェースが存在しないネットワークアドレスをもつ ソケットを作成しようとした。
ソケットのオプション
SO_DEFAULT_HEADERS
このオプションが設定されると、これは、データストリームの型、 およびメッセージの終わりのビットは、あらゆる次のパケット上に 設定されるのか否かを決定します。
SO_MTU これは、シングルパケット中のユーザデータの最大量を指定します。 デフォルトは 576 バイト − sizeof(struct spidp) です。 この量は、ウィンドウ作成に影響します。 すなわち、ソケット中のバッファリングの量を増加させることなく それを増やすと、受信された未読込みのパケットの数を少なくします。 デフォルト値以上のものはなにも、 bona fide XEROX 製品の インタネットワークルータによっては転送されません。 setsockopt コールのデータ引数は、符号なしのショートでなければなりません。
関連事項
バグ
ストリーム中のレコード境界を反映するための方法がいくつかなければ なりません。 ストリームモードについて、ユーザプロセスが受信しようとしている レコードのデータストリームの型を獲得するためのオプションが なければなりません。
NEWS-OSRelease 4.1C