簡體   English   中英

如何檢測UDP數據包丟失? (C#)

[英]How to detect that UDP packet has been lost? (C#)

我正在開發SNTP客戶端,該客戶端通過UDP從NTP服務器獲取時間戳。 一切正常,我可以下載時間戳並更新Windows時鍾,但是如果UDP數據包丟失,我想得到一條消息。 如何檢測數據包何時丟失? 我需要這些信息,因為如果數據丟失,我想獲得新的時間戳。

...以及如何測試該功能? 如何故意丟失UDP數據包?

您有三種選擇:

  1. 忽略丟包
  2. 改用TCP
  3. 建立自己的檢測系統

您要問的是如何做#3,答案是:

  • 向每個數據包添加一個數據包編號和一個數據包時間戳。
  • 創建一個數據包堆棧,並將傳入的數據包插入按數據包編號排序的堆棧中。
  • 僅當存在一個包號為(最后一個包號+1)的包時,才從堆棧中刪除包。
  • 如果數據包中有間隙並且(gap +1)數據包的時間戳大於某個閾值,則發送“重新傳輸請求”數據包以使丟棄的數據包重新傳輸。

稍等片刻..這就是TCP的工作方式(*)! 您應該只使用TCP!

(*)這是一種簡化,TCP為使過程可靠而做了很多工作。

UDP是不可能的。 如果需要可靠的連接,則應使用TCP。

UDP是無連接協議。 沒有連接時,您將無法“檢測”任何東西。 您必須使用面向連接的協議(例如TCP)來解決此問題。

比較方式

好。 我知道了。 但是我可以通過執行以下操作來檢查數據包丟失嗎? 例如,如果我將計時器設置為2秒,然后運行此功能,我可以查看服務器是否正確響應。 那我應該知道是否有丟包嗎?

public bool IsResponseValid()
    {
        if(SNTPData.Length < SNTPDataLength || Mode != _Mode.Server)
        {
            return false;
        }
        else
        {
            return true;
        }
    }

因為無法測試UDP是否無法到達,所以唯一的正確選擇是在所有發送的數據前添加“數據包編號”作為前綴,因此,如果它不是行中的下一個編號,則您知道它丟失了一個數據包。

據我所知,除了拉扯電纜並更換電纜以外,沒有辦法故意丟失1個udp數據包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM