上周有个做数据采集的朋友找我,说手里拿了一批socks5的代理ip,想筛出延迟低的那几个用,结果在电脑上装了个图形化测试工具,装完还得配端口、填协议,折腾了快二十分钟。我直接跟他说:你打开终端,敲两行命令,十秒钟出结果。他愣了一下,说不用装东西?我说不用,你电脑里自带的curl就够用了。
其实测代理ip延迟这事儿,真没想象中那么复杂。尤其是socks5协议的代理,很多人觉得它比http代理"高级",测起来肯定也麻烦,其实完全不是。下面我就把整个过程拆开了讲,你跟着敲就行。
先搞清楚你要测什么
在动手之前,你得确认三样东西:
第一,代理ip的地址和端口。比如 127.0.0.1:1080 或者 203.0.113.45:9050,这个你从服务商那里拿到的时候就有。
第二,协议类型。你确认是socks5,不是http,也不是socks4。socks5在curl里写的是 socks5h:// 或 socks5://,别搞混了。
第三,一个目标网址。你最终要通过这个代理去访问哪个站点,就用哪个来测。如果你平时主要抓某个站的数据,那就拿那个站来测,测出来的延迟才有参考价值。别拿一个你根本不会访问的站点来测,数字好看也没用。
最核心的一条命令
打开终端(Mac是Terminal,Linux是Terminal,Windows用PowerShell或者Git Bash都行),输入下面这行:
curl -o /dev/null -s -w "总耗时: %{time_total}s" -x socks5h://127.0.0.1:1080 https://www.baidu.com
把 127.0.0.1:1080 换成你实际的代理ip和端口。回车,你会看到类似这样的输出:
总耗时: 0.342s
这个 0.342s 就是你通过这条代理ip访问百度,从发请求到收到完整响应,总共花了342毫秒。这就是你要的延迟数据。
几个参数解释一下,别被吓到:
-o /dev/null:把响应内容扔掉,我们只要时间数据,不要页面内容-s:安静模式,不显示进度条那些乱七八糟的-w "...":自定义输出格式,%{time_total}是总耗时变量-x socks5h://...:指定走socks5代理,h表示DNS解析也走代理(这个很重要,下面会说)
想看更细的时间拆分?加几个变量就行
有时候你想知道延迟到底卡在哪一步——是DNS解析慢,还是TCP连接慢,还是TLS握手慢。把 -w 后面改一下:
curl -o /dev/null -s -w "DNS解析: %{time_namelookup}sTCP连接: %{time_connect}sTLS握手: %{time_appconnect}s首字节: %{time_starttransfer}s总耗时: %{time_total}s" -x socks5h://127.0.0.1:1080 https://www.baidu.com
输出大概长这样:
DNS解析: 0.081s
TCP连接: 0.156s
TLS握手: 0.298s
首字节: 0.335s
总耗时: 0.342s
你一看就明白了:DNS花了81毫秒,建立TCP连接到156毫秒,TLS握手到298毫秒,最后总耗时342毫秒。如果DNS那一步特别长,说明代理的DNS转发有问题;如果TCP连接那一步就卡住了,可能是代理ip本身到目标服务器的线路质量差。
socks5和socks5h,别用错了
这个点我多说两句,因为很多人第一次用会踩坑。
socks5:// 的意思是:DNS解析在你本地电脑完成,然后把解析好的IP地址发给代理服务器,代理再去连目标。
socks5h://(或者写成 socks5h://)的意思是:DNS解析也交给代理服务器去做。
测延迟的时候,强烈建议用 socks5h://。 原因很简单:你最终实际使用代理的时候,大概率也是让代理那边去解析域名的。如果你用 socks5:// 测,本地DNS解析的时间也算进去了,但那个时间跟你代理ip的质量没关系,测出来不准。
手里有好几个代理ip,想一起测
如果你手上有一批代理ip,不想一个一个敲,写个for循环就行。假设你有三个代理:
for proxy in "203.0.113.10:1080" "198.51.100.22:9050" "192.0.2.88:1080"; do
echo -n "$proxy => "
curl -o /dev/null -s -w "%{time_total}s" -x socks5h://$proxy https://www.baidu.com
echo ""
done
输出:
203.0.113.10:1080 => 0.287s
198.51.100.22:9050 => 0.612s
192.0.2.88:1080 => 0.198s
一眼就能看出第三个最快。如果你代理ip有几十个,可以把它们写到一个文本文件里,每行一个,然后改成这样:
while IFS= read -r proxy; do
echo -n "$proxy => "
curl -o /dev/null -s -w "%{time_total}s" --connect-timeout 5 -x socks5h://$proxy https://www.baidu.com
echo ""
done < proxy_list.txt
注意我加了 --connect-timeout 5,意思是如果5秒内连不上就跳过,不然碰到一个死ip,整个循环就卡在那了。
测出来的数字,怎么判断好不好
很多人测完一脸茫然:0.3秒算快还是慢?说实话,这取决于你的业务场景。但给你一个大概的参考范围:
| 总耗时 | 体感 | 适合的场景 |
|---|---|---|
| < 200ms | 非常流畅,几乎无感知 | 实时性要求高的业务、高频请求 |
| 200ms ~ 500ms | 正常,日常使用没问题 | 常规数据采集、页面抓取 |
| 500ms ~ 1s | 能感觉到"顿了一下" | 对时效性要求不高的任务 |
| > 1s | 明显卡顿 | 建议换一条线路或换一个ip |
另外提醒一句:单次测试的参考价值有限。 网络是有波动的,你测一次0.3秒,再测一次可能0.5秒。比较靠谱的做法是同一个代理ip连续测个5到10次,取个平均值,或者看最大值有没有异常尖刺。你可以把上面的命令外面再套一层循环:
for i in 1 2 3 4 5; do
curl -o /dev/null -s -w "%{time_total}s" -x socks5h://127.0.0.1:1080 https://www.baidu.com
done
跑五遍,心里就有数了。
几个容易踩的坑
坑一:代理没启动就去测。 你本地跑了一个socks5代理客户端,但忘了启动,或者端口写错了,curl会直接报 Failed to connect。先确认代理进程在跑,端口对得上。
坑二:目标站点本身慢。 你测出来1.2秒,以为是代理ip的问题,结果你不用代理直接访问那个站点也要1.1秒。所以测之前,先不用代理跑一次 curl -o /dev/null -s -w "%{time_total}s" https://www.baidu.com,拿到一个基准值,对比才有意义。
坑三:用http代理的写法去测socks5。 http代理在curl里写 -x http://ip:port,socks5写 -x socks5h://ip:port,协议前缀不一样,写错了会连不上或者行为异常。
常见问题
Q:我测的是socks5代理,但我的业务代码里用的是http代理,能通用吗?
不能直接通用。socks5和http是两种不同的代理协议,底层握手方式不一样。如果你的业务代码只支持http代理,那你需要找支持http协议的代理ip来用。不过现在很多服务商是同时提供多种协议的,比如神龙HTTP就支持HTTP/HTTPS/SOCKS5三种协议,你根据自己代码的需求选对应的就行,同一批ip资源,协议可以切换着来。
Q:测延迟的时候,目标网址选什么比较好?
选你实际业务中要访问的那个站点。如果你主要抓的是某个电商平台的页面,那就拿那个平台的首页来测。如果你不确定,或者要测的是通用网络质量,用 https://www.baidu.com 或者 https://www.qq.com 这种国内大站就行,它们服务器多、响应稳定,测出来的数据比较能反映代理ip本身的线路质量。别拿一个冷门小站来测,它自己服务器就慢,你测出来再高也不是代理的锅。
Q:同一个代理ip,上午测0.3秒,下午测0.8秒,正常吗?
正常。代理ip的延迟受很多因素影响:那个时段线路上的流量大小、目标站点服务器的负载、中间经过的节点有没有抖动。尤其是动态ip,它本身存活时间就短,不同时段分配到的出口可能不同。如果你用的是短效动态ip,比如神龙HTTP那种3分钟、5分钟、10分钟有效期的,每次拿到的ip都不一样,延迟有波动很正常。如果你需要延迟非常稳定,可以看看固定IP池,那个是基于云主机的高品质资源,连通率和稳定性都高很多,适合对延迟一致性要求严格的场景。
Q:curl测的时候提示 curl: (35) OpenSSL SSL_connect: Connection reset,是代理ip的问题吗?
大概率是。这个报错说明TCP连接建立之后,TLS握手阶段被对方重置了。可能的原因:这个代理ip已经被目标站点标记了(比如短时间内请求太频繁被临时限制),或者这个ip本身质量有问题。你可以换个目标站点再试一次,如果别的站点正常,那就是目标站点那边的问题;如果所有站点都这样,那这个ip大概率不可用,换一个就行。这也是为什么建议选一个可用率高的代理服务商,神龙HTTP那边每个ip都经过筛选验证,可用率标称99.9%,省得你测了一堆结果一半是死的。
说到底,测socks5代理ip延迟这件事,核心就是curl加几个参数,不用装任何第三方软件,不用打开浏览器,不用配置什么测试平台。你终端里那几行命令,比大多数图形化工具都快,而且结果更干净。把上面那些命令存到你的笔记里,下次拿到新ip直接跑,十秒钟出结论,该留的留,该扔的扔。


