動的インタフェース調整機構について 2003 年度春 タームプロジェクト move! B3 [email protected] 25 23 18 11 Jul Jul Jul Jul 2003 2003 2003 2003 本日のメニュー 動機 想定環境 関連研究 システムについて 実装 今後 動機 無線環境の普及 同時に複数の異種無線を利用可能な環境 同時に複数のインタフェースからデータを流 したいという要求 移動しても通信は切れないように 想定環境 ネットワーク1 (AirH”とか) a ネットワーク2 (802.11 とか) b c 関連研究 SCTP pTCP 相手先ホストまでの経路の多重化 相手先ホストでデータの統合は行わない ネットワークインタフェースの動的変更に対応していない TCP のみ MIBSocket データ送信の多重化は行わない システムについて 要件 ネットワークインタフェースの動的な個数の 変更 相手先ホストでのデータ統合 無線に適したパラメータの制御 システム概要 process アプリケーション層 socket layer ソケット層 protocol layer protocol layer interface layer interface layer wi0 cuaa0(ppp) トランスポート層 トランスポート層 (TCP/UDP) と ソケット層の間での理由 再送制御 フロー制御 既存アプリケーションへの影響を最小限に アプリケーション層における実装と の比較 スピード ネットワーク層の方が速い プログラミング アプリケーションの複雑化 ミドルウェアならいいかも • 遅い ユーザプログラマへの影響 ネットワークそうならばない。 ミドルウェアだと、それを使うアプリケーションだけ。 スケールしない(by pTCP の論文) ネットワーク層の問題への対応 再送が起きている時など、アプリケーション層では知りえない状況の とき、対応できない。 ネットワーク層 (IP) における実 装との比較 再送/輻輳制御を行うことは出来ない パケットの統合を行うのが難しい。(sequential number がないから) 実装に関して 実装1 - 実験環境 • FreeBSD 5.1R • Thinkpad T30 • 802.11b x 2 実装2 - 目標 一つの送信データを2つのインタフェースか ら UDP パケットで投げる データ 1 2 3 4 3 4 送信元ホスト 1 2 受信ホスト 実装3 - 関数の構造 send() socket() SOCK_DGRAM socket layer so_type protosw{} sosend() skk_usrreq mbuf を free() す るときに panic !! skk_send() protocol layer udp_send() NIC1 udp_send() NIC2 実装4 - 追加した関数 socreate() (kern/uipc socket.c) struct protosw inetsw[] (netinet/in proto.c) netinet/skk usrreq.c netinet/skk var.h 実装5 - コード紹介 socreate() 内 if (type == SOCK_DGRAM && dom == PF_INET){ prp = pffindproto(dom, IPPROTO_SKK, SOCK_SKK); if (proto) global_prp = pffindproto(dom, proto, type); else global_prp = pffindtype(dom, type); } else if (proto) prp = pffindproto(dom, proto, type); else prp = pffindtype(dom, type); 実装5 - コード紹介2 in_proto.c 内 struct protosw inetsw[] { SOCK_SKK, &inetdomain, IPPROTO_SKK, PR_ATOMIC|PR_ADDR, skk_input, 0, skk_ctlinput, ip_ctloutput, 0, skk_init, 0, 0, 0, &skk_usrreqs }, 実装5 - コード紹介3 skk_send() 内 static int skk_send(struct socket *so, int flags, struct mbuf *m, struct sockaddr *addr, struct mbuf *control, struct thread *td) { static int ret, ret2 ; struct ifnet *ima_ifp; struct inpcb *inp; ret = (*global_prp->pr_usrreqs->pru_send)(so, flags, m, addr, control, td); ima_ifp = find_next_ifnet(so); if(ima_ifp != NULL){ inp = sotoinpcb(so); inp->inp_route.ro_rt->rt_ifp = ima_ifp ; ret2 = (*global_prp->pr_usrreqs->pru_send)(so, flags, m, addr, control, td); } return ret2; } 評価 10MB のファイルを他のホストへ送信 使用インタフェース1つの場合 • 50 s 使用インタフェース2つの場合 • 25 s 今後行う予定のこと (今回の実装目標を終了させる) ネットワークインタフェースが増減したとき、 動的に送信インタフェースを増減 UDP/TCP 両方ともに扱えるように フロー制御
© Copyright 2024 ExpyDoc