使用过快代理的同学都知道,快代理的代理服务器支持HTTP和Socks两类协议,其中HTTP具体有HTTP和HTTPS,Socks包含了Socks4、Socks4a、Socks5。
并且不少编程语言的网络请求库也支持使用HTTP和Socks协议的代理,那么这两种协议那种速度更快呢?网络上多数文章说Socks因为协议简单所以处理请求更快,结果真的是这样吗?
前提
由于HTTP1.1的长连接和Socks可以单TCP连接复用,如果是使用一个TCP连接传输多个请求其实HTTP和Socks差别不大;但是在网络爬虫使用代理的情况下,通常都是每个请求都会连接一个TCP连接,所以这里分析的就是HTTP和Socks谁建立代理连接耗时最短
HTTP代理
HTTP协议即超文本传输协议,是Internet上信息传输时使用最为广泛的一种非常简单的通信协议。
http代理格式http://proxyip:proxyport
http
访问的目标网站以http://开头,通常是客户端直接发送http请求到代理服务器,再由代理服务器去掉代理特征然后转发
- 客户端直接发送真实请求
- 代理服务器收到请求,去除代理特征,解析出目标主机
- 连接目标主机,转发请求
https(http connect)
访问的目标网站以https://开头,则使用的是http connect方法建立web隧道,通过web隧道传输用户的真实请求数据
2021年了,别再问代理是否支持HTTPS了!
- 客户端发送Connect请求
- 代理服务器收到Connect请求,解析出目标主机
- 连接目标主机,并给客户端发送连接成功报文
- 客户端收到Connection established,开始发送真实请求
使用http代理访问https网站,在传输真正的数据之前,需要与代理服务器进行一次“握手”,从而建立连接
Socks代理
SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是"Socket Secure"的缩写。这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6。根据OSI模型,SOCKS是会话层的协议,位于表示层与传输层之间。SOCKS协议不提供加密。
socks代理格式:socks5://proxyip:proxyport、socks4/4a://proxyip:proxyport
socks5
- 客户端发送socks5版本及认证方式
- 代理服务器返回不需要认证
- 客户端发送目标主机信息
- 代理服务器连接目标主机,返回连接成功
- 客户端发送真实请求
socks5用户名密码
- 客户端发送socks5版本及认证方式
- 代理服务器返回需要用户名密码认证
- 客户端发送用户名密码
- 代理服务器验证用户名密码,返回认证成功
- 客户端发送目标主机信息
- 代理服务器连接目标主机,返回连接成功
- 客户端发送真实请求
使用socks5代理可以发现在传输真正的数据之前,需要与代理服务器进行至少两次“握手”,如果使用用户名密码认证,则需要三次“握手”。
socks4/socks4a
- 客户端发送目标主机信息
- 代理服务器连接目标主机,返回连接成功
- 客户端发送真实请求
使用socks4协议相比于socks5协议“握手”流程就简单了许多,与http connect连接一样,只需要与代理服务器之间进行一次“握手”就可以传输数据
结论
由于客户端与代理服务器之间的“握手”数据传输在网络中是耗时的,所以“握手次数”越少则单次请求越快
如果访问的目标网站是http://,无疑使用http代理是最快的选择,因为不需要“握手”,代理服务器直接转发用户请求
如果访问的目标网站是https://,最快的是http代理(http connect)和socks4代理(不支持用户名密码认证),只需要一次“握手”;最慢的是socks5代理,需要至少进行两次“握手”才能真正传输用户数据。