【问题标题】:Measure RoundTrip TCP latency without changes to application protocol在不更改应用程序协议的情况下测量往返 TCP 延迟
【发布时间】:2014-03-25 01:53:10
【问题描述】:

有什么方法(最好在 C# 中)如何定期测量连接层延迟(往返)而不更改应用程序协议且不创建单独的专用连接 - 例如使用类似tcping 之类的 SYN-ACK 技巧,但不关闭/打开连接?

我通过给定的基于 ASCII 的协议连接到服务器(并且始终使用 TCP_NODELAY)。服务器向我发送大量离散消息,并且我定期发送“心跳”有效负载(但没有对心跳的响应有效负载)。 我无法更改协议,而且在许多情况下,我也无法创建多个与服务器的物理连接。

【问题讨论】:

    标签: c# networking tcp latency tcp-ip


    【解决方案1】:

    请记住,TCP 执行windowing,因此在尝试实施优雅的 SEQ/ACK 解决方案时可能会导致问题。 (你想要序列,而不是同步)

    [编辑:剪掉了一个非常复杂和令人困惑的解释。]

    我不得不说最好的方法是使用一种简单的秒表方法来启动计时器,发出非常薄的请求或轮询,然后测量返回的时间。如果该查询确实是您可以进行的最轻松的查询,那么这应该会给您合理期望等待的最短时间,这有时比 ping 更有价值(这可能会产生误导)。

    如果您真的只需要网络时间来处理和返回,只需使用ICMP ping

    【讨论】:

    • 感谢您指出 SEQ/ACK - 我想这就是方法!任何指针如何使用它们(在现有连接上,同时仍使用 .NET 套接字发送/接收其他数据)?窗口化——实际上需要知道当前连接的任何延迟(只要测量机制不会导致任何其他问题——但希望不会)。我无法创建新连接 => 没有 ICMP ping;我不能使用任何微小的请求(协议中没有类似的东西):|
    • 如果您无法更改网络代码,您将不得不在混杂模式下创建一个原始套接字来感知您的传出流量。 Ping 将是帮助您查看实际网络延迟的最简单的方法。 ping 不需要新的连接。它不是面向连接的协议。您只需生成 ping 并放开它。有些机器/路由器默认设置为不响应这些。你是说你不能在本地机器上打开一个新的套接字?
    • 大部分服务器会过滤掉 ICMP,因此我们使用 tcping 来测量进程外延迟。然而,有些服务器只允许 TCP/IP 连接——所以一旦我们连接到接收数据,我们就不能 telnet 或 tcping 到那个服务器。我希望我能够避免原始套接字或流量嗅探 - 在我的情况下看起来这是不可能的:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2015-01-23
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多