来自TCP / IP堆栈的网络传输时间

时间:2014-03-08 13:19:24

标签: c++ networking tcp network-programming

每次客户端连接到我的服务器时,我想记录客户端和服务器之间的传输时间 - 有没有办法在不必ping客户端的情况下执行此操作。我的服务器是用C ++编写的,并在LAN TCP / IP套接字上侦听。我希望TCP / IP堆栈上有一些东西可以在每个客户端连接时使用。

更新

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

  1. 当客户端的connect()完成时,让客户端记录当前时间(使用gettimeofday()或类似内容)
  2. 当服务器接受TCP连接时,让它立即将一些数据发送回客户端(无论数据是什么)
  3. 当客户端从服务器接收数据时,让客户端再次记录当前时间,并从中减去(1)中记录的时间
  4. 现在你有TCP往返时间;将它除以2以得到单向时间的估计。
  5. 当然这种方法将在测量中包括TCP协议的变幻莫测(例如,如果TCP数据包在从服务器到客户端的路上丢失,则需要在客户端看到之前重新传输数据包,并且这将增加测量时间)。这可能是您想要的,或者如果不是,您可以使用UDP数据包执行类似的操作(例如,让客户端发送UDP数据包并且服务器响应,然后客户端测量send()和recv()之间经过的时间) 。当然,使用UDP,您将不得不处理防火墙和NAT阻止数据包返回客户端等。