メイン 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 |
フラット表示 | 前のトピック | 次のトピック |