确定数据包进入网络缓冲区的时间

时间:2014-06-17 11:44:56

标签: .net sockets udp udpclient

我对使用UdpClient接收多播UDP数据包的现有程序进行了更改。

在这些测试期间,UDP数据包通过tcpreplay-edit --pps=...发送。

要创建一个之前/之后(原始版本与我的更改之一)比较程序处理传入数据包所需的时间,我会在Stopwatch.GetTimestamp()之后直接获取接收线程中的UdpClient.Receive()。 {1}},以及稍后处理数据包时(在不同的线程中)。

问题是,如果更改版本中的接收线程比之前更快,那么因为它只是尽可能快地切换接收到的数据包以便返回接收下一个数据包,而原始版本执行其他操作在接收单个数据包之间,经过处理时间实际上看起来会更糟。

有没有办法确定将数据包添加到网络缓冲区时的时间戳,而不改变接收线程的整体工作方式

或者我是否必须添加另一个仅接收数据包的线程,添加时间戳,并将其放入队列以供当前接收数据包的线程使用(除了其他工作之外)?

(假设我的接收缓冲区总是很大,或者我的接收线程总是足够快,以至于缓冲区不会填满,这显然会影响测量的时间)

1 个答案:

答案 0 :(得分:0)

这就是我要做的事情:

  • 记住第一个到达的UDP数据包的时间戳:incomingTimestamp[0]
  • 记录timestampAfterProcessing[packetNo] - incomingTimestamp[0]

(相反,我在问题中所述的原始尝试是timestampAfterProcessing[packetNo] - incomingTimestamp[packetNo]

记录的数字应该与各个接收线程中的任何延迟无关,因此可以用于比较之前/之后。这是

  • 假设tcpreplay-edit每次都会以更多或更少相同的时间重放数据包(至少会仔细检查每次tcpreplay-edit的总时间)
  • 确保我的套接字接收缓冲区不会溢出,否则比较会变得更难