スポンサーリンク

NETINTRO(4) FreeBSD カーネルインタフェースマニュアル 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 をサポートするプ ロトコルが、各帯域外 (out-of-band) メッセージにつき 1 バイト以上の帯域外 メッセージを送信することができます。

ネットワークインタフェースは、デバイスインタフェースと似ています。ネット ワークインタフェースは、ネットワークサブシステムの最下位層を構成します。 これは、実際の送信用ハードウェアと相互に影響します。ネットワークインタ フェースは、 1 つ以上のプロトコルファミリやアドレスフォーマットをサポート 可能です。各ネットワークインタフェースのエントリの書式 (SYNOPSIS) のセク ションには、 config(8) プログラムにシステムの詳細を提供する際に使われる、 関連ドライバの仕様の例があります。診断 (DIAGNOSTICS) のセクションのメッ セージ一覧は、デバイスを操作中に起こるエラーに起因して、コンソールやシス テムエラーログ /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 プロトコル */

ルーティング

UNIX では、パケットのルーティング機構がいくつか提供されています。カーネル は、ルーティング情報データベースを管理しています。このデータベースは、パ ケットを転送するときに適切なネットワークインタフェースを選ぶ際に使用され ます。

ユーザプロセス (あるいは、複数の相互に協調し合ったプロセス) は、特別な種 類のソケットを通してメッセージを送ることで、このデータベースを管理してい ます。この方法が、以前のリリースで使われていた固定長の 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;
        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 /* 返される構造体の配列 */
};

関連項目

ioctl(2), socket(2), intro(4), config(8), routed(8)

歴史

netintro マニュアルは、 4.3BSD−Tahoe で出現しました。

4.2 Berkeley Distribution November 30, 1993 4.2 Berkeley Distribution

スポンサーリンク