NETINTRO(4) | FreeBSD Kernel Interfaces Manual | NETINTRO(4) |
名称
networking — ネットワーク機構の紹介書式
#include < sys/types.h>#include < sys/time.h>
#include < sys/socket.h>
#include < net/if.h>
#include < net/route.h>
解説
このセクションは、システムで利用可能なネットワーク機構の一般的な紹介です。セクション 4 のこの部分の文書は、3 つの領域に分割されます: プロトコルファミリ (ドメイン), プロトコル, ネットワークインタフェース です。すべてのネットワークプロトコルは、特定の プロトコルファミリ に関連しています。プロトコルファミリは、それが特定のネットワーク環境中で機能できるようにプロトコルの実装するための基本的なサービスを提供します。これらのサービスは、パケットの断片化と再アセンブリ、ルーティング、アドレシングおよび基本的な転送を含んでいます。現在のプロトコルの実装ではサポートされていませんが、プロトコルファミリは、複数のアドレシング方法をサポートします。プロトコルファミリは、通常 socket(2) タイプあたり 1 つの多くのプロトコルから成ります。プロトコルファミリは、すべてのソケットタイプをサポートする必要はありません。プロトコルファミリは、同じソケットの抽象化をサポートする複数のプロトコルが含まれています。
プロトコルは、 socket(2) で詳細なソケットの抽象化の 1 つをサポートします。特定のプロトコルは、適切なタイプとプロトコルファミリのソケットを作成すことによって、またはソケットを作成するときはっきりとプロトコルを要求することによってアクセスすることができます。通常、プロトコルは、プロトコルファミリ/ネットワークアーキテクチャのデザインに固有のアドレシング構造体によって決定する 1 種類のアドレスフォーマットだけを受け付けます。基本的なソケットの抽象化のセマンティクスは、プロトコルに特有です。すべてのプロトコルは、特定のソケットタイプのための基本モデルをサポートするはずですが、さらに、標準的でない機構または拡張メカニズムを提供することもあります。例えば、 SOCK_STREAM 抽象化をサポートするプロトコルは、帯域外メッセージ毎に帯域外の 1 バイト以上のデータを送信することができます。
ネットワークインタフェースは、デバイスインタフェースに似ています。ネットワークインタフェースは、実際の転送ハードウェアと情報をやりとりするネットワークサブシステムの最下位層を包括しています。インタフェースは、1 つ以上のプロトコルファミリおよびアドレスフォーマットをサポートできます。各ネットワークインタフェースのエントリの書式セクションは、 config(8) プログラムにシステム記述を提供する際に使用される関連ドライバのサンプル仕様があります。診断セクションは、コンソールシステムおよびデバイス操作におけるエラーに起因するシステムエラーログ /var/log/messages ( syslogd(8) 参照) に現れるメッセージをリストアップします
プロトコル
システムは、現在、インターネットプロトコル、Xerox Network Systems(tm) プロトコル、そして ISO OSI プロトコルのいくつかをサポートしています。生 (raw) ソケットインタフェースは、インターネットの IP プロトコル層と、Xerox NS の IDP プロトコルを提供しています。各プロトコルファミリのサポートに関する詳しい情報については、このセクションの適切なマニュアルページを参考にしてください。アドレッシング
各プロトコルファミリに関連づけられているのは、アドレスフォーマットです。すべてのネットワークアドレスは、以下で説明される sockaddr と呼ばれる一般的な構造体と結びついています。しかしながら、各プロトコルは、よりすばらしいより特有の構造体、一般的に上記でそれとなく説明されたプロトコルファミリマニュアルページで議論されている変形の名前を変えることを強要します。
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 プロトコル */
ルーティング (経路制御)
FreeBSD は、いくつかのパケットルーティング機構を提供します。カーネルは、ルーティング情報データベースを維持管理しています。それは、パケットを転送するとき適切なネットワークインタフェースを選択する際に使用されます。ユーザプロセス (または複数の協調プロセス) は、特別な種類のソケットを通してメッセージを送ることによって、このデータベースを維持管理しています。これは、以前のリリースで使用されていた固定サイズの ioctl(2) に取って代わります。
この機構は、 route(4) で説明されています。
インタフェース
システム内の各ネットワークインタフェースは、メッセージを送受信できるパスに対応しています。通常、ネットワークインタフェースは、それに関連しているハードウェアデバイスがありますが、ループバックインタフェース lo(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; struct ifreq_buffer ifru_buffer; short ifru_flags[2]; short ifru_index; int ifru_metric; int ifru_mtu; int ifru_phys; int ifru_media; caddr_t ifru_data; int ifru_cap[2]; } 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_buffer ifr_ifru.ifru_buffer /* 長さをつけてユーザによ って供給されるバッファ */ #define ifr_flags ifr_ifru.ifru_flags[0] /* フラグ (下位 16 ビット) */ #define ifr_flagshigh ifr_ifru.ifru_flags[1] /* フラグ (上位 16 ビット) */ #define ifr_metric ifr_ifru.ifru_metric /* メトリック */ #define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ #define ifr_phys ifr_ifru.ifru_phys /* 物理的な線 */ #define ifr_media ifr_ifru.ifru_media /* 物理的なメデア */ #define ifr_data ifr_ifru.ifru_data /* インタフェースによって 使用 */ #define ifr_reqcap ifr_ifru.ifru_cap[0] /* 要求された ケーパビリティ */ #define ifr_curcap ifr_ifru.ifru_cap[1] /* 現在のケーパビリティ */ #define ifr_index ifr_ifru.ifru_index /* インタフェース インデックス */ };
アドレスを取得するための ioctl() 要求と他のデータを設定して検索するための両方の要求は、まだ完全にサポートされていて、 ifreq 構造体を使用します:
- SIOCGIFADDR
- プロトコルファミリのためのインタフェースアドレスを取得します。
- SIOCGIFDSTADDR
- プロトコルファミリとインタフェースのためにポイントツーポイントアドレスを取得します。
- SIOCGIFBRDADDR
- プロトコルファミリとインタフェースのためにブロードキャストアドレスをを取得します。
- SIOCSIFCAP
- ifreq 構造体の ifr_reqcap フィールドの値へのインタフェースのための使用可能とされたケーパビリティフィールドを設定することを試みます。特定のインタフェースの機能に依存して、いくつかのケーパビリティは、使用可能とするために決め打ちされているように見えるかもしれないか、または、ケーパビリティを切り換えるのは、他のものの状態に影響するかもしれないことに注意してください。サポートしているケーパビリティフィールドは、読み込み専用で、 ifr_curcap フィールドは、この呼び出しでは未使用です。
- SIOCGIFCAP
- インタフェースケーパビリティフィールドを取得します。サポートされたケーパビリティの値と利用可能なケーパビリティの値は、 ifreq 構造体の ifr_reqcap と ifr_curcap フィールドにそれぞれ返されます。
- SIOCGIFDESCR
- ifru_buffer 構造体の buffer フィードで返された、インタフェース記述を取得します。ユーザ供給のバッファの長さは、パラメータとして渡された ifru_buffer 構造体の length フィールドで定義されるべきです、そして、長さは、終端のヌル (nul) 文字を含んでいます。インタフェースの長さを保持するための空間が十分でないなら、コピーは、行われず、 ifru_buffer の buffer フィールドが、NULL に設定されます。カーネルは、バッファ自体がデータを保持するために足りるかどうかに関係なく、返り時に length フィールドにバッファ長を格納します。
- SIOCSIFDESCR
- (終端のヌル (nul) をカウントして) バッファの長さを指定する length フィールドをつけて ifru_buffer 構造体の buffer フィールドの値にインタフェース記述を設定します。
- SIOCSIFFLAGS
- インタフェースフラグフィールドを設定します。インタフェースがダウン (down) とマークされるなら、現在インタフェースを通してパケットをルーティングしているすべてのプロセスに通知されます。いくつかのインタフェースは、もはや着信してくるパケットを受信できないように、リセットされます。再びアップ (up) とマークされるとき、インタフェースは、再初期化されます。
- SIOCGIFFLAGS
- インタフェースフラグを取得します。
- SIOCSIFMETRIC
- インタフェースルーティングメトリックを設定します。このメトリックは、ユーザレベルのルータによってのみ使用されます。
- SIOCGIFMETRIC
- インタフェースメトリックを取得します。
- SIOCIFCREATE
- 指定されたインタフェースを作成することを試みます。ユニット番号なしでインタフェース名を与えるなら、システムは、任意のユニット番号で新しいインタフェースを作成することを試みます。成功すれば新しいインタフェース名を含む ifr_name フィールドを返します。
- SIOCIFDESTROY
- 指定されたインタフェースを破壊することを試みます。
新しい構造体を使用する 2 つの要求があります:
- SIOCAIFADDR
- インタフェースには、いくつかのプロトコルで 2 つ以上のアドレスに関連しているかもしれません。この要求は、追加アドレスを加える (またはアドレスファミリのためのデフォルトアドレスが指定されるなら、プライマリアドレスの特性を変更する) 手段を提供します。宛先 (終点) かブロードキャストアドレスまたはネットワークマスク (現在では、複数のプロトコルで不可欠な特徴) を設定するために別々の呼び出しを行うよりむしろ、別々の構造体がすべての 3 つのことがらを同時に指定するために使用されています (下記参照)。 (各 sockaddr をファミリ特有のタイプのひとつに置き換える) 各ファミリのためにこの構造体の仕様のわずかに調整されたバージョンを使用するでしょう。 sockaddr 自体がデフォルトサイズより大きい場合は、 ioctl() で説明されるように、合計のサイズを含むように ioctl() 識別子自体を変更する必要があります。
- SIOCDIFADDR
- この要求は、インタフェースに関連しているリストから指定されたアドレスを削除します。また、要求は、複数のマスクまたは宛先 (終点) アドレスを許すプロトコルの可能性を考慮した ifaliasreq 構造体を使用し、同様に、デフォルトアドレスの指定は、オリジナルのソケットがオープンされたアドレスファミリに帰属するインタフェースへの最初のアドレスを削除することを意味する約束事を採用します。
- SIOCGIFCONF
- インタフェースの設定リストを取得します。この要求は、値結果 (value-result) パラメータとして ifconf 構造体 (下記参照) を取ります。 ifc_len フィールドは、最初に、 ifc_buf によって指されたバッファのサイズに設定されるべきです。返るときに、そのフィールドには、設定リストの長さをバイト単位で含みます。
- SIOCIFGCLONERS
- クローン可能 (clonable) インタフェースのリストを取得します。この要求は、値結果 (value-result) パラメータとして if_clonereq 構造体 (下記参照) を取ります。 ifcr_count フィールドは、 ifcr_buffer によって指されるバッファに適合することができる IFNAMSIZ サイズの文字列の数に設定されるべきです。返るときに、 ifcr_total は、クローン可能 (clonable) インタフェースの数とに設定され、そして、バッファは、 IFNAMSIZ 境界で整列されたクローン可能インタフェースの名前が入れられた ifcr_buffer によって指されます。
/* * SIOCAIFADDR 要求で使用される構造体. */ 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 /* 返される構造体の配列 */ };
/* SIOCIFGCLONERS 要求で使用される構造体. */ struct if_clonereq { int ifcr_total; /* クローンナの合計 (出力) */ int ifcr_count; /* ユーザバッファ中の部屋の数 */ char *ifcr_buffer; /* クローンナ名のバッファ */ };
/* SIOCGIFDESCR と SIOCSIFDESCR 要求で使用される構造体 */ struct ifreq_buffer { size_t length; /* バッファの長さ */ void *buffer; /* ユーザランド空間のバッファへの ポインタ */ };
歴史
netintro マニュアルページは、 4.3BSD-Tahoe で登場しました。January 26, 2012 | FreeBSD |