网络传输时间从TCP/IP堆栈

Network transmission time from the TCP/IP stack

本文关键字:IP 堆栈 TCP 时间 网络传输      更新时间:2023-10-16

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

update

传输时间:客户端通过WAN/LAN等计算机网络连接到服务器的毫秒数。基本上,您会从外壳中的运行ping client1.example.com获得相同的结果。

没有完全可移植的方法来找到客户设置连接的时间,因为没有API查询内核中的此信息。但是您有一些途径:

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

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

TCP API中没有任何明确内置的事情来完成您想要的事情,但是假设您对服务器和客户端具有控制权,则可以做以下操作:

  1. 当客户端的Connect()完成时,将客户端记录当前时间(使用getTimeofday()或类似)
  2. 当服务器接受TCP连接时,请立即将一些数据发送给客户端(数据是什么)
  3. 当客户端从服务器接收数据时,将客户端记录在当前时间,然后从(1)
  4. 中记录的时间从中减去
  5. 现在您有了TCP往返时间;将其除以两个以估算单程时间。

当然,此方法将在测量中包括TCP协议的变化(例如,如果TCP数据包在从服务器到客户端的途中丢失,则需要在客户端看到它之前重新启动数据包,并且这将增加测得的时间)。那可能就是您想要的,或者如果不是,则可以使用UDP数据包进行类似的操作(例如,让客户端发送UDP数据包和服务器响应,然后客户端测量Send()和Recv()和Recv())的时间。当然,使用UDP,您必须处理防火墙,而NAT则阻止了返回客户的数据包,等等。