SOCKS5标准在《RFC1928》中进行了概要的说明。SOCKS5位于应用层和传输层之间,因此不能支持网络层的协议(如ICMP);与SOCKS4相比,SOCKS5:
1、同时支持TCP和UDP;
2、支持强身份验证;
3、支持域名寻址;
4、支持IPv6;
Netty原生支持SOCKS5,下面通过curl观察SOCKS5协议的通信。使用形如:
curl --socks5 socks-server-ip:socks-server-port http://www.meilongkui.com
的命令可以让curl使用SOCKS5代理进行访问:
curl命令使用SOCKS5代理
此时,可以在Netty端看到如下的日志:
Netty的SOCKS5服务器日志
这里面比较让人迷茫的地方有几点:
1、CONNECT命令成功后,SOCKS客户端是否后续就直接向SOCKS服务器发送裸数据数据了?从Netty输出的日志看,是的。
2、curl每次执行完HTTP请求后就立即关闭了到SOCKS服务器的连接,从而使得SOCKS服务器也立即关闭了到远程服务器的连接。那么,如果SOCKS客户端与SOCKS服务器每次都要建立连接、SOCKS服务器每次都要和远程服务器建立连接是否性能方面会有比较大的开销?
我们用Apache HttpClient进行一下验证,首先不用代理判断一下连接池能够启用:</