バケット - みる会図書館


検索対象: UNIX MAGAZINE 2003年1月号
21件見つかりました。

1. UNIX MAGAZINE 2003年1月号

図 1 連載 / IPv6 の実装ーの 向け直しが発生する例 インターネット ルータ A ホスト B ホスト Z サイト Y ルータ X タ通知を受信します。ホスト B がデフォルトルータとし てルータ A を選んだとすると、ホスト B から送信される バケットはルータ A を経山して転送されます。したがっ て、ホスト B がホスト Z と通信しようとした場合もます ルータ A にバケットカヾ度されます。しかし、ルータ A か らインターネットを経由してサイト Y に転送したあとに ようやくホスト Z に到達するよりも、直接サイト Y に 接続しているルータ X にバケットを渡すはうか効率的で す。ルータ A はインターネット上の他のルータと糸習各・情 報を交換しているので、ホスト Z 宛のバケットはルータ A と同一リンクに存在するルータ X に渡したほうが通切 であることを知っています。そこで、ルータ A はホスト 、、ホスト Z 宛のバケットはルータ X に渡せ " と指 1057 case ND_REDIRECT: 中のマクロ名は ND-REDIRECT です。 も独自のタイフ。番号か割り当てられています。 前回解説した ICMP メッセージと同様に、向け直しに 向け直しの処理 示します。これカ鉤け直しです。 プログラム 路制彳卸機能を備えていなくても通信できるように設計さ れています。その彳齬リを担うのが、近謝架索 (Neighbor Discovery)[3] の解説 ( 2002 年 6 ~ 7 月号 ) で紹介した ルータ通知 (Router Advertisement) です。ルータ通 知を受信したホストは、そのルータをデフォルトルータと し、自分が送信するバケットをデフォルトルータに渡しま す。ルータはすべてのバケットを適切に中幻医するための清 報をもっているので、いったんルータにバケットを渡して しまえは、山辭冬目的地まて転送されると予想できます。 ー物のシナリオでは、ホストカ鮟続しているリンクにル ータが 1 台しかないことを前提にしています。ルータが 2 台以上存在していたら、ホストはどのようにルータを使 い分けたらよいのでしようか。この場合、ホストはルータ 通知を送信してきたルータのなかから任意の 1 台をデフォ ルトルータとして登録し、そのルータにバケットを渡しま す。選はれなかったルータは、予備のデフォルトルータと して言当求されます。最初に選んだデフォルトルータへの到 選生が失われた場合は、予備のなかから新たにデフォルト ルータを〕尺します。 複数のルータを使い分けるシナリオはもう 1 つ考えられ ます。宛先によってルータを尺するという方法です。 れは、ホストが初勺な糸各制御をおこなうと考えること もできます。今回解説する向け直しは、後者のシナリオを : 滝見するためのものです。図 1 に、向け直しが発生する構 成の例を示します。 図 1 のホスト B は、ルータ A とルータ X からルー UNIX MAGAZINE 2003.1 10 59 1060 if (code ! = 0 ) goto badcode ; 向け直しメッセージのコード番号は定義されていませ ん。 0 で初期化されている必要があります。 if (icmp61en く sizeof(struct nd—redirect) ) 1061 1062 goto badlen ; 受信した IC P バケットカ鉤け直しメッセージをオ褓内 するために必要な長さをもたない場合は、バケットを破棄 します。向け直しメッセージは nd•edirect 構造体で定 義されています ( 図 2 ) 。 ncl•dA1dr は icmp6-hdr 構造体の変数です。この変 数はすべての ICNIP メッセージに共通の情報尉寺しま す。 nd-rd-target はより通切な向け直し先ノードのアド レスで、図 1 の例ではルータ X に相当します。 nd-rd-dst は向け直しメッセージの原因となった IP バケットの終点 アドレスです。図 1 の例ではホスト Z に相当します。 if ((n = m-copym(), 0 , M-COPYALL, 1063 M_DONTWAIT) ) = NULL) { 57

2. UNIX MAGAZINE 2003年1月号

連載 / IPv6 の実装ーの 図 2 nd-redirect 橢制本の定義 (icmp6. h) 385 386 387 388 389 390 1065 1066 1067 1068 } struct nd—redirect { struct in6_addr struct in6_addr struct icmp6-hdr / * redirect * / nd_rd_hdr ; nd—rd—target ; nd_rd_dst ; / * could be followed by options * / icmp6—redirect—input (m , 0ff) ; goto freeit ; m = NULL ; 2733 if (ip6—forwarding) 2734 goto freeit; 向け直しメッセージを受信したホストは、自分かイ尉寺し ている糸習各制御表を更新するとともに、 ICMP メッセージ を待ち受けているローカルソケットにメッセージを酉当医し なけれはなりません。 1 , 063 行目で、受信した ICMP メッ セージをコピーします。コヒーに失敗した場合はローカル ソケットへの酉当を断念し、 icmp6-redirect-input() で 向け直しメッセージを処理したあと、 1 , 067 行目で icmp6 -input() を終了します。 icmp6—redirect—input ( Ⅱ , 0ff) ; 1069 1071 break; コピーできた場合は、コピーされた向け直しメッセージ Ⅱを icmp6-redirect-input() で処理し、ローカルソケッ トへの酉当処理に進みます。 ケットが適切なノードに送られるようになります。 を icmp6•edirect-input() で更新することで、以後のパ 向け直しメッセージの原因となったノードへの糸響各制彳卸表 ッセージて指定されたノードに送らなけれはなりません。 しの原因となった宛先へのバケットを送信する際には、メ 向け直しメッセージを受信したホストは、以後向け直 向け直しメッセージの正当性の確認 変数 ip6%rwarding はノードのバケット中幻医機能を制 御します。 ip6-forwarding か真の場合、ノードはバケッ トを転送するルータとして機能します。ルータは向け直し メッセージを処理しないため、ノードがルータとして動作 している場合は 2 , 734 行目で向け直しメッセージを破棄 します。なお、 ip6-forwarding は sysctl コマンドで変 史できます。 2735 if ( ! icmp6—rédiraccept) 2736 goto freeit; 2710 2711 2712 2713 2714 void icmp6-redirect-input (), 0ff) struct mbuf *m ; int off ; m は向け直しメッセージを含む IP バケットへの mbuf ポインタ、 off は IP ヘッダのツ頁から ICMP ヘッダの 58 : 麪頁までのオフセットです。 KAME では、向け直しバケットを受理するかどうか を変数 icmp6-rediraccept で制御できます。向け直しを 受理しない設定になっていれば、 2 , 736 行目で向け直レヾ ケットを破棄します。 icmp6-rediraccept も sysctl コマ ンドで変更できます。 2739 IP6_EXTHDR_CHECK(), off , icmp61en, ) ; 2740 nd_rd = (struct nd—redirect * ) ( (caddr—t) ip6 + off) ; 2 , 739 行目で、向け直しメッセージか連続したメモリ領 域 : ゴ褓内されているかどうかを石忍します。間題がなけれ ば、 2 , 740 行目で nd-rd に向け直しメッセージのう直ア ドレスを設定します。以後、向け直しメッセージの情報は nd•d ポインタ経山て参照することができます。 2 , 755 ~ 2 , 770 行目では、向け直しを孑譿れたアドレ スのスコーフ情報を復元します。 図 3 の reddst6 は向け直しメッセージの原因となった . バケットの終点アドレス、 redtgt6 は reddst6 宛のバケッ トを渡すべき向け直し先ノードのアドレスです。向け直し メッセージには IP アドレスしか言当求されていないので、 スコープ情報をイ褓内できる sockaddr-in6 構造体にコピー します。 向け直しメッセージは、向け直しの原因となったバケッ トを送信したインターフェイスでのみ受信されます。つま UNIX MAGAZINE 2003.1

3. UNIX MAGAZINE 2003年1月号

図 1 開始状態ではバケットは 1 つ 図 2 バケットを 2 つに分割 0 1 図 3 バケット B をさらに分割 0 1 0 1 づいてバケットを分割します。ハッシュ値を 2 進数で表 したときに頁のビットが 0 のものと 1 のものを、それ ぞれ別のバケットにオ褓内します ( 図 2 ) 。 図 2 では、 : 頁のビットが 0 のものをバケット B に 1 のものをバケット C : ゴ褓内しています。 さらにデータを登録していった結果、たとえはバケット B がいつはいになってしまったとしましよう。この場合も やはりバケットを分割することになりますが、今度はハッ シュ値の 2 番目のヒ、ツトの値にもとづいて 2 つのバケッ トに分けます ( 図 3 ) 。 この状態では、ハッシュ値が 00 て始まるものはバケッ ト D に、 01 て始まるものはバケット E に、 1 て始まる ものはバケット C にオ内されることになります。 ハッシュを利用するライプラリ関数としては、このほ かに hsearch ライプラリ関数があります。こちらは、前 節て紹介したライプラリ関数とは異なり、メモリ上にハッ シュテープルを構築して探索をおこないます。 hsearch ライプラリ関数は、これもライプラリ関数であ る hcreate 、 hdestroy とともに使います。関数名から予 想がっくと思いますが、ます hcreate でハッシュを作成 し、 hsearch を使って処理をおこない、最後に hdestroy hsearch ライブラリ関数 70 を使って作成したハッシュを破棄します。 hcreate 関数の引数には数値を与・えますが、これはハッ シュに繕求する要素数の最刻直を予想して指定します。っ まり、この値を用いてハッシュテープルのサイズを決定す るわけです。ただし、これはあくまでも最大値で、かなら ずしも指定した数だけ登録しなけれはならないわけではあ りません。ここて指定した数はかならす登録できることを ー焉正する値なので、心もち大きめの値にしておいたほうが よいと思います。なお、 hcreate 関数は整数値を返します が、ハッシュテープルが作成できた場合は 0 以外の値が、 作成できなかったときには 0 が返されることになってい ます。 UNIX MAGAZINE 2003.1 データが追加できなかった場合には NULL を返します。 は NULL 以外の値を返し、ハッシュがいつばいになって 鯊求されます。データの登録に成功すれは、 hsearch 関数 す。すると、第 1 引数に指定したキーと値がハッシュに 値を追加する場合は、第 2 引数に ENTER を指定しま } ACTION; FIND , ENTER typedef enum { で定義されています。 挙型の値を指定します。これも search. h ヘッダファイル 第 2 引数には、 hsearch 関数がおこなう処理を示す列 を代入するときには、明示的にキャストするなどしてくだ オ内することもできます。この構造体にポインタ以外の値 であれはなんでも登録できるので、たとえは int 型の値を 使い方となるでしよう。 void * 型のサイズに収まるもの 際にはなんらかの型へのホインタをオ褓内するのが一殳的な 生となっています。これは汁」のホインタを表す型で、実 にはイ求する値を指定します。 data フィールドは void * key フィーノレドには登録するキーを、 data フィールド } ENTRY ; void *data; char *key ; typedef struct entry { に定義されている ENTRY 構造体を指定します。 第 1 引数には、 search. h ヘッダファイルて以下のよう 使ってデータを一求する場合は、引数を 2 つ指定します。 ましよう。ますはデータのイ泉力法からです。この関数を 実際の処理をおこなう hsearch 関数についてみていき

4. UNIX MAGAZINE 2003年1月号

図 11 1352 1353 1354 1358 1360 1361 1362 1363 1364 1365 連載 / lPv6 の実装ーの (void) (*ctlfunc) (code , (struct sockaddr *)&icmp6dst , if (ctlfunc) { (inet6sw [ip6-protox [nxt] ] . pr-ctlinput) ; ctlfunc = (void ( * ) P((int, struct sockaddr * , void * ) ) ) ip6cp . ip6c-cmdarg (void *)&notifymtu; notifymtu = ntohl (icmp6¯>icmp6—mtu) ; ICMP6_PACKET_TOO_BIG) { if (icmp6type icmp6-notify-error() 関数によるエラー通矢里 &ip6cp) ; すべての処理カ鮗了したら、受信したメッセージを解放 して icmp6-input() に戻ります。 ICMP 工ラーメッセージの通知 前回解説したとおり、ノードが受信した ICMP ェラー メッセージは、エラーの原因となった IP バケットの送信 者に通知されます。ェラーの通知には、フロトコルごとに 定義されたフロトコル制彳卸関数を使います。フロトコルと その制御関数の対応は、 ip6protosw 構造体の配列 inet6 sw に言当されています。 inet6sw は in6-proto. c で定義 されています。 icmp6-notify-error() 関数が、プロトコル制御関数を 使ってエラーを通知する部分を思い出してみましよう ( 図 11 ) 。プロトコル制御関数は、 ip6protosw 構造体の pr- ctlinput メンノヾーに設定されています。 ip6-protox は、 プロトコル番号を対応する inet6sw 酉改ーのインデックス 値に変換する配列です。 1 , 360 行目の時点で変数 nxt に はエラーの原因となった IP バケットの上位層フロトコル 番号が入っているので、 1 , 360 ~ 1 , 361 行目でフロトコル に対応した制御関数へのポインタを取り出すことができま す。続く 1 , 362 ~ 1 , 365 行目で、制彳卸関数を通じて通知番 号 (code) 、エラーの原因となったバケットの終点アドレ ス (icmp6dst) 、その他の情報 (ip6cp) を渡します。 経路 MTU 探索 糸習各 MTU 探索 (Path MTU Discovery) [ 4 ] は、 IPv6 で必須となった機能の 1 つです。糸習各 MTU 探索を使 えは、始点ノードから終点ノードにいたる糸習各一 - : て最小の UNIX MAGAZINE 2003.1 MTU を発見できます。 糸各 MTU 探索の目的は、途中糸各のルータがバケッ トをう第リせすにすむようにすることと、糸各の或を最大 限有効に活用することです。分割処理はルータに負担がか かるので、あらかじめホストで適切な大きさのバケットを 作成するほうか効率的です。また、バケットにはかならす IP ヘッダが付くので、多数の小さいデータを送信するよ りも、ある程度大きなデータを送信したはうか効率カ止が ります。しかし、単純に大きなバケットを送信するだけで は、バケットサイズよりも小さな MTU をもつネットワー ク・インターフェイスカ絲習各上にある場合に間題が三し ます。 IPv4 では、中幻したいバケットのサイズか沖幻先 インターフェイスの MTU を超える場合、ルータが通切 な大きさに分割していました。一方、 IPv6 ルータは処理 の効率化のため中幻の過程でバケットをうリしません。す なわち、始点ノードはかならす糸習各 MTU 以下のサイズ でバケットを送信する必要があります。 IPv6 における経 路 MTU 探索は、帯域の有効活用という意味だけでなく、 終点ノードと通信するために不可欠な機能といえます。 TCP 制御関数の処理 TCP のフロトコル制御関数は tcp6-ctIinput() です。 TCP を利用した通イ芋に ICMP ェラーの原因となるパ ケットが発生した場合、 tcp6-ctIinput() を通してエラー が通知されます。ここでは、 ICMP ェラーの処理に関す る部分のみを解説します。以ー - ド、とくに明記しないかぎり 1334 int cmd ; 1333 tcp6—ct1input(cmd, sa, d) 1332 void コードは tcp-subr. c のものです。 63

5. UNIX MAGAZINE 2003年1月号

連載 / IPv6 の実装ーの 図 5 比較したアドレスが異なる場合の里 2819 2820 2824 2825 2827 2835 2836 2837 2806 2807 2808 2809 2810 2815 2816 2817 (struct sockaddr—in6 *)rt—>rt_gateway; gw6 if ( &src—sa—>sin6—addr) ! IN6_ARE_ADDR_EQUAL (&gw6—>sin6_addr , goto bad; RTFREE (rt) ; if (rt) sockaddr_in6 *gw6 ; if (rt—>rt-gateway = = NULL Ⅱ rt—>rt—gateway—>sa—family AF-INET6) { RTFREE ( rt ) ; goto bad; struct 2845 RTFREE (rt) ; 2846 rt = NULL; 糸習各情報によるメッセージの石忍か完了したら、 2 , 845 ~ 2 , 846 行目で糸習割青報を解放します。 rtalloc を使って 糸習各情報を検索すると、糸習割青報の参照カウンタか増加し ます。そのため、糸習各情報か、不要になった時点でかならす 解放し、参照カウンタを減らさなけれはなりません。 向け直しメッセージを受信したということは、現在、ホ ストカ鉤け直しの原因となった終点アドレスに対する糸習各 尉寺しており、かっその糸習各情報に言当求されているルー タのアドレスが、向け直しメッセージを送信してきたルー タのものであることを意味します。図 1 の例でいえば、ホ スト B はホスト Z への糸習青報 . 苻早しており、その転 送先ルータが A になっているはすです。したがって、糸習各 情報にそのルータのアドレスがなけれは ( 2 , 809 ~ 2 , 810 行目 ) 、受信した向け直しメッセージは不正なものです。 同様に、現在の糸習等はに言当求されているルータとは別 のルータから向け直しメッセージを受信することはないの で、上師交の結果アドレスが異なっていたら ( 図 5 の 2 , 824 ~ 2 , 825 行目 ) 、向け直しメッセージを破棄します。図 1 の例でいえは、ルータ A 以汐 ) ルータからホスト Z への 向け直しメッセージが送られてくることはないはずです。 2838 } else { 2848 2849 2850 iS_router is_onlink = 0 ; if (IN6_IS_ADDR_LINKLOCAL(&redtgt6. sin6—addr)) IS_router 向け直し先アドレスがリンクローカル・アドレスとなる のは、向け直し先かルータの場合です。図 1 の例がこれに あたります。 2 , 850 行目で、向け直し先がルータであるこ とを示す is•outer 変数を 1 に設定します。 if (SA6_ARE_ADDR_EQUAL (&redtgt6 , 2 851 2852 &reddst6) ) is_onlink = 1 ; 2843 2844 } goto bad ; 2 , 838 ~ 2 , 844 行目は、そもそも糸習青報か存在しない 場合の処理です。バケットを送信し、向け直しメッセージ を受信している以に、ホストに糸習各情報がないはすはあり ませんから、この場合もメッセージを破棄します。 60 もう 1 つのケースとして、同一リンク上のホスト宛の バケットカ鉤け直しされることがあります。これは、図 6 のように、 1 つのリンクにプレフィックスが異なる複数の ホストか接続されている場合に発生します。 ルータ C は、 3 仕 : 500 : 1 : 1 : : / 64 というプレフィックス をルータ通知て広告します。ルータ通知を受信したホスト D は、 3 飛 : 500 : 1 : 1 : : / 64 がオンリンク・プレフィックス であることを認識し、同時にルータ C をデフォルトルー タとして登録します。図の例ではルータは 1 台しか存在し ないため、ホスト D からオフリンク・プレフィックスに 向けて送信されるバケットはすべてルータ C に送られま す。ここに、 3 仕 : 500 : 1 : 1000 : : 200 というアドレスをもつ ホスト E カ続したとします。ホスト E がアドレス自動 UNIX MAGAZINE 2003.1

6. UNIX MAGAZINE 2003年1月号

図 12 13 77 1384 1385 1386 1387 1388 1389 1370 連載 / IPv6 の実装ーの if (ip6) { tcp6-ctlinput() でのエラー通知タ里 if (m—>m_pkthdr . le Ⅱく Off + sizeof (th) ) { (struct sockaddr—in6 *)sa, 0 ) ; icmp6—mtudisc—update ( (struct ip6ct1param * ) d , if (cmd PRC_MSGSIZE) sa6_src return ; ip6cp—>ip6c—src; 1404 valid + + ; 1371 } else { date() を呼び出して MTU を更新します。 icmp6-n ・ ltu- の通信中の PCB に景グするため、 icmp6-mtudisc-up- し、 MTU の調整を意味する通知番号の場合にはすべて を特定することができないので処理を中断します。ただ hdr. len に TCP ヘッタ、領域が含まれていない場合、 PCB ダに含まれています。 IP バケットの全長である m-pkt- ンスポート層のホート番号が必要で、これは TCP のヘッ 見しなけれはなりません。 PCB を特定するためにはトラ 送信者に通知するには、送信者が使用している PCB を発 TCP ヘッダを表す tcp6hdr 構造体の変数です。ェラーを す図 12 の 1 , 384 行目でバケット長を確認します。 th は 工ラーの原因となった IP バケットか渡されると、ま でのオフセット、 IP'S ケットの始点アドレスです。 アドレス、 IP バケットのツ頁から TCP ヘッダの先頭ま インタ、 IP バケットか格納されているメモリ領域のう頁 れぞれ、エラーの原因となった IP バケットへの mbuf ホ 'l 帯長を変数に取り出します。 m 、 ip6 、。広 sa6-src はそ ip6ctlparam 十冓造イ本に設疋されていた IP ノ、ケットの 1391 bzero(&th, sizeof (th) ) ; disc-update() については彳あします。 部分を th にコピーします。 1 , 391 ~ 1 , 392 行目で、 IP ノ、ケットから TCP ヘッダ (caddr—t)&th) ; 1392 m—copydata(), 0ff , sizeof (th) , th. th—sport , 0 ) ) (struct sockaddr—in6 *)sa6—src, th. th—dport , (in6—pcb100kup—connect(&tcb6, sa6, 1 , 394 ~ 1 , 421 行目は MTU 値の調整のための処理で ( cmd PRC_MSGSIZE) { 1394 if in6-pcblookup-connect() は PCB のリストから、始 点 / 終点アドレス、始点 / 終点ポートのすべての情報が設 定された PCB を検索します。この 4 つか設定されてい れは、その PCB は別の PCB と通信中であることを意味 します。 tcb6 は PCB のリストのツ頁です。 PCB は 2 種 類のリストて管理されています。 1 つはすべての PCB の リストで、 in6pcb をリストのう負としてカーネル内のす べての PCB がリンクされています。もう 1 つはプロトコ ルごとのリストで、 tcb6 には TCP を利用している PCB のみがリストされています。フロトコルごとのリストを作 ることで、 PCB の検索間カ鉄宿できます。 1 : 402 行目 では、 ICMP 工ラーの原因となった IP バケットから取 得した始点 / 終点ホートの情報を用いて、該当する PCB を検索しています。通信中の PCB があ川ま valid の値が 1 になります。 PCB に関するこの情報は、次に実行する icmp6-mtudisc-update() て利用されます。 図 13 の 1 , 413 行目で icmp6-mtudisc-update() を 呼び出し、 MTU 値を調整します。 1423 nmatch = in6—pcbnotify(&tcb6 , sa, 1424 th. th-dport , (struct sockaddr * ) sa6—src , th. th—sport , cmd, NULL, notify) ; す。 14 ( ) 2 1403 if UNIX MAGAZINE 2003.1 最後に、各 PCB にエラーを通知します。 in6-pcbno- tify() は引数で度された情報から PCB を特定し、エラー を通知する関数です。第 6 引数の cmd に通知番号を、第 8 引数の notify に通知番号に対応した処理関数を渡しま す。なお、第 7 引数で通知番号ごとの付加的な引数を指定 できますが、 tcp6-ctlinput() では使用しません。 1 , 425 ~ 1 , 430 行目 ( 図 14 ) は、 TCP の SYN ノ、ケッ トのネガテイプ・キャッシュの一求です。終点アドレス に到達できなかった場合 ( 1 , 426 ~ 1 , 428 行目 ) 、 1 , 429 ~ 65

7. UNIX MAGAZINE 2003年1月号

ロプログラミング・テクニック 多治見寿和 ァータベース 前号まで、しはらくネットワーク・アプリケーション を紹介してきました。そろそろほかのものもみてみること にしましよう。 何をとりあげるかいろいろ思案した結果、今回はデータ べースを紹介することにしました。ただし、データベース といっても DBMS (DataBase Management System と呼はれるような本格的なものではありません。たんにキ ーとデータの組 &f : 苻し、高速に検索できるようにするも のです。 データベースについては、だいぶ前になりますが 1998 年 12 月号でパスワード・ファイルをとりあげたときにも 紹介しています。その際、アフリケーションはパスワード・ ファイルをそのまま読み出すのではなく、いったんデータ べースに↑褓内して、データベースから読出しをおこなって いると述べました。これから紹介するデータベースは、そ こで利用されていたものです。さらに、 termcap 工ント リでも同様にデータベースを利用していると説明しました が、こちらで使われているのも今回とりあげるデータベー スです。 UNIX では、 Version 7 からこのデータベースを扱う ためのライプラリカ甘是供されてきました。最初のライプラ リは、 dbm と呼はれるものでした。その後、機能拡張か おこなわれて ndbm ライプラリが作成されました。これ らは AT & T のライセンスのもとで作られたものです。そ して、 ndbm のパプリック・ドメイン版として作成され たのが、 sdbm と呼はれるライプラリです。さらに、 Free Software Foundation も同様のライプラリを作成しまし テータベース UNIX MAGAZINE 2003.1 た。こちらは gdbm と呼はれています。 これら 4 種類のライプラリは、いすれもハードディス クに各内されたデータベースを対象とするものです。さき ほどのパスワード・ファイルの例のように、もとのデータ をいったんデータベースに変換しておき、利用する際に高 速にアクセスできるようにします。これらは、それぞオ L 若 十の違いはあるものの、基本的にハッシュを使って高速な アクセスを実現しています。 ハッシュ ハッシュについても、高速な探索を実現するデータ構造 として 1998 年 5 ~ 6 月号て紹介しています。 ハッシュを利用するにあたって間題となるのは、これら のライプラリではどの程度のデータが追加されるかか事前 には分からない点です。基本的なハッシュでは、ハッシュ テープルのサイズを決定してからデータをオ褓内していきま す。しかし、」「記のライプラリ関数では登録されるデータ の数が分からないため、あらかしめハッシュテープルのサ イズを決定しておくわけにはいきません。 そこで、これらのライプラリ関数では、たとえはトライ 構造を利用してノ、ツシュテープルを管理しています 1 の方法では、固定長のハッシュバケットにデータを格納 します。ハッシュバケットには複数のデータを登録でき ますから、最初は 1 つのバケットにすべてのデータを登 録していきます ( 図 1 ) 。 これがいつばいになったら、バケットを 2 つに分割し ます。具ー付勺には、を悩求された各要素のハッシュ値にもと 1 実際には、各ライプラリごとにアルゴリズムは異なリますが、 こでは dbm の力法をもとに簡単に紹介します。 69

8. UNIX MAGAZINE 2003年1月号

- : 6 マルチキャスト配像 Ⅸ 1010 Ⅸ 5005 Ⅸ 1010 Ⅸ 5005 Ⅸ 5005 ( 福岡 ) ( 札幌 ) 旧旧 v6 マルチキャスト・ / ヾックポーン クにされます。 中張り付けて監視すればよいのですが、現実の運用を考え PIM-SM のランテフ。ー・ポイントは、大阪 IX5005 に るとなんらかの監視システムによる自動監視の仕組みが必 設定しました。配信サー ーと大反 IX5005 か直結されて 要になります。今回は、実運用につなげるために、簡単な いるため、ここをランテフ。ー・ポイントに選ぶのがもっと 自動濫視システムを構築しました。 も効率的です。各 IX5005 、 SEIL 、 KAME で、 PIM- 今回の自動監視システムは、マルチキャスト配信か継続 SM によるマルチキャスト糸各制御をおこないました。 しているかどうかを、配信サーバーを設置したネットワー 図 1 では、工ッジルータとして IX1010 が多く使わ クでモニターする仕組みになっています。配信先のマルチ れています。 IX1010 は、 PIM-SM による糸響各制御はサ キャスト・アドレスは事前に分かっているので、ネットワ ポートしていません。その代わり、 MLD プロキシーの機 ークを流れるバケットを孑柑足し、配信アドレス宛のバケッ 能を備えており、ユーザー・ネットワークに設置してあ トの有無を調べれは、すくなくとも配信サーバーが通切な る OKI Media PIayer が送信する MLD ノヾケットを、 アドレスにデータを送信しているかどうかは分かります。 ー E 流ルータとなる IX5005 に中継します。つまり、 OKI 図 2 は、朝日放送に設置した配信サーバーのネットワー Media Player が MLD を用いて配信先となるマルチキャ ク構成を示したものです。配信に利用する OKI Media スト・アドレス宛に参加メッセージを送信すると、 IX1010 Encoder と OKI Media Server は、 Cisco の CataIyst が IX5005 に参加メッセージを送ります。これを受け取っ 3548 を経由して大阪 IX5005 に接続されています。なお、 た IX5005 からは、 IX1010 がマルチキャストを受信して 1Mbps 用の配信機材が 1 台なのに対し、 2Mbps 用の配 いる IPv6 ノードにみえるため、 IX1010 に対して必要な 信機材が Encoder と Server の 2 台に分かれているのは マルチキャスト・バケットを転送します。そして、 IX1010 負荷を分散させるためで、技行勺には 1 台の場合と同様で がⅨ 5005 から送られてきたバケットをユーサー・ネッ す。今回の実験では、この構成に SEIL を追加し、監視 トワークに転送することで、 OKI Media Player に配信 用の小型 PC として利用しました。 SEIL の基本システ バケットが届きます。 ムは NetBSD で、数は少ないもののネットワーク里の コマンドがインストールされています。今回は、 SEIL に ログインして tcpdump を用いて配信用マルチキャスト・ アドレス宛のバケットか流れているかを調べる Ruby ス クリプトを作成し、これを定期的に実行することて配信が 図 1 ネットワークの冓成 中継映像 朝日放送 OKI Media Encoder OKI Media Server 〇 OKI Media Player Ⅸ 1010 Ⅸ 1010 ・Ⅸ 1010 Ⅸ 1010 、Ⅸ 5005 ( 大阪 ) Ⅸ 1010 Ⅸ 1010 SEIL Ⅸ 1010 = = = = 運用監視体 時間やお金がふんだんに使えるのであれば、人間を 1 日 184 UNIX MAGAZINE 2003.1

9. UNIX MAGAZINE 2003年1月号

図 6 連載 / 旧 v6 の実装ーの 同一リンク上のホスト宛のバケットの向け直し インターネット 3ffe : 500 : 1 : : / 48 を経路情報として広告 2864 2869 2870 if (nd6-options (&ndopts) く 0 ) { goto freeit ; ホスト D ルータ C ホスト E 3ffe : 500 : 1 : 1 : : / 64 nd6-option-init ( ) と nd6-options() は、近ド蝌架索の オプション情報をアクセスしやすいかたちに整形する関数 です。 nd6-options() の実行に成功すると、 nd-opts 共 用体の変数 ndopts に、受信した近ド蝌架索メッセージに含 まれていたオプションにかオ内されます。 図 7 の nd-opts-tgt-lladdr には、向け直し先ノードの データリンク層アドレスかオ内されます。 図 8 の nd-opts-rh には、向け直しの原因となった IP バケットがオ内されます。ただし、向け直しメッセージ (ICMP'S ケット ) 全体の大きさが 1 , 280 オクテットに 収まる必要があるため、これを超える部分は切り捨てられ 3ffe : 500 : 1 : 1 : : 100 3ffe : 500 : 1 : 1000 : : 200 設定を利用せすに、手動でアドレス設定をした場合を考え てみましよう。ルータ C は自分の一 - ド流全体のアドレス空 間を表す 3ffe : 500 : 1 : : / 48 をインターネットに広告してい るので、各情報としては間題はありません。 こで、ホ スト D がホスト E と通信しようとしたとします。ホスト E のフレフィックスは、ホスト D か第忍識しているオンリ ンク・プレフィックスとは異なるため、ホスト D はホス ト E か 1 司ーリンクに存在しないと判断し、ホスト E 宛の バケットをデフォルトルータであるルータ C に渡します。 しかし、ルータ C は 2 つのホストが同しリンクにあるこ とを知っているので、ホスト D に向け直しメッセージを 送信します。このとき、 2 , 851 行目の条件が成立します。 if ( ! is_router & & ! is—onlink) { 2853 ます。 2882 2889 289 ( ) if (lladdr & & ( (ifp—>if—addrlen + 2 + 7 ) & ~ 7 ) ! = lladdrlen) { goto bad; 2858 2859 } goto bad ; 2 , 849 行目、 2 , 851 行目のいすれも成立しない向け直し メッセージは存在しないため、 2 , 858 行目て破棄します。 この時点で、向け直しメッセージの正当性か確認されま 経路情報の更新 ーー 0 続いて、近窮架索のオフション処理と糸習各情報の更新に 2 , 882 行目は、 2 , 873 行目 ( 図 7 ) て取り出したデータ リンク層アドレスの長さか正しいかどうかを、実際のネッ トワーク・インターフェイスのアドレスの長さと上交して 確認しています。 図 9 の nd6-cache 」 laddr() は、近隣キャッシュを追 加する関数です。この関数を呼び出すことで、すでにキャ ッシュか存在していればそのデータリンク層アドレスが更 新さオ L 、まだなけれは新たに近隣キャッシュが作成されま す。向け直し先がルータではなく、同一リンク上のホスト (is-onlink が 1 ) の場合は、これで向け直しの処理ははは、 完了です。次回、同し終点アドレスに向けてバケットを送 信する際は、ここで追加した近隣キャッシュの情報に従っ て、直接リンク上のノードに送信します。 2 , 896 ~ 2 , 956 行目は、向け直し先がルータのときの処 理です。 if ( ! is_onlink) { この場合は、向け直しの原因となった終点アドレスへの 糸習各を、新たに糸習各制御表に追加しなけれはなりません。 2896 進みます。 sizeof (*nd—rd) ; 2862 icmp61en 2863 nd6—option—init (nd—rd + 1 , &ndopts) ; UNIX MAGAZINE 2003.1 icmp61en, 2929 2930 sgw sdst redtgt6; reddst6; 61

10. UNIX MAGAZINE 2003年1月号

旧 v6 の実装 島慶ー ICMPv6 の実装 ( 2 ) IPv6 を利用するために必要なものが 2 つあります。 1 今回参照するファイル つは IPv6 ネットワークへの接続性、もう 1 つは IPv6 アプリケーションです。これらは相圧に依存している部分 今回は、 ICMPv6[1, 2 ] の向け直し (Redirect) 処理 があるため、下手をすると鶏と卵の間題に陥ってしまいま と、経路 MTU 探索 (Path MTU Discovery) をとりあ す。 げます。参照するファイルは以下のとおりです。 先丐勺な ISP は、数年前から IPv6 ネットワークへの ・ kame/sys/netinet/icmp6. h ( 改訂番号 1.79 ) 接続を提供しています。山も丘では、まだ実験的な側面が ・ kame/sys/netinet6/icmp6. c ( 改訂番号 1.325 ) 強いものの、数多くの ISP で IPv6 を利用できるように ・ kame/sys/netinet/tcp-subr. c ( 改訂番号 1.73 ) なってきました。 IPv6 ネットワーク接続に関する敷居は、 徐々に低くなりつつあります。さらに、 IETF で緊急課 なお、とくに明記しないかぎり、以下で引用するコード 題として検討か読けられている PD (Prefix Delegation) は icmp6. c のものです。 か驃準化されれは、 ISP とユーサーの双方にとってより現 実的な接続サービスが実現します。 向け直し 次の間題はアプリケーションです。 IPv6 の基冓造は IP バケットは終点アドレスに向けて転送されます。 IPv4 と変わりありません。 IPv4 でできることは、すべ ノヾ ケットを通切に中幻するために、インターネット上のすべ て IPv6 で実現可能です。 IPv6 の特徴を活かしたアプリ 、、終点アドレス " と、、次にバケットを転送 ケーションが必要なのは言うまでもありませんが、既存の てのルータは、 するノード " の組を糸習各制御俵として一尉寺しています。イ アプリケーションか利用できなくなるのは困ります。残念 ンターネットの接維伏態は時々刻々と変化しますから、ル なことに、過去に作られたプログラムは、 IPv4 以外のイ ータは糸習各制笹曦を現実の状態に応して更新していかなけ ンターネット・プロトコルの出現を想定していなかった ればなりません。そのための情報をやりとりする仕組みが ため、機能面ではなく実装面で IPv4 の制約を受けていま 糸習各制御プロトコルです。インターネット上のルータは、 す。しかし、 IPv4 のアドレス構造に大きく依存していな 糸習翻ワ。ロトコルを使って互いの糸習各制笹を山辭斤の状 いかぎり、 IPv4 と IPv6 の双方で通信できるプログラム 態に保っています。 を作ることはそれほど難しくありません。プログラムを作 成する際に参考となるドキュメントもあります 1 。もし皆 一般に、糸各制御プロトコルの処理は複雑です。理論 上は、すべてのノードか習各制御ワ。ロトコルを用いて経 さんカだん利用しているプログラムが IPv6 に対応して 路制御表をもっことも可能ですが、ルータの数にくらべ いないのなら、一度 IPv6 ノ、ツクに挑戦してみてはいかが てホスト ( バケットの転送に関与・しないノード ) のほうが でしようか。 圧倒的に多いので、すべてのノードか習各制御にかかわ 1 http://www.kame.net/newsletter/2()()20108/ るのは無駄が多すぎます。そのため、ホストは高度な経 v6prog. html 56 UNIX MAG AZINE 2003 ユ