【问题标题】:Network transmission time from the TCP/IP stack来自 TCP/IP 堆栈的网络传输时间
【发布时间】:2014-03-08 13:19:24
【问题描述】:

每次客户端连接到我的服务器时,我都想记录客户端和服务器之间的传输时间 - 有没有一种方法可以做到这一点而无需 ping 客户端。我的服务器是用 C++ 编写的,并侦听 LAN TCP/IP 套接字。我希望 TCP/IP 堆栈上有一些东西可以在每个客户端连接后使用。

更新

传输时间:客户端通过计算机网络(如 WAN/LAN)连接到服务器所需的毫秒数。基本上与在 shell 中运行 ping client1.example.com 得到的结果相同。

【问题讨论】:

  • 请展开。您如何定义“传输时间”?您对瞬时 RTT、连接总时间等感兴趣吗?
  • @cnicutar 请查看更新。
  • 你有哪个操作系统?
  • @cnicutar OS 可移植代码,适用于 UNIX、Linux、Windows。
  • @cnicutar 不过都兼容伯克利套接字。

标签: c++ networking tcp network-programming


【解决方案1】:

没有完全可移植的方法来查找客户端设置连接所花费的时间,因为没有 API 可以查询内核以获取此信息。但你有一些途径:

  • 如果您可以在接口上捕获,则可以轻松测量从第一个 SYN 到 ACK 的时间。您应该能够在大多数系统上执行此操作。

  • 在某些 Unix 系统上,您可以启用 SO_DEBUG 套接字选项,该选项可能会为您提供此信息。根据我的经验,SO_DEBUG 很难使用。

【讨论】:

  • 正在启用TCP Keep-alive,但我不知道这是否会改变什么?
  • @IngeHenriksen 这与调试无关。
  • 不,我的意思是 TCP Keep-Alive 是否提供了任何额外的方法来获取传输时间?
  • @IngeHenriksen 它没有。 TCP Keep-Alive 是一种(有争议的)方案,主机每隔几个小时左右发送消息以使中间盒知道连接的存在。没有什么可以帮助您测量设置时间。
【解决方案2】:

TCP API 中没有明确内置的内容来执行您想要的操作,但假设您可以控制服务器和客户端,您可以执行以下操作:

  1. 当客户端的 connect() 完成时,让客户端记录当前时间(使用 gettimeofday() 或类似方法)
  2. 当服务器接受 TCP 连接时,让它立即向客户端发送一些数据(不管数据是什么)
  3. 当客户端从服务器接收到数据时,让客户端再次记录当前时间,并减去(1)中记录的时间
  4. 现在您有了 TCP 往返时间;将其除以 2 以估算单程时间。

当然,这种方法会在测量中包含 TCP 协议的变幻莫测(例如,如果 TCP 数据包在从服务器到客户端的途中丢失,则需要在客户端看到之前重新传输该数据包,并且这将增加测量时间)。这可能是你想要的,或者如果不是你可以用 UDP 数据包做类似的事情(例如,让客户端发送一个 UDP 数据包,服务器响应,然后客户端测量 send() 和 recv() 之间经过的时间) .当然,对于 UDP,您必须处理防火墙和 NAT 阻止返回客户端的数据包等。

【讨论】:

    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多