ネットワークプロトコルは、すべて特定の プロトコルファミリ と関連づけられています。 プロトコルファミリは、プロトコルが特定のネットワーク環境下で 機能できるようにするため、プロトコルの実装に対しての基本的な サービスを提供します。これらのサービスはパケットの分割および 統合、ルーティング、アドレッシング、そして基本的な転送なども 含まれるでしょう。現在のプロトコルの実装ではサポートされていません が、プロトコルファミリは、複数のアドレッシング方法を提供 するかもしれません。プロトコルファミリには、通常各 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) コールは、ネットワークインタフェースを操作するのに使われます。 Fn 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 /* インタフェースが使用 */ };
現在では非推奨のシステムコールは次の通りです。
アドレスを取得するための Fn ioctl リクエストと、 アドレス以外のデータを設定したり検索したりするためのリクエストについては、 今でも完全にサポートしており、 ifreq 構造体を使用しています。
新しい構造体を使用するリクエストは 2 つあります。
/* * 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 /* 返される構造体の配列 */ };