NSページ最終更新日 2006.9.10, 和訳最終更新日 2006.9.11
現在、無線シミュレーションのためのtrace supportは、cmu-traceオブジェクトを用いています. 将来は、これにnsにおいて、トレースとモニタリングサポートが追加された利用可能なものに拡張される べきであります.さらに、それは無線モジュールのためのnamのサポートも含んだものであるべきです. いまは、我々は、cmu-traceオブジェクトについて簡単に説明をして、さらに、どのようにそれらのオブジェクトが 無線シナリオのためにパケットをトレース(辿る)ために使うことができるのかについて説明します.
cmu-traceオブジェクトはいつも3つのタイプがあります.CMUTrace/Drop、CMUTrace/Recv、CMUTrace/Send です.これらはそれぞれ、agentsやルーター、マックレイヤー、やインタフェース・キューにより パケット落ち、受信や送信されたパケットをトレースするために使われます. 実装された無線トレースサポートのための関数や手続きは、trace.{cc,h}およびtcl/lib/ns-cmutrace.tcl の中で見つけることができます.cmu-traceオブジェクトは、次のAPIにより生成されます:
set sndT [cmu-trace Send "RTR" $self]
これは、ルーターの中で送られた全てのパケットをトレースするためのCMUTrace/Sendタイプの トレースオブジェクトsndTを生成します.トレースオブジェクトは、MACの中、agents(ルーチングや その他)、ルーターや他のNsObjectの中でのパケットをトレースするのに使われるかもしれません. cmu-traceオブジェクトCMUTraceは、Traceクラスを基本として継承されたものです.トレースクラスに ついては、25章を参照して下さい.CMUTraceクラスは、次のように定義されています:
class CMUTrace : public Trace {
public:
CMUTrace(const char *s, char t);
void recv(Packet *p, Handler *h);
void recv(Packet *p, const char* why);
private:
int off_arp_;
int off_mac_;
int off_sr_;
char tracename[MAX_ID_LEN + 1];
int tracetype;
MobileNode *node_;
int initialized() { return node_ && 1; }
int command(int argc, const char*const* argv);
void format(Packet *p, const char *why);
void format_mac(Packet *p, const char *why, int offset);
void format_ip(Packet *p, int offset);
void format_arp(Packet *p, int offset);
void format_dsr(Packet *p, int offset);
void format_msg(Packet *p, int offset);
void format_tcp(Packet *p, int offset);
void format_rtp(Packet *p, int offset);
};
Traceクラスの定義の中に記述されているtypeフィールドは、異なるトレースのタイプの中で 違った使い方をするために使われます.cmu-traceでは、"s"(type)は送信を、"r"は受信を、"D"はパケット 落ちを表すことができます.4番目のtype fは、パケットを転送することを示すために使われます (ノードがパケットをはじめに送ったノードで無いとき). 関数Trace::format()と同じように、関数the CMUTrace::format()は、トレースファイルのフォーマット を定義し、命令します.その関数は次のようであります:
void CMUTrace::format(Packet* p, const char *why)
{
hdr_cmn *ch = HDR_CMN(p);
int offset = 0;
/*
* Log the MAC Header
*/
format_mac(p, why, offset);
offset = strlen(wrk_);
switch(ch-\>ptype()) {
case PT_MAC:
break;
case PT_ARP:
format_arp(p, offset);
break;
default:
format_ip(p, offset);
offset = strlen(wrk_);
switch(ch-\>ptype()) {
case PT_DSR:
format_dsr(p, offset);
break;
case PT_MESSAGE:
case PT_UDP:
format_msg(p, offset);
break;
case PT_TCP:
case PT_ACK:
format_tcp(p, offset);
break;
case PT_CBR:
format_rtp(p, offset);
break;
..........
}
}
}
上記の関数は、トレースされるパケットのタイプによって、異なった形の関数を呼び出します. 全てのトレースは、バッファwrk_に書き込まれます.バッファでのオフセットのカウントがされ続け、 別のトレース関数へと伝えられます. 最も基本的なフォーマットは、format_mac()により定義されたもので、全てのpkt typeをトレース するのに使われます.その他のフォーマット関数は、パケットタイプによって定義される追加の情報 を記録したものです.mac formatは次のように記録されます:
\#ifdef LOG_POSITION
double x = 0.0, y = 0.0, z = 0.0;
node_-\>getLoc(&x, &y, &z);
\#endif
sprintf(wrk_ + offset,
\#ifdef LOG_POSITION
"%c %.9f %d (%6.2f %6.2f) %3s %4s %d %s %d [%x %x %x %x] ",
\#else
"%c %.9f _%d_ %3s %4s %d %s %d [%x %x %x %x] ",
\#endif
op, // s, r, D or f
Scheduler::instance().clock(), // time stamp
src_, // the nodeid for this node
\#ifdef LOG_POSITION
x, // x co-ord
y, // y co-ord
\#endif
tracename, // トレーシングするオブジェクトタイプの名前
why, // もし何かあれば理由
ch-\>uid(), // このイベントのidentifier(識別子)
packet_info.name(ch-\>ptype()), // パケットタイプ
ch-\>size(), // cmn headerのサイズ
mh-\>dh_duration, // データの送信予測時間
ETHER_ADDR(mh-\>dh_da), // mac_destination address
ETHER_ADDR(mh-\>dh_sa), // mac_sender address
GET_ETHER_TYPE(mh-\>dh_body)); // type - arp or IP
もしLOG_POSITIONが定義されていれば、mobilenodeのためのxとy座標も記録されます. mac traceの中の異なったフィールドの記述は、上記のコメントのところで書かれています. 全てのIPパケットにとって、追加されたIPヘッダーフィールドも上記のトレースに追加されます. IPトレースは、以下のように記述されます:
sprintf(wrk_ + offset, "------- [%d:%d %d:%d %d %d] ",
src, // IP src address
ih-\>sport_, // src port number
dst, // IP dest address
ih-\>dport_, // dest port number
ih-\>ttl_, // TTL value
(ch-\>next_hop_ \< 0) ? 0 : ch-\>next_hop_);
// next hopaddress, if any.
tcpパケットのトレースの例は、以下のようです:
r 160.093884945 _6_ RTR --- 5 tcp 1492 [a2 4 6 800] ------- [655 36:0 16777984:0 31 16777984] [1 0] 2 0
ここで、6番のidを持ったノードより受け取ったTCPデータパケットを見ることができます. pktのUIDは5で、cmn hdrサイズは1492です.macの詳細は、IP pckt(ETHERTYPE_IPは0x0800で定義されていて、 ETHERTYPE_ARPは0x0806で定義されています)の状態や、この受信しているノードのmac-idが4である ということを示しています.その送信ノードは6で、無線チャネル上をdata pktが送信される予測時間 は、a2 (16進法から10進法に変換: 160+2 秒)です.さらに、IPはIP srcとdestination addressに 関する情報をトレースします.destinationアドレスは1.0.3でポートアドレスは0です. TTLの値は31で、srcからdestinationまでは1ホップでした.さらに、TCPフォーマットはtcp seqnoが 1、acknoが0という情報を記録しています.その他のフォーマット、DSR、UDP/MESSAGE、TCP/ACKや CBRのパケットタイプについては、/cmu-trace.ccを参照して下さい.
他のトレースフォーマットもrouting agents(TORAやDSR)によって、特別なルーチングイベント に関してそれぞれ記録するために使われます.例えば、"originating" (パケットにSRヘッダーを 付加する)や"ran off the end of a source route"がソースルーチングにおいていくつかの問題が あることを示すものなどです.これらの特別なイベントのトレースは、DSRは"S"から、Toraは"T" から始まり、TORAはtora/tora.ccで、DSRのrouting agentはdsr/dsrgent.ccの中で見つけることができます.
Google Adsense広告
無線ネットワークシミュレーション since 2006.9-
|
|