4合一代理实现 (一)
目标: 单一程序,单一端口同时支持HTTP,HTTP+CONNECT,SOCKS4,SOCKS5代理协议
HTTP
原理比较简单,客户端发起请求的时候 Request URI 为目标的完整路径
直接请求百度首页通过部署在192.168.1.1上的HTTP代理访问百度首页1
2GET / HTTP/1.1
Host: www.baidu.com代理收到HTTP请求之后根据Request URI中的完成路径发起HTTP请求,然后将响应返回给客户端即完成了HTTP代理转发1
2GET http://wwww.baidu.com/ HTTP/1.1
Host: 192.168.1.1此代理只适合简单的HTTP会话,不适合HTTPS以及其他TCP会话
HTTP+CONNECT
原理也比较简单,客户首先对代理服务器发起 Method为CONNECT
的HTTP请求,请求头中的HOST
即为目标服务器地址及端口号(可选,如果没有端口号默认80
)
通过HTTP+CONNECT请求百度首页
客户端代理程序收到CONNECT请求后,解析1
2CONNECT / HTTP/1.1
Host: www.baidu.comHeader
中的HOST
字段,与目标服务器建立TCP连接,并对客户端作出响应(只返回HTTP头,必须无内容),并将当前连接中的数据转发到目标TCP连接,将目标TCP连接中的数据转发到当前连接客户端收到代理服务器的成功响应,开始通过当前连接传输数据(发送请求,接收响应)1
HTTP/1.1 200 Connection established
客户端继续发送1
2GET / HTTP/1.1
Host: www.baidu.comhttps://httpwg.org/specs/rfc7231.html#CONNECT
此代理只是在客户端与目标服务器之间转发TCP会话数据,无需关心TCP上承载数据的具体含义,该方式支持代理HTTPS以及其他TCP会话SOCKS4
具体原理见 RFC
Socks4 http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
Socks4a http://www.smartftp.com/Products/SmartFTP/RFC/socks4a.protocol支持TCP代理,支持远程DNS(Socks4不支持,Socks4a支持)
SOCKS5
具体原理见 RFC https://datatracker.ietf.org/doc/html/rfc1928支持 TCP、UDP代理,支持远程DNS