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

パスワード:


パスワード紛失

新規登録
検索
メインメニュー
アクセスカウンター
2024/05/05:6/6
2024/05/04:22/24

2024/03/06より331/1375
人気モジュール
No.1: フォーラム 4
No.2: QualNet概要 1
日曜日からの合計
人気Browser&OS
No.1:巡回ロボット3
No.2:Linux2
No.3:Unknown OS1

No.1:どっかの巡回ロボット3
No.2:Safari2
No.3:Unknown Browser1

日曜日からの合計
メイン
   Transport Layer Protocol Implementation & Model Development
     シーケンス番号が符号付きint型の範囲を超えた際の動作について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
saka
投稿日時: 2013/10/24 17:40
新米
登録日: 2013/9/13
居住地:
投稿: 4
シーケンス番号が符号付きint型の範囲を超えた際の動作について
現在newRenoを用いてシミュレーションを行っているのですが、シーケンス番号が増加し符号付きint型の値を超えた際にエラーが発生し、シミュレーションがストップしています。
(ちなみに既存のTCPコードに変更を加えています)
原因に関しましては、tcp_input.cpp関数内の以下の部分と考えております。
if (SEQ_GEQ(tp->snd_una, tp->recover)) {
以上のコード上で、条件分岐を行う際に、tp->recover= 0の際に、tp->snd_unaの値が符号付きintの値を超える後に、負となることで問題が発生しております。
既存のTCPの動作において、そもそもtp->recove=0になる事がおかしいのでしょうか?負になっても問題なく動作できるシミュレータになっているのでしょうか?シーケンス番号が符号付きint型の範囲を超えると正常に動作しないのでしょうか?

ご存知の方がいらっしゃいましたらご教授頂けませんでしょうか。
ちなみにQualnet 3.9.5を使用しています。
よろしくお願いします。
hiro
投稿日時: 2013/10/25 9:40
長老
登録日: 2005/7/16
居住地:
投稿: 452
Re: シーケンス番号が符号付きint型の範囲を超えた際の動作について
QualNet 3.9.5 ですか、かなり初期のころからQualNetを使っているのですね。すごい。
個人的なアーカイブから3.9.5を取り出してソースコードを確認しました。

それはともかく、TCPのシーケンス番号は32bitの符号なし整数です。
これはQualNetであろうが関係なく、TCPとして決まってます。
したがってQualNetでも32bitの符号なし整数として処理します。

具体的な定義は、
./transport/tcp/tcp_hdr.h
の中に下記の定義があります。
typedef UInt32 tcp_seq;

ということで、そもそも32bitの符号つきとして処理していませんから、
負になること(マイナスになること)は想定していません。ゼロはありです。
saka
投稿日時: 2013/10/25 11:56
新米
登録日: 2013/9/13
居住地:
投稿: 4
Re: シーケンス番号が符号付きint型の範囲を超えた際の動作について
hiroさん、ご回答ありがとうございます。

こちらの説明の仕方が悪くうまく説明できておりませんでした。
if (SEQ_GEQ(tp->snd_una, tp->recover)) (tcp_input.cpp関数)
#define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) (tcp_seq.h関数)
上記の条件分岐において、シーケンス番号が符号なしint型であることは理解していましたが、p->recover=0の場合において、tp->snd_unaの値が符号付きint型の値より大きい場合と符号付きint型の値より小さい場合で動作が異なるのではないかという疑問でした。
既存のTCPの動作において、そもそもtp->recove=0になる事がおかしいのでしょうか?負になっても問題なく動作できるシミュレータになっているのでしょうか?シーケンス番号が符号付きint型の範囲を超えると正常に動作しないのでしょうか?

私自身は追加したコードによりtp->recove=0なるためシミュレーションがストップしている可能性が最も高いと考えていますが、使用しているQualnetのバージョンが古いため、シーケンス番号が符号付きint型の範囲を超えると正常に動作しない等の問題があれば教えていただきたいです。よろしくお願いします。
hiro
投稿日時: 2013/10/25 16:44
長老
登録日: 2005/7/16
居住地:
投稿: 452
Re: シーケンス番号が符号付きint型の範囲を超えた際の動作について
> こちらの説明の仕方が悪くうまく説明できておりませんでした。
> if (SEQ_GEQ(tp->snd_una, tp->recover)) (tcp_input.cpp関数)
> #define SEQ_GEQ(a,b) ((int)((a)-(b)) >= 0) (tcp_seq.h関数)
> 上記の条件分岐において、シーケンス番号が符号なしint型であることは理解していましたが、
> tp->recover=0の場合において、
> tp->snd_unaの値が符号付きint型の値より大きい場合と
> 符号付きint型の値より小さい場合で動作が異なるのではないかという疑問でした。

整理させて下さい。
if (SEQ_GEQ(tp->snd_una, tp->recover)) {
// true
} else {
// false
}
この式は
if ((int)((tp->snd_una)-(tp->recover)) >= 0) {
// true
} else {
// false
}
と展開される。
このif文では、tp->snd_unaとtp->recoverの差を計算しているので、

例えば、2147483647 -          0 = 2147483647 この場合は、(int)で評価すると、 2147483647 なのでtrue
例えば、2147483648 -          0 = 2147483648 この場合は、(int)で評価すると、-2147483648 なのでfalse
例えば、3000000000 - 1000000000 = 2000000000 この場合は、(int)で評価すると、 2000000000 なのでtrue
例えば、3000000000 -  852516352 = 2147483648 この場合は、(int)で評価すると、-2147483648 なのでfalse


ここまでの私の理解は正しいですか。

> 既存のTCPの動作において、そもそもtp->recover=0になる事がおかしいのでしょうか?

すみません、NewRENOにおける挙動を詳細に理解していないので、私にはわかりません。

> 負になっても問題なく動作できるシミュレータになっているのでしょうか?

何が負になるのでしょうか。if文の計算が負になる場合ですか?

> シーケンス番号が符号付きint型の範囲を超えると正常に動作しないのでしょうか?

実際に実行してみるとわかりますが、2^31=2147483648を超えても正常に動きます。

また、QualNet 4.0からのリリースノートを見ても報告は無いですね。
saka
投稿日時: 2013/10/25 17:29
新米
登録日: 2013/9/13
居住地:
投稿: 4
Re: シーケンス番号が符号付きint型の範囲を超えた際の動作について
hiroさんご返答ありがとうございます。

返答していただいた内容の理解で問題ありません。

>> 負になっても問題なく動作できるシミュレータになっているのでしょうか?
>何が負になるのでしょうか。if文の計算が負になる場合ですか?

仰る通りです。if文の計算が負になる場合です。

シミュレーションが符号付きint型の範囲を超えた際も正常に動作する事をふまえると、tp->recover=0が停止要因と考えられそうです。

もう少し、コードをよんでみようと思います。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ
Copyright c KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
XOOPS Cube PROJECT