2

UDP経由でNTPサーバーからタイムスタンプを取得するSNTPクライアントを開発しています。すべて正常に動作し、タイム スタンプをダウンロードして Windows クロックを更新できますが、UDP パケットが失われた場合にメッセージを取得したいと考えています。パケットが失われたことをどのように検出できますか? データが失われた場合に新しいタイムスタンプを取得したいので、その情報が必要です。

...そして、どうすればその機能をテストできますか? UDP パケットを故意に失うにはどうすればよいですか?

4

5 に答える 5

13

次の 3 つのオプションがあります。

  1. ドロップされたパケットを無視する
  2. 代わりに TCP を使用してください
  3. 独自の検出システムを構築する

あなたが求めているのは、#3を行う方法であり、答えは次のとおりです。

  • すべてのパケットにパケット番号とパケットのタイムスタンプを追加します。
  • パケット スタックを作成し、着信パケットをパケット番号でソートされたスタックに挿入します。
  • (最後のパケット番号 + 1) のパケット番号を持つパケットがある場合にのみ、スタックからパケットを削除します。
  • パケットにギャップがあり、(ギャップ + 1) パケットのタイムスタンプがしきい値よりも大きい場合は、「再送信要求」パケットを送信して、ドロップされたパケットを再送信します。

ちょっと待って..まさにそれがTCPのやり方です(*)! TCP を使用する必要があります。

(*) これは単純化したもので、TCP はプロセスを信頼できるものにするために多くの作業を行います。

于 2012-08-28T15:46:30.297 に答える
10

これはUDPでは不可能です。信頼できる接続が必要な場合は、TCPを使用する必要があります。

于 2012-08-28T10:59:27.530 に答える
1

UDP はコネクションレス プロトコルです。接続がない場合、何も「検出」する方法がありません。これを解決するには、TCP などの接続指向のプロトコルを使用する必要があります。

比較

于 2012-08-28T11:02:09.807 に答える
0

UDP が到着しなかったかどうかをテストする方法がないため、唯一の真のオプションは、送信されたすべてのデータに「パケット番号」をプレフィックスとして付けることです。したがって、次の番号でない場合は、パケットが失われたことがわかります..

私の知る限り、ケーブルを引っ張って交換する以外に、故意に 1 つの udp パケットを失う方法はありません..そして願っています..

于 2012-08-28T15:54:02.460 に答える
0

わかった。わかった。しかし、このようなことでパケット損失を確認できますか? たとえば、タイマーを 2 秒に設定してからこの関数を実行すると、サーバーが正しく応答したかどうかを確認できます。次に、パケット損失があったかどうかを知る必要がありますか?

public bool IsResponseValid()
    {
        if(SNTPData.Length < SNTPDataLength || Mode != _Mode.Server)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
于 2012-08-28T11:46:59.790 に答える