公众号旧文

浏览器 和 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

下载链接。

就足以让用户测试线路质量。

因为真正重要的不是下载工具,而是下载路径。