TCP连接延迟应测三次握手耗时,需分离DNS解析与TCP建连,用net.DialTimeout配IP+端口;ICMP用exec.Command调系统ping并兼容多平台参数;并发需worker节流+context超时控制;延迟存float64,关注P99而非均值。
用 net.DialTimeout 测单次 TCP 连接延迟
真实网络延迟测试,不能只看 ICMP(ping),很多服务走的是 TCP,比如 API 接口、数据库连接。Go 标准库没有内置 ping 工具,但 net.DialTimeout 能直接模拟客户端建连行为,返回的耗时就是 TCP 三次握手完成时间。
常见错误是忽略 DNS 解析开销——net.DialTimeout 默认会先做 DNS 查询,如果目标域名解析慢,测出来就不是纯网络延迟。要分离 DNS 和 TCP,得先用 net.DefaultResolver.LookupHost 单独测一次,再用 net.DialTimeout 对 IP + 端口调用。
- 端口必须指定,比如
"80"或"443";传空字符串或"0"会 panic - 超时建议设为 5–10 秒,太短容易误判,太长拖慢批量测试
- 不要复用
net.Conn对象来“测多次”——每次Dial都是新连接,这才是真实场景
用 exec.Command 调用系统 ping 获取 ICMP 延迟
虽然 Go 不原生支持 ICMP,但多数 Linux/macOS/Windows 环境都有 ping 命令,直接调用更贴近运维习惯,也方便比对。
关键点在于参数兼容性:ping -c 3 -W 2 example.com 在 Linux 有效,但 macOS 的 -W 是毫秒级,且不支持 -c,得用 -c 3 + -t 2(macOS 用 -t,Linux 用 -W)。Windows 更麻烦,ping -n 3 -w 2000,单位是毫秒,且输出格式完全不同。