2003 年度春 タームプロジェクト概要

動的インタフェース調整機構について
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 両方ともに扱えるように
 フロー制御
