総合手引 | セクション 4 | English | オプション |
ネットワークプロトコルは、すべて特定の プロトコルファミリ と関連づけられています。 プロトコルファミリは、プロトコルが特定のネットワーク環境下で 機能できるようにするため、プロトコルの実装に対しての基本的な サービスを提供します。これらのサービスはパケットの分割および 統合、ルーティング、アドレッシング、そして基本的な転送なども 含まれるでしょう。現在のプロトコルの実装ではサポートされていません が、プロトコルファミリは、複数のアドレッシング方法を提供 するかもしれません。プロトコルファミリには、通常各 socket(2) タイプに 1 つずつというように、多数のプロトコルが含まれています。 プロトコルファミリは、すべてのソケットタイプをサポートする必要は ありません。プロトコルファミリには、同一のソケットアブストラクションをサポート するために、複数のプロトコルが含まれることがあります。
プロトコルは、 socket(2) で詳しく決められたソケットアブストラクションの 1 つをサポートします。 特定のプロトコルには、適切なプロトコルファミリとタイプのソケットを 作成するか、ソケットを作成する際に明示的にそのプロトコルを要求 することによってアクセスすることができます。プロトコルは、通常 1 種類のアドレスフォーマットのみを受け取ります。通常、そのアドレス フォーマットは、プロトコルファミリとネットワークアーキテクチャの デザインに必要なアドレッシング構造体を用いて定義されています。 ある基本的なソケットアブストラクションのセマンティクスは、 プロトコルに特有のものです。 プロトコルはすべてそれぞれに特有のソケットタイプについての基本モデル をサポートするようになっています。しかし、さらに、そのメカニズムに対して、 標準的ではない機構や拡張機能を提供することもあります。例えば、 SOCK_STREAM をサポートするプロトコルが、各帯域外 (out-of-band) メッセージにつき 1 バイト以上の帯域外メッセージを送信することができます。
ネットワークインタフェースは、デバイスインタフェースと似ています。 ネットワークインタフェースは、ネットワークサブシステムの最下位層 を構成します。これは、実際の送信用ハードウェアと相互に影響します。 ネットワークインタフェースは、 1 つ以上のプロトコルファミリやアドレスフォーマットをサポート可能です。 各ネットワークインタフェースのエントリの書式 (SYNOPSIS) のセクション には、 config(8) プログラムにシステムの詳細を提供する際に使われる、関連ドライバの 仕様の例があります。 診断 (DIAGNOSTICS) のセクションのメッセージ一覧は、 デバイスを操作中に起こるエラーに起因して、コンソールやシステムエラーログ /var/log/messages ( syslogd(8) を参照) 中に出力されるものです。
struct sockaddr { u_char sa_len; u_char sa_family; char sa_data[14]; };
sa_len フィールドには、この構造体全体の長さが入ります。この長さは 16 バイトを 超えるかもしれません。 次に示す sa_family 用のアドレス値は、システム側で既知なものです (将来実装されるかもしれないフォーマットも加えて、ここで定義しています)。
#define AF_UNIX 1 /* ローカルホスト (パイプ、ポート) */ #define AF_INET 2 /* インターネット: UDP, TCP など */ #define AF_NS 6 /* Xerox NS プロトコル */ #define AF_CCITT 10 /* CCITT プロトコル、X.25 など */ #define AF_HYLINK 15 /* NSC ハイパーチャネル */ #define AF_ISO 18 /* ISO プロトコル */
ユーザプロセス (あるいは、複数の相互に協調し合ったプロセス) は、 特別な種類のソケットを通してメッセージを送ることで、 このデータベースを管理しています。 この方法が、以前のリリースで使われていた固定長の ioctl(2) に取って代わりました。
この機構については、 route(4) に説明があります。
次の ioctl(2) コールは、ネットワークインタフェースを操作するのに使われます。 ioctl() 関数は、所望のドメインのソケット (特に SOCK_DGRAM 型) 上で実行します。以前のリリースでサポートされていたリクエストの多くは、 パラメータに ifreq 構造体を取っていました。この構造体は、次の形式です
struct ifreq { #define IFNAMSIZ 16 char ifr_name[IFNAMSIZ]; /* if 名であり、例えば "en0" */ union { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; short ifru_flags; int ifru_metric; int ifru_mtu; int ifru_phys; caddr_t ifru_data; } ifr_ifru; #define ifr_addr ifr_ifru.ifru_addr /* アドレス */ #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* p-to-p リンクのもう一方の終端 */ #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* ブロードキャストアドレス*/ #define ifr_flags ifr_ifru.ifru_flags /* フラグ */ #define ifr_metric ifr_ifru.ifru_metric /* メトリック */ #define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ #define ifr_phys ifr_ifru.ifru_phys /* 物理的な線 */ #define ifr_data ifr_ifru.ifru_data /* インタフェースが使用 */ };
現在では非推奨のシステムコールは次の通りです。
SIOCSIFADDR | プロトコルファミリ用のインタフェースアドレスを設定します。 アドレスの割り当てに続いて、 インタフェース用の ``初期化'' ルーチンが呼ばれます。 |
SIOCSIFDSTADDR | |
プロトコルファミリおよびインタフェース用の、 point to point アドレスを設定します。 | |
SIOCSIFBRDADDR | |
プロトコルファミリおよびインタフェース用の、 ブロードキャストアドレスを設定します。 | |
アドレスを取得するための ioctl() リクエストと、 アドレス以外のデータを設定したり検索したりするためのリクエストについては、 今でも完全にサポートしており、 ifreq 構造体を使用しています。
SIOCGIFADDR | プロトコルファミリ用の、インタフェースアドレスを取得します。 |
SIOCGIFDSTADDR | |
プロトコルファミリおよびインタフェース用の、 point to point アドレスを取得します。 | |
SIOCGIFBRDADDR | |
プロトコルファミリおよびインタフェース用の、 ブロードキャストアドレスを取得します。 | |
SIOCSIFFLAGS | インタフェースフラグのフィールドをセットします。もし、インタフェースが動作 していないという印 (down) がつけられたら、 現在そのインタフェースを通してパケットを ルーティングしているすべてのプロセスは通知を受けます。 インタフェースによっては、新たに入ってくるパケットをもう受け取らないように するためにリセットするものがあります。再び動作しているという印 (up) がつけられたら、 インタフェースは再初期化されます。 |
SIOCGIFFLAGS | インタフェースフラグを取得します。 |
SIOCSIFMETRIC | インタフェースのルーティングメトリックを設定します。 このメトリックは、ユーザレベルのルータのみで使用されます。 |
SIOCGIFMETRIC | インタフェースメトリックを取得します。 |
新しい構造体を使用するリクエストは 2 つあります。
SIOCAIFADDR | プロトコルによっては、 単一のインタフェースに対して複数のアドレスを関連付けられるものがあります。 このリクエストは、新たなアドレスを追加する 手段を提供します (あるいは、アドレスファミリ用のデフォルトアドレスが 指定されていれば、プライマリアドレスの特徴を変更します)。 終点アドレス、ブロードキャストアドレスあるいはネットワークマスクを 設定するために別々のシステムコールを作るのではなく (現在では、複数のプロトコルで必要不可欠な特徴です)、 これらの 3 つのものを同時に指定するために別々の構造体を用います (下記参照)。 各ファミリ専用に、この構造体を少し手直ししたバージョンを使用することも あるでしょう (各 sockaddr 構造体をファミリ特有のものに置きかえるなど)。 sockaddr 構造体自身がデフォルトの大きさよりも大きい場合には、 ioctl() のところで述べたように、 ioctl() 識別子自体を全体が入るように変更する必要があります。 |
SIOCDIFADDR | このリクエストは、インタフェースに関連付けられたリストから、 指定したアドレスを削除します。このリクエストは if_aliasreq 構造体も使用することにより、 複数のネットワークマスクや終点アドレスを プロトコルが許可することも可能にします。 また、デフォルトアドレスを指定することは、 このアドレスファミリに属するもののうちで、 このソケットを最初に開いたときの 最初のインタフェースアドレスを削除することを意味するという約束事を、 このリクエストは採用しています。 |
SIOCGIFCONF | インタフェースの設定リストを取得します。このリクエストは 値と結果の両用のパラメータ (value-result parameter) として ifconf 構造体を取ります (下記参照)。 ifc_len フィールドには、最初に、 ifc_buf で指し示されたバッファの大きさをセットしておかなくてはなりません。 戻るときに、このフィールドには設定リストのバイト単位の大きさが 入ります。 |
/* * SIOCAIFCONF で使用される構造体 */ struct ifaliasreq { char ifra_name[IFNAMSIZ]; /* if 名であり、例えば "en0" */ struct sockaddr ifra_addr; struct sockaddr ifra_broadaddr; struct sockaddr ifra_mask; };
/* * SIOCGIFCONF リクエストで使用される構造体。 * マシンのインタフェースの設定を検索するのに使用されます * (アクセス可能なネットワークをすべて分かっておかなくてはならない * プログラムに有用です)。 */ struct ifconf { int ifc_len; /* 関連バッファの大きさ */ union { caddr_t ifcu_buf; struct ifreq *ifcu_req; } ifc_ifcu; #define ifc_buf ifc_ifcu.ifcu_buf /* バッファアドレス */ #define ifc_req ifc_ifcu.ifcu_req /* 返される構造体の配列 */ };
BSD 4.2 | NETINTRO (4) | November 30, 1993 |
総合手引 | セクション 4 | English | オプション |
このマニュアルページサービスについてのご意見は Ben Bullock にお知らせください。 Privacy policy.