![]() ![]() ![]() | 投稿するにはまず登録を |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
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の差を計算しているので、
ここまでの私の理解は正しいですか。 > 既存の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が停止要因と考えられそうです。 もう少し、コードをよんでみようと思います。 |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |