n チャンネル通信のための 経路制御 小川 真人 木下研究室
Nチャンネル通信 N本の経路を用いて、ファイルを分散させて通信を行う方式である。 分散されたファイルが、すべて違う経路を通り相手に届くことが理想である。
N 本の経路を用意すれば良い しかし、実装するにあたっ て 次のような問題点がある
一般のネットワーク
インターネット等の通信 指定したルートでデーターを送ることはで きない。
経路制御(ルーティング)
提案手法 n チャンネルまでの流れ N 本の経路を用いた通信をしたい しかし、ルーターが最短経路を選択してしま う ために不可能 ↓ そこで、ソースルーティングに着目した
ソースルーティング ソース・ルート・オプションの形式 SSRR ( strict soruce and record route )というオプ ションを使用する。 IP アドレスのリストを送信前に埋め込まなければ ならない。 ソース・ルート・オプションはデータグラムが 経路を通過するごとに IP アドレスリストが更新さ れる。 コー ド データ 長 ポイン タ IP アドレス #1 IP アドレス #2 IP アドレス #3 ・・ ・・ ・ IP アドレ ス#9 1114バイト ・・ ・・ ・ 4バイト 39 バイ ト
実験の概要 パソコン 4 台を使用し、 A 、 B のパソコンを任 意に選択し通信できるか、実験した net1 net4 net2 net eth1 eth2 eth1
送信プログラム LSR SourceRoute; memset(&SourceRoute,0,sizeof(LSR)); SourceRoute.Nop = IPOPT_NOP; SourceRoute.Code = 0x89; SourceRoute.Len = 11; SourceRoute.Offset = 4; SourceRoute.Addrs[0] = inet_addr(" "); SourceRoute.Addrs[1] = inet_addr(" "); setsockopt(sock,IPPROTO_IP,IP_OPTIONS,(char*)&SourceRoute,SourceRoute.Len+1) ; n = sendto(sock, "HELLO-1", 7, 0, (struct sockaddr *)&addr, sizeof(addr)); if (n < 1) { perror("sendto"); return 1; }
送信プログラム LSR SourceRoute; memset(&SourceRoute,0,sizeof(LSR)); SourceRoute.Nop = IPOPT_NOP; SourceRoute.Code = 0x89; SourceRoute.Len = 11; SourceRoute.Offset = 4; SourceRoute.Addrs[0] = inet_addr(" "); SourceRoute.Addrs[1] = inet_addr(" "); setsockopt(sock,IPPROTO_IP,IP_OPTIONS,(char*)&SourceRoute,SourceRoute.Len+1) ; n = sendto(sock, "HELLO-1", 7, 0, (struct sockaddr *)&addr, sizeof(addr)); if (n < 1) { perror("sendto"); return 1; } を通り に 着くように設定 SSRR を指定
実験の結果
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a8 010b 0x0020: b08 c0a c0a c8e x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a8 010b 0x0020: b08 c0a c0a c8e x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細 時刻; HH:MM:SS. マイク ロ秒 のポート から のポート に UDP で 7 文字 ( HELLO-1 )
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a x0020: b08 c0a c0a c R 0x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細 08:00:27:a0:03:39 受信側 MAC アドレ ス 08:00:27:a4:22:db 送信側 MAC アドレ ス イーサネットタイプ 0800(IP) Version:4 , ヘッダ長 :8(8x4=32byte) , サービスタイプ :00 , IP から見た全データ長 :002 f (47) イーサネットのプロトコル ヘッ ダと IP ヘッダ ここから IP ヘッダ
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a x0020: b08 c0a c0a c R 0x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細 識別 ID:0000 フラグメント :4000( オク テッ ト ) 生存時間( TTL ) :3f(63) プロトコル :11(17=UDP) チェックサム 1 f 76 IP ヘッダ
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a x0020: b08 c0a c0a c R 0x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細 送信元 IP アドレ ス : 送信先 IP アドレ ス : (受信側) オプショ ン: 01 0 x 89 : SSRR SourceRoute.Len : 0b(11) SourceRoute.Offset :08 IP ヘッダ
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a x0020: b08 c0a c0a c R 0x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細 経由アドレス : 送信先 IP アドレ ス : (受信側) IP ヘッダ
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a x0020: b08 c0a c0a c R 0x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細 ポート番号: c352(50002) ポート番号: 3039 (12345) ここからが UDP のヘッ ダ
listening on eth1, link-type EN10MB (Ethernet), capture size bytes 20:40: IP > : UDP, length 7 0x0000: a a4 22db '..9..'."...H. 0x0010: 002f f11 1f76 c0a x0020: b08 c0a c0a c R 0x0030: f 6c8f c4c 4f2d l.HELLO-1 パケットの詳細 データ: c4c 4f2d 31 ( HELLO- 1 ) UDP から見たデータ長 :000f(15byte) チェックサム :6c8f UDP のヘッダ とデータ
禁止設定の解除 各ホストで、 /etc/sysctl.conf を以下のように修正する。 # があれば外して、項目が無ければ追加する。 net.ipv4.conf.default.rp_filter=1 net.ipv4.conf.all.rp_filter=1 net.ipv4.ip_forward=1 net.ipv4.conf.all.accept_source_route = 1 この設定をしないと、ソースルーティングができない。
まとめ ・nチャンネル通信の実装手法としてソースルー ティングを用いることを提案した ・送信パケットのヘッダにオプションを加えるだけ で済むため、ネットワークに負荷をかけずに実現が 可能である ・パケットに経路情報を付け加えるだけで、複数の 経路に異なるデータを同時に送信できることを実験 によって確認できた ・ソースルーティングはその危険性のため、各ルー ターごとに設定を解除する必要があることが分かっ た
①ルート検索を自動で行い、ソースルー ティングを自動的に行えるようにする ②ソースルーティングは危険性があるため に、制限されているので、対策を考える ③ IP v6ではルーティングヘッダを付ける だけでソースルーティングが可能になった ので、 IPv6 での実装も今後の課題である 課題