Japan QualNet Community Forums Japan QualNet Community Forums
Welcome Guest 
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/02:17/20
2024/05/01:21/26

2024/03/03より304/1375
人気モジュール
No.1: フォーラム 80
No.2: ニュース 3
No.3: QualNet概要 1
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット71
No.2:Windows NT1

No.1:どっかの巡回ロボット69
No.2:Safari1
No.3:Majestic-12巡回ロボット1

日曜日からの合計
メイン
   Tools: QualNet Analyzer & QualNet Packet Tracer
     QualNet上のパケットをEtherealなどのパケット解析ツールで見れますか?
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
mast
投稿日時: 2005/7/15 0:09
一人前
登録日: 2005/4/7
居住地:
投稿: 93
QualNet上のパケットをEtherealなどのパケット解析ツールで見れますか?
Ethereal等パケット解析ツール上の統計グラフなどが簡単に利用できたら
便利だと思ったのですが、QualNetのシミュレーションで発生させたパケ
ットを、Etherealなどのパケット解析ツールで読み込むことはできますか?
forum_support
投稿日時: 2005/7/15 0:25
モデレータ
登録日: 2005/5/17
居住地: 東京都中野区中央4-5-3 ?構造計画研究所
投稿: 322
Re: QualNet上のパケットをEtherealなどのパケット解析ツールで見れますか?
一部、可能です。
QualNetでは、TCPパケットに対してのみですが、tcpdumpの出力形式に合わせたパケ
ットトレースを出力することが出来ます。

GUI上での設定は、添付ファイルの赤丸で囲った部分の設定を行います。
GUI上ではなくconfigファイルを直接編集したい場合は、以下の行を追加してください。
([BOTH|OUTPUT|INPUT]はBOTHかOUTPUTかINPUTのいずれか、という意味です。
詳しくは、ユーザマニュアルまたはQUALNET_HOME/bin/default.config参照してください。)

TCP-TRACE TCPDUMP
TCP-TRACE-DIRECTION [BOTH|OUTPUT|INPUT]

このように設定した上でシミュレーションを実行すると、tcptrace.dmpという名前の
tcpdump形式のファイルを生成してくれます。
これをEthereal(http://www.ethereal.com)やTCP Trace(http://www.tcptrace.com)
といったツールで読み込むことができます。
(もちろんtcpdumpでも読み込めます。)

qn_tcpdump.jpg
mast
投稿日時: 2011/10/31 20:47
一人前
登録日: 2005/4/7
居住地:
投稿: 93
Re: QualNet上のパケットをEtherealなどのパケット解析ツールで見れますか?
etherealもwiresharkと名前を変えてしまいましたが、(6年ぶりに)続報です。
この機能を使えば、QualNet 5.1のSIPのシーケンス図をwiresharkのFlowGraph機能を使ってみることができるのではないかと思い、試してみたのですが、どうもうまくいきませんでした。
(TCPヘッダまでは見えるのに、データ領域は0バイトと認識されてしまい、アプリケーション領域のデータを見ることができませんでした。)

そこでこのtcptrace.dmpファイルを出力している箇所をソースコード上で確認してみたところ、どうやらわざとそのようにしているということが分かりました。
(TCP-TRACEを使ってTCPのシーケンスを見るためだけならTCPヘッダさえ見れれば良いということになるので、この機能は恐らくそのことだけに目的を絞った機能ということなのでしょう。)

で、いろいろと触ってみたところ、とりあえずSIPのシーケンスをwiresharkで見れるようにできたので、改造箇所を参考までに紹介します。
(VirtualPayload等を使わずに真面目にメモリをアロケートしてパケットを生成しているプロトコルであれば、他のTCP上で動作するプロトコルでも同じように見ることができるはずです。※ただQualNet標準のHTTPやFTPはあくまでトラフィックパターンをモデル化したものなのでそのようにはなってません。)
添付画像は、QUALNET_HOME/scenarios/multimedia_enterprise/voip/sip/singledomain-proxy-routed-normalシナリオを実行し、その結果できたtcptrace.dmpをwiresharkで表示した際の画面キャプチャです。

他の方の参考になれば幸いです。
なお試した環境は、WIndows 7 / QualNet 5.1です。

transport_tcp_output.cpp

  340 void tcp_output(
  341     Node *node,
  342     struct tcpcb *tp,
  343     UInt32 tcp_now,
  344     struct tcpstat *tcp_stat)
  345 {
           ... 中略 ...
1015       anEcnCapablePacket = TransportTcpSetEcnCapablePacket(node, tp, ti);
1016       TransportTcpSetEcnEchoAndCWR(node, tp, ti);
1017 
           ti->msg = MESSAGE_Duplicate(node, msg);       // !!!この行を追加!!!
1018       TransportTcpTrace(node, tp, ti, "output");
1019       if (anEcnCapablePacket) {
1020             TransportTcpTrace(node, 0, 0, "ECT");
1021       }
1022       TransportTcpTrace(node, tp, ti, "variables");
           MESSAGE_Free(node, ti->msg);                  // !!!この行を追加!!!
           ti->msg = NULL;                               // !!!この行を追加!!!
1023 
1024       MESSAGE_RemoveHeader(node, msg, sizeof(struct ipovly), TRACE_TCP);
1025 
           ... 中略 ...
1163 }


transport_tcp.cpp

2355 static
2356 struct tcpiphdr TransportTcpConvertHdrToNetworkOrder(struct tcpiphdr *ti)
2357 {
2358      struct tcpiphdr aHdr;
2359 
2360      memcpy(&aHdr, ti, sizeof(struct tcpiphdr));
2361 
          ... 中略 ...
2382      aHdr.ti_sport = qn_htons(aHdr.ti_sport);
2383      aHdr.ti_dport = qn_htons(aHdr.ti_dport);
2384      aHdr.ti_seq = qn_htonl(aHdr.ti_seq);
2385      aHdr.ti_ack = qn_htonl(aHdr.ti_ack);
2386      aHdr.ti_win = qn_htons((unsigned short)(aHdr.ti_win));
2387      aHdr.ti_sum = qn_htons(aHdr.ti_sum);
          aHdr.ti_urp = qn_htons(aHdr.ti_urp);
          aHdr.ti_t.tcpHdr_x_off = ((aHdr.ti_t.tcpHdr_x_off & 0x0f) << 4) |   // !!!この行を追加!!!
                                     ((aHdr.ti_t.tcpHdr_x_off & 0xf0) >> 4);  // !!!この行を追加!!!
          ... 中略 ...
2398      return (aHdr);
2399 }


2562 static
2563 BOOL TransportTcpTraceDumpBinaryData(
2564     Node *node,
2565     struct tcpcb *tp,
2566     struct tcpiphdr *ti,
2567     const char *theMsg,
2568     FILE *fp,
2569     UInt32 aCount)
2570 {
           ... 中略 ...
2602       if (aTcpIpHdr.ti_src.networkType == NETWORK_IPV4) {
2603           aPacketLength = MAC_HEADER_LEN + IPv4_HEADER_LEN + ti->ti_len;
2604           anInt = aPacketLength;                  // capture length
2605 
2606           //if (anInt > IPv4_TCPDUMP_LENGTH_MAX) {                                    // !!!この行をコメントアウト!!!
2607           //    anInt = IPv4_TCPDUMP_LENGTH_MAX;                                      // !!!この行をコメントアウト!!!
2608           //    aDataLength = IPv4_TCPDUMP_LENGTH_MAX - MAC_HEADER_LEN                // !!!この行をコメントアウト!!!
2609           //        - IPv4_HEADER_LEN - sizeof(struct tcphdr) - anOptionLength;       // !!!この行をコメントアウト!!!
2610           //}                                                                         // !!!この行をコメントアウト!!!
2611       } else {
2612           aPacketLength = MAC_HEADER_LEN + IPv6_HEADER_LEN + ti->ti_len;
2613           anInt = aPacketLength;                  // capture length
2614 
2615           //if (anInt > IPv6_TCPDUMP_LENGTH_MAX) {                                    // !!!この行をコメントアウト!!!
2616           //    anInt = IPv6_TCPDUMP_LENGTH_MAX;                                      // !!!この行をコメントアウト!!!
2617           //    aDataLength = IPv6_TCPDUMP_LENGTH_MAX - MAC_HEADER_LEN                // !!!この行をコメントアウト!!!
2618           //        - IPv6_HEADER_LEN - sizeof(struct tcphdr) - anOptionLength;       // !!!この行をコメントアウト!!!
2619           //}                                                                         // !!!この行をコメントアウト!!!
2620       }
           ... 中略 ...
2806       if (aDataLength) {
2807           //aDataPtr = (unsigned char *)ti + anOptionLength                           // !!!この行をコメントアウト!!!
2808           //                  + sizeof(struct tcpiphdr);                              // !!!この行をコメントアウト!!!
                    if (!strcmp(theMsg, "output"))                                                   // !!!この行を追加!!!
                    {                                                                                // !!!この行を追加!!!
                         aDataPtr = (unsigned char *)MESSAGE_ReturnPacket(ti->msg)                   // !!!この行を追加!!!
                                  + anOptionLength + sizeof(struct tcphdr) + sizeof(struct ipovly);  // !!!この行を追加!!!
                    } else {                                                                         // !!!この行を追加!!!
                         aDataPtr = (unsigned char *)ti + anOptionLength                             // !!!この行を追加!!!
                                              + sizeof(struct tcpiphdr);                             // !!!この行を追加!!!
                    }                                                                                // !!!この行を追加!!!
2809            //memset(aString, 0xf0, aDataLength);                                      // !!!この行をコメントアウト!!!
2810            //if(fwrite(&aString, sizeof(unsigned char), aDataLength, fp)              // !!!この行をコメントアウト!!!
2811            //                 != aDataLength)                                         // !!!この行をコメントアウト!!!
2812            //{                                                                        // !!!この行をコメントアウト!!!
2813            //    return(FALSE);                                                       // !!!この行をコメントアウト!!!
2814            //}                                                                        // !!!この行をコメントアウト!!!
2815            fwrite(aDataPtr, sizeof(unsigned char), aDataLength, fp);                    // !!!この行をコメント解除!!!
2816       }
2817 
2818       return(TRUE);
2819 }


wireshark_sip_flowgraph.PNG
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT