問題タブ [go-back-n]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2590 参照

java - データグラムソケットUDPプログラムの他のスレッドが不足しています

コースの割り当ての一環として、大きな画像ファイルを送信するために、Javaが提供するUDPレイヤーの上に信頼性のレイヤーを追加するという任務があります。これは、Go-Back-Nプロトコルを使用して実行されます:http://en.wikipedia.org/wiki/Go_back_N

私が理解していることから、この問題の核心は、パケットを送信できると同時に、ウィンドウを移動できる古いパケットの確認応答が入って​​いるかどうかを確認できることに依存しています。

私は現在、2つのスレッドを使用してこれを行っています。1つはウィンドウにスペースがある場合に次のパケットを送信するスレッドです。そして、着信確認を継続的にリッスンし、適切に反応するもの。

私の問題は、これら2つのスレッドが同時に動作しているようにプログラムをスレッド化する必要があることですが、実際には、ACKReceiverスレッドが非常に不均衡な時間を取得しているように見えます。スレッドダンプから、送信スレッドがDataSocket.receive()行に到達すると、しばらくの間「飢餓状態」になり、ここでの実行をブロックし、その間に他のスレッドを実行する機会を与えないように見えます。

私は、問題がDatagramSocket.receiveが同期されているという事実と関係があることを示唆しているように見える次の質問を見ました...しかし、問題に対する使用可能な解決策を提供していません:

JavaスレッドはI/O操作で一時停止しません

これが私のコードの送信者部分へのコードです。反対側の受信者は完全に正常であると比較的確信しています(1つには、それを機能させるためにスレッドを使用する必要はありませんでした!):

0 投票する
1 に答える
2833 参照

udp - Nプロトコルに戻る

GobackNプロトコルを2つの別々のクライアントおよびサーバーアプリケーションに実装しようとしています。私のシーケンス番号は3ビットに収まらなければならないので、2 ^ 3 = 8つの最大数、2 ^ 3-1=7のウィンドウサイズだとします。

最初はウィンドウ全体を送信します。最初の2つのパケット(0と1)は正しく受信されます。パケット2はドロップされます。受信者がパケット3から6を取得するとき、それは2を期待していたので、受信したパケットを2が欲しいと言ってナックする必要があります。

送信者が最初のnack2を受信すると、0と1が(ピギーバックによって)受信されたことを認識し、ウィンドウを前方に移動しますが、シーケンス番号2からウィンドウを再送信する必要もあります(つまり、2-3-4-5-6)。 -そしておそらく7-0)。送信者が2番目のnack2を受信するまでに、送信者はすでにそれらのパケットを送信しています。プロトコルのため、送信者は2を含むウィンドウ全体を再送信します。これで受信者は2(およびその他)を受信する可能性がありますが、2番目のnack2バッチでは、順序が正しくない2を再受信します。予想されるパケットをナックする必要があります。私はこれらすべての仮定で正しいですか?

私の場合、Go Back Nは、Stop and Waitよりもはるかに多くのパケットを送信しているように見えます。特に、ウィンドウサイズを大きくするほどです。何が得られないのですか?

0 投票する
1 に答える
3796 参照

c - 黒瀬シミュレーションネットワーク環境、Go-Back-N

クラスにCでGo-Back-Nを使用するシミュレートされたネットワーク環境のコードを作成しようとしています。A_timerinterrupt()しかし、私は自分のメソッドを含むある種の無限ループに入り続けています。以下はCファイルなので、それと私のメソッドを見ることができます。

シミュレートされたメッセージの数=10、パケット損失の確率= 0.1、破損の確率= 0.1、平均時間= 5、およびTRACE=0でこれを実行したことに注意してください。

私が得るのは、が呼び出されたA: Timer Stopped!ときにのみ発生するメッセージの無限ループです。A_timerinterrupt

0 投票する
1 に答える
21027 参照

algorithm - Go-Back-N ウィンドウ サイズ

TCP の Go-Back-N アルゴリズムでは、ウィンドウ サイズ (N) がシーケンス番号スペース (S) よりも小さくなければならないのはなぜですか? S>N? 私は自分でそれを理解しようとしましたが、静かにしないでください

0 投票する
1 に答える
429 参照

c++ - 文字配列を含むパケットを送信しようとしたときのセグメンテーション エラー (コア ダンプ)

最大 30 文字のパケットを他の識別情報と共に送信しようとしています。ここにコンストラクタがあります。

私のクラスでは、次の方法でシリアル化および逆シリアル化する必要があります。

このクライアント コードにより、server.exe でセグメンテーション エラーが発生します。

サーバー側の受信コードは次のとおりです。

パケット内のデータの内容を null にして長さを 0 に設定すると、パケットは完全に正常に転送されます。パケットの長さを増やして文字列を指定しようとするとすぐに、サーバーでセグメンテーション エラーが発生します。

ここで何が欠けていますか?バッファーを大きくしすぎているか、間違ったものを指し示したり参照したりしているように感じます。

0 投票する
1 に答える
59 参照

c++ - オブジェクトの配列内のオブジェクトにアクセスしようとしていますが、保存されるオブジェクトは 1 つだけです

クラスに GoBackN ARQ を実装しようとしています。ファイルを読み取り、30 文字のパケットに分割してから、パケットをパケットの配列に格納しようとしています。これらのパケットはすべて のオブジェクトですclass packet

現在、このコードはコンパイルおよび実行されますが、パケットの配列にアクセスすると、配列のインデックス 0 で最後と最新のパケットを受け取ります。インデックス 1 にアクセスしようとすると、別のパケットを期待していましたが、パケットはすべてのインデックスで同じです。

すべてのパケットのデータが同じなのはなぜですか?

のコンストラクターコードclass packet