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

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/18:12/14
2024/05/17:19/24

2024/03/19より398/1408
人気モジュール
No.1: フォーラム 115
No.2: QualNet概要 4
No.3: ニュース 2
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット90
No.2:Unknown OS1
No.3:Windows NT1

No.1:どっかの巡回ロボット81
No.2:Majestic-12巡回ロボット6
No.3:Google巡回ロボット3

日曜日からの合計
メイン
   Physical Layer Protocol Implementation & Model Development
     パケットの衝突について
投稿するにはまず登録を

題名 投稿者 日時
 » パケットの衝突について inabya 2006/11/28 20:26
     Re: パケットの衝突について kabocha 2006/11/28 21:39
       Re: パケットの衝突について inabya 2006/11/28 22:01
       Re: パケットの衝突について inabya 2006/11/30 2:32
         Re: パケットの衝突について marimo 2006/11/30 8:54
           Re: パケットの衝突について kabocha 2006/11/30 13:53
             Re: パケットの衝突について inabya 2006/11/30 14:17
               Re: パケットの衝突について kabocha 2006/11/30 17:05
                 Re: パケットの衝突について marimo 2006/12/1 8:24
           Re: パケットの衝突について inabya 2006/11/30 13:58
フラット表示 前のトピック | 次のトピック
投稿者 スレッド
inabya
投稿日時: 2006/11/28 20:26
新米
登録日: 2006/11/27
居住地: 千葉県
投稿: 5
パケットの衝突について
最近、フォーラムに登録したinabyaと申します。
つい先日よりQualnetによるシミュレーションに取り組み始めました。
今後お世話になると思いますが、何とぞよろしくお願いします。

私は現在、Qualnetにおいて直線状のマルチホップネットワークに関するシミュレーションを行っています。
シミュレーションでは、12ノードを直線状に配置し、左端ノードから右端ノードへ片方向のUDPフローを送信しています。
RTS/CTSを無効にし、ルーティングもStatic-routeを用いているため、
ネットワーク内に流れるパケットはDATAパケットとACKパケットのみとなっています。
その条件の下、各ノードにおけるDATAパケットとACKパケットの衝突数をカウントしたいと考えています。

こちらのフォーラムで"衝突数"というキーワードで検索した所、SNT社のQualnetのhelpが引用されており、
phy802_11.h/phy802_11.cpp等の修正が必要だということだったので、
Programmer'sGuide及び、本家のQualnet Forumで見つけた
"Number of collisions"というトピックの内容を参照しながら、ソースに修正を施しました。

現在、付け焼き刃ですが、ノードごとのDATAパケットとACKパケットの衝突数を個々にカウントし、
statファイルに出力することが出来るようになっています。
修正を施した部分は、phy/phy_802_11.cppの
関数PHY802_11_SignalArrivalFromChannelで以下のようになっています。

void Phy802_11SignalArrivalFromChannel(...)
{
....
switch (phy802_11->mode) {

case PHY_RECEIVING: {
....
if (!phy802_11->rxMsgError) {
phy802_11->rxMsgError = Phy802_11CheckRxPacketError(node, phy802_11, NULL);

//******** add start ********//
if (phy802_11->rxMsgError) {
if((phy802_11->rxMsg->packetSize == 18)
&& (phy802_11->stats.temp_ACKsequence !=
phy802_11->rxMsg->sequenceNumber)) {

phy802_11->stats.numberofACKcollisions++; // ACKパケットの衝突をカウント

// 再送パケットを重複してカウントしないように, ACKパケットのシーケンス番号を保持
phy802_11->stats.temp_ACKsequence =
phy802_11->rxMsg->sequenceNumber;

} else if ((phy802_11->rxMsg->packetSize == 88)
&& (phy802_11->stats.temp_DATAsequence !=
phy802_11->rxMsg->sequenceNumber)) {
phy802_11->stats.numberofDATAcollisions++; // DATAパケットの衝突をカウント

// 再送パケットを重複してカウントしないように, DATAパケットのシーケンス番号を保持
phy802_11->stats.temp_DATAsequence =
phy802_11->rxMsg->sequenceNumber;
}
}//if//
//********* add end *********//

}//if//
....
}

なお、phy802_11.hの構造体Phy802_11Statsには、以下の4つを加えています。
D_Int32 numberofDATAcollisions; // DATAパケットの衝突数
D_Int32 numberofACKcollisions; // ACKパケットの衝突数
D_Int32 temp_DATAsequence; // DATAパケットのシーケンス番号を保持
D_Int32 temp_ACKsequence; // ACKパケットのシーケンス番号を保持

考え方としては、シグナル受信中に新しいシグナルがやってきた場合、
新しいシグナルにエラーがあるかCheckRxPacketErrorで判断し、
エラーが生じていれば、そのシグナルがDATAパケットかACKパケットか判断して
パケット衝突として別々にカウントする、というものです。

パケットの判断はpacketSizeで行っているのですが、これは衝突パケットを出力してみた結果、
packetSizeが88byteで、virtualPayLoadSizeが1432byteのパケットと
packetSizeが18byteで、virtualPayLoadSizeが0byteのパケットしか存在していなかったためです。
前者がおそらくDATAパケットであり、後者は消去法でいくとACKパケットだろうとみなしています。
実は、まだここの部分が臆測の域を出ていません。
packetSizeとvirtualPayLoadSizeの理解も不十分であるので、
自分の修正にイマイチ自信が持てずにいます。

以上の修正をふまえて、

(1)関数Phy802_11SignalArrivalFromChannelのcase RECEIVINGの部分にカウンタを入れることによって、
本当にパケットの衝突をカウントできているか。
(2)カウントできているとすれば、上記のシミュレーションの全てのパケット衝突を網羅できているか。
(3)DATAパケットとACKパケットの判断基準は妥当か。

という点について、意見をお聞かせ下さい。

念のため、修正したソースコードとシナリオを添付しておきます。
何か不明瞭な点がございましたらご指摘お願いします。

長々と失礼致しました。
phy_802_11.tar.gz
フラット表示 前のトピック | 次のトピック
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT