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

Posted

技术标签:

【中文标题】来自 TCP/IP 堆栈的网络传输时间【英文标题】:Network transmission time from the TCP/IP stack 【发布时间】: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 不过都兼容伯克利套接字。 【参考方案1】:

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

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

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

【讨论】:

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

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

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

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

【讨论】:

以上是关于来自 TCP/IP 堆栈的网络传输时间的主要内容,如果未能解决你的问题,请参考以下文章

单步执行 TCP/IP 堆栈

linux xdp简介

TCP/IP__TCP/IP协议

计算机网络 - TCP/IP模型

2.1.5 计算机网络协议: TCP/IP

TCP/IP网络编程学习记录一