nチャンネル通信のための 経路制御

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