如何获得打开 TCP 连接的进程的“延迟”?
Posted
技术标签:
【中文标题】如何获得打开 TCP 连接的进程的“延迟”?【英文标题】:How can I get the "Latency" of a process that has a TCP connection open? 【发布时间】:2011-03-04 14:13:13 【问题描述】:我正在寻找 TCP 连接的“延迟”字段。我注意到 Windows 资源监视器有这个字段,我想知道是否有办法找到它。最好不使用 WMI。
如果您不确定我在说什么字段,请打开任务管理器,转到“性能”选项卡并点击“资源监视器”按钮。
资源监视器打开后,展开 TCP 连接区域,您将看到延迟字段。有没有办法以编程方式访问它?
谢谢!
【问题讨论】:
这个神秘的“资源监视器”按钮在哪里? @d03boy:Vista & 7 有资源监视器,XP 没有。我猜你在 XP 上? 【参考方案1】:我假设资源监视器查看给定 TCP 表条目的往返时间 (RTT)。这给出了整体网络延迟的合理指示。
您可以使用一个 API 来访问这些统计信息,即GetPerTcpConnectionEStats。这使您可以检索有关特定 TCP 连接的大量统计信息。
基本上你首先使用GetTcpTable获取tcp连接列表,然后找到你想要的行,并将它传递给GetPerTcpConnectionEStats,使用TcpConnectionEstatsPath作为EstatsType参数,这样你应该得到一个@987654325 @ 结构体。
此结构中包含许多 RTT 统计信息,其中最有用的可能是 SumRtt 和 CountRtt 成员,您可以使用它们来获取特定 TCP 表行的平均 RTT 计算。
请注意,这些功能只存在于Vista及以上版本中,但资源监视器也存在,所以我认为没关系。
【讨论】:
【参考方案2】:我认为您无法通过任何 API 访问此信息。资源监视器可能通过查看数据包被回复所需的时间来计算它。
要在您的应用中执行此操作,请执行以下操作(伪代码):
startTime = now
socket = openSocket()
endTime = now
latency = endTime - startTime
它不会非常精确,但应该非常接近实际的网络延迟。但是请记住,Nagle's algorithm 可能会影响延迟计算。
【讨论】:
知道是否有办法获取连接的套接字或 ip 吗?问题是我需要监控一个可以连接到 40 个不同 IP 的程序,但我不知道所有这些。 我不确定使用套接字打开时间是计算延迟的最佳方法,因为可能需要进行 ARP 解析,从而增加了所需的时间。以上是关于如何获得打开 TCP 连接的进程的“延迟”?的主要内容,如果未能解决你的问题,请参考以下文章
sh 修改OSX上的TCP设置以获得更好的吞吐量和更低的延迟
ORACLE数据库连接非常慢 tnsping 后获得的结果 测试了几次 平均延迟在15-20秒之间。 监听日志已经清理过了