公众号旧文
浏览器 和 wget,在服务器眼里有什么区别?
我新买了一台东京的 VPS,和之前一样,放了测速文件:
http://45.8.173.18:18080/download/100M.bin
我先在浏览器里直接打开链接下载了一次。
然后 SSH 登录到服务器,再执行两次:
wget -O /dev/null http://45.8.173.18:18080/download/100M.bin
测速服务器后台记录如下,可以看到有3条记录,看上去没什么区别:

服务器端显示(这是第二次用wget,对应上图中的第三条记录):

这时候我突然想到一个问题:
测速服务器知道我是用浏览器下载的,还是用 wget 下载的吗?
一、浏览器和 wget,本质上是什么?
先抛开界面不谈。
Chrome 是什么?Firefox 是什么?wget 又是什么?
从网络协议的角度来说,它们有一个共同身份:
HTTP 客户端(HTTP Client)
浏览器访问网页时:
GET /index.html HTTP/1.1
下载文件时:
GET
/download/100M.bin
HTTP/1.1
wget 下载文件时:
GET
/download/100M.bin
HTTP/1.1
curl 下载文件时:
GET
/download/100M.bin
HTTP/1.1
对于服务器来说,它看到的都是 HTTP 请求。
二、测速服务器到底看到了什么?
假设服务器记录以下信息:
客户端IP
请求路径
传输字节数
耗时
平均速度
那么它看到的大概是:
156.231.112.139
/download/100M.bin
100 MB
11.7 秒
8.5 MB/s
对于服务器来说,这就是一次普通的文件下载。
至于这个请求是来自:
- Chrome
- Firefox
- Edge
- wget
- curl
- aria2
- IDM
- 迅雷
并不重要。
服务器只负责发送文件。
三、那服务器完全分不出来吗?
也不完全是。
HTTP 请求里还有一个字段:
User-Agent
浏览器通常会发送:
User-Agent: Mozilla/5.0 ...
wget 通常会发送:
User-Agent: Wget/1.21.3
curl 通常会发送:
User-Agent: curl/8.5.0
如果服务器专门记录 User-Agent,那么它确实能知道这是 wget 下载的,或者这是 Chrome 下载的。
但问题在于,我的测速站根本不记录这个字段。
即使记录了,也可以伪装。
例如:
wget -U "Mozilla/5.0" \
-O /dev/null \
http://45.8.173.18:18080/download/100M.bin
这样 wget 就会伪装成浏览器。
服务器看到的 User-Agent 也会变成浏览器的样子。
四、我的实验说明了什么?
从测速服务器的记录来看:
浏览器下载一次。
服务器 wget 下载两次。
后台显示的都是:
IP
文件
大小
耗时
平均速度
并没有出现浏览器下载或者wget下载这样的区别。
这说明:
对于测速服务器来说,它更关心的是“谁在下载”和“下载了多少”,而不是“用什么工具下载”。
五、一个有意思的结论
我以前隐约觉得,
浏览器
wget
curl
aria2
IDM
迅雷
是完全不同的东西。
但从服务器的角度看:
它们其实都只是 HTTP 客户端。
服务器只是在响应 HTTP 请求。
至于请求是来自一个漂亮的浏览器界面,还是来自 Linux 终端,对服务器而言并没有本质区别。
这也是为什么很多 VPS 商家只需要放一个:
100M.bin
1G.bin
10G.bin
下载链接。
就足以让用户测试线路质量。
因为真正重要的不是下载工具,而是下载路径。