2

我正在开发 SNTP 客户端,它通过 UDP 从 NTP 服务器获取时间戳。一切正常,我可以下载时间戳并更新 Windows 时钟,但如果 UDP 数据包丢失,我想收到一条消息。如何检测数据包何时丢失?我需要这些信息,因为如果数据丢失,我想获得新的时间戳。

...以及如何测试该功能?如何故意丢失UDP数据包?

4

5 回答 5

13

你有三个选择:

  1. 忽略丢弃的数据包
  2. 改用 TCP
  3. 建立自己的检测系统

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

  • 为每个数据包添加数据包编号和数据包时间戳。
  • 创建一个数据包堆栈,并将传入的数据包插入到按数据包编号排序的堆栈中。
  • 仅当存在包号为(最后一个包号+1)的包时,才从堆栈中删除包。
  • 如果数据包中有间隙并且(gap + 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 回答