|
HOME > Linux Tips ( 目次 ) > Linux コマンド 一覧表 > i > ipv6 - 約束事その他の説明 ipv6 - 約束事その他の説明 - Linux コマンド集 一覧表名前ipv6, PF_INET6 - Linux の IPv6 プロトコル実装 書式
#include <sys/socket.h>
説明Linux 2.2 では、Internet Protocol, version 6 を オプションとして実装している。 この man ページでは、Linux カーネルと glibc 2.1 での実装に基づいて、 IPv6 の基本的な API を解説する。 インターフェースは BSD ソケットインターフェースをもとにしている。 socket (7) を見よ。 IPv6 API は、ほぼ ip (7) v4 API と互換になることを目指している。 この man ページでは相違点のみを解説する。 AF_INET6 ソケットを何らかのプロセスにバインドするには、 ローカルアドレスを in6_addr 型の変数 in6addr_any からコピーしてくる必要がある。 static な初期値 IN6ADDR_ANY_INIT も用いることができ、これは定数式に展開される。 これらの両者はネットワークバイトオーダーである。 IPv6 のループバックアドレス (::1) は global 変数 in6addr_loopback から取得できる。初期化には IN6ADDR_LOOPBACK_INIT を用いるべきである。 IPv4 接続も v6 API で扱うことができる。これには v4-mapped-on-v6 アドレス型を用いる。 こうすればプログラムは v6 の API をサポートするだけで、 両方のプロトコルをサポートできる。 これは libc 内部のアドレスを扱う関数によって透過的に処理される。 IPv4 と IPv6 はローカルポート空間を共有する。 IPv4 の接続 (またはパケット) を IPv6 ソケットが取得すると、 発信元アドレスが v6 にマップされ、その接続 (パケット) も v6 にマップされる。 アドレスのフォーマット
struct sockaddr_in6 {
u_int16_t sin6_family; /* AF_INET6 */
u_int16_t sin6_port; /* port number */
u_int32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
u_int32_t sin6_scope_id; /* Scope ID (new in 2.4) */
};
sin6_family は常に AF_INET6 に設定される。 sin6_port はプロトコルポートである ( ip (7)の sin_port を見よ)。 sin6_flowinfo は IPv6 のフロー指定子 (flow identifier) である。 sin6_addr は 128 ビットの IPv6 アドレスである。 sin6_scope_id はアドレスのスコープに依存した ID である (これは Linux 2.4 で導入された)。 Linux の場合は、これはリンクスコープアドレスでしかサポートされない。 この場合 sin6_scope_id にはインターフェースのインデックスが含まれることになる ( netdevice (7)を見よ)。 IPv6 は何種類かのアドレスタイプをサポートする。 単一のホストをアドレスするための unicast、 ホストのグループをアドレスするための multicast、 ホストのグループ中で最も近くにいるものをアドレスするための anycast (これは Linux では実装されていない)、 IPv4 ホストをアドレスするための IPv4-on-IPv6。 他にも予約済みのアドレスタイプがある。 IPv6 でのアドレス表記は 2 桁の 16 進数 16 個からなり、 ':' は区切り文字はで、'::' は 0 ビットの文字列を表す。 特殊なアドレスとして、ループバックを表す ::1、 IPv4-mapped-on-IPv6 を表す ::FFFF::<IPv4 アドレス> がある。 IPv6 のポート空間は IPv4 と共有されている。 ソケットオプションIPv6 はプロトコル固有のソケットオプションをいくつかサポートしている。 これらは setsockopt (2)で設定でき、 getsockopt (2) で取得できる。 IPv6 のソケットオプションレベルは IPPROTO_IPV6 である。 ブール整数のフラグは、偽のとき 0 で、それ以外は真である。
バージョンIPv6 API を libc5 ベースで Linux 向けに実装した、以前の libinet6 についてはここでは記述していない。 おそらく細かいところには相違点があるだろう。 Linux 2.4 では 64 ビットのホストに対して sockaddr_in6 のバイナリ互換性が保たれていない。 in6_addr のアラインメントが変更され、また sin6_scope_id フィールドが新たに追加されたからである。 カーネルインターフェースの互換性は保たれているが、 sockaddr_in6 や in6_addr を他の構造体に含んでいるようなプログラムでは 保たれないかもしれない。 これは i386 のような 32 ビットのホストでは問題にならない。 sin6_flowinfo フィールドは Linux 2.4 で登場した。 これが渡されたアドレス長に含まれていると、 カーネルに透過的に渡され、読まれる。 より長いアドレスバッファを渡し、 そして送信アドレスの長さをチェックするようなプログラムは うまく動かないかもしれない。 移植上の注意sockaddr_in6 構造体はジェネリックな sockaddr よりも大きい。 すべてのアドレスタイプが struct sockaddr の中に安全に納められると仮定しているプログラムは、代わりに struct sockaddr_storage を用いるように変更する必要がある。 バグIPv6 拡張 API は、現在まだ RFC2292 を完全には実装していない。 2.2 カーネルは受信オプションをほぼ完全にサポートサポートしているが、 glibc2.1 には IPv6 オプションを生成するマクロが存在していない。 EH および AH ヘッダ での IPSec のサポートは存在しない。 フローラベル管理はまだ完全でなく、ここにも記述されていない。 この man ページはまだ完成していない。 関連項目RFC2553: IPv6 BASIC API. Linux tries to be compliant to this. RFC2460: IPv6 specification.
|
|