gpt4 book ai didi

c# - 如何在C#中实现PsPing TCP ping

转载 作者:可可西里 更新时间:2023-11-01 02:31:08 29 4
gpt4 key购买 nike

我正在尝试实现 Mark Russinovich 的 SysInternals PsPing tool在 C# 中使用 TCP ping 测量延迟。

我不确定它是如何进行 ping 调用的(显然不使用原始 Window 套接字,因为它不需要管理员权限即可运行)。我知道 hping 通过 TCP 发送 SYN 数据包并测量响应时间。

如果通过 TCP 不测量页面加载时间而只测量包确认的网络延迟,那么准确测量服务器延迟的实现技术是什么?有这方面的图书馆吗?

C:\>psping stackoverflow.com:80

PsPing v2.01 - PsPing - ping, latency, bandwidth measurement utility
Copyright (C) 2012-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

Pinging 198.252.206.16 with 32 bytes of data:
5 iterations (warmup 1) ping test:
Reply from 198.252.206.16: 81.57ms
Reply from 198.252.206.16: 80.81ms
Reply from 198.252.206.16: 80.68ms
Reply from 198.252.206.16: 80.52ms
Reply from 198.252.206.16: 80.71ms

Ping statistics for 198.252.206.16:
Sent = 4, Received = 4, Lost = 0 (0% loss),
Minimum = 80.52ms, Maximum = 80.81ms, Average = 80.68ms

更新:请不要回答“你为什么不使用 Ping 类,它已经做到了”,因为我问的是通过 TCP 而不是 ICMP 的 ping。

最佳答案

我尝试了几种方法,首先想到我必须使用原始套接字或至少使用 native 调用,但一个简单的 TCP 连接和关闭似乎创建与 psping 实用程序完全相同的结果:

var times = new List<double>();
for (int i = 0; i < 4; i++)
{
var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Blocking = true;

var stopwatch = new Stopwatch();

// Measure the Connect call only
stopwatch.Start();
sock.Connect(endPoint);
stopwatch.Stop();

double t = stopwatch.Elapsed.TotalMilliseconds;
Console.WriteLine("{0:0.00}ms", t);
times.Add(t);

sock.Close();

Thread.Sleep(1000);
}
Console.WriteLine("{0:0.00} {1:0.00} {2:0.00}", times.Min(), times.Max(), times.Average());

使用 Wireshark 检查流量,我可以确认 psping 和上面的代码片段正在创建完全相同的数据包序列。

-> [SYN]
<- [SYN,ACK]
-> [ACK]
-> [FIN,ACK]
<- [FIN,ACK]
-> [ACK]

没有预热和使用 TCP ping 的 psping 输出:

C:\>psping -w 0 stackoverflow.com:80

PsPing v2.01 - PsPing - ping, latency, bandwidth measurement utility
Copyright (C) 2012-2014 Mark Russinovich
Sysinternals - www.sysinternals.com

TCP connect to 198.252.206.16:80:
4 iterations (warmup 0) connecting test:
Connecting to 198.252.206.16:80: 92.30ms
Connecting to 198.252.206.16:80: 83.16ms
Connecting to 198.252.206.16:80: 83.29ms
Connecting to 198.252.206.16:80: 82.98ms

TCP connect statistics for 198.252.206.16:80:
Sent = 4, Received = 4, Lost = 0 (0% loss),
Minimum = 82.98ms, Maximum = 92.30ms, Average = 85.43ms

上述程序的输出:

C:\>TcpPing.exe stackoverflow.com 80
88.60ms
83.65ms
84.05ms
84.05ms
83.65 88.60 85.09

至于测量,我必须说,有时在不同的运行中会有很多不同的结果,但总的来说它们看起来非常接近:某种程度上证明测量 Connect() 调用已经足够好了。我在想,取几百个结果的中位数可能会更有信心地证明这一点。

关于c# - 如何在C#中实现PsPing TCP ping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26067342/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com