目标: 单一程序,单一端口同时支持HTTP,HTTP+CONNECT,SOCKS4,SOCKS5代理协议

  1. HTTP

    原理比较简单,客户端发起请求的时候 Request URI 为目标的完整路径
    直接请求百度首页
    1
    2
    GET / HTTP/1.1
    Host: www.baidu.com
    通过部署在192.168.1.1上的HTTP代理访问百度首页
    1
    2
    GET http://wwww.baidu.com/ HTTP/1.1
    Host: 192.168.1.1
    代理收到HTTP请求之后根据Request URI中的完成路径发起HTTP请求,然后将响应返回给客户端即完成了HTTP代理转发

    此代理只适合简单的HTTP会话,不适合HTTPS以及其他TCP会话

  2. HTTP+CONNECT

    原理也比较简单,客户首先对代理服务器发起 Method为CONNECT的HTTP请求,请求头中的HOST即为目标服务器地址及端口号(可选,如果没有端口号默认80)
    通过HTTP+CONNECT请求百度首页
    客户端
    1
    2
    CONNECT / HTTP/1.1
    Host: www.baidu.com
    代理程序收到CONNECT请求后,解析Header中的HOST字段,与目标服务器建立TCP连接,并对客户端作出响应(只返回HTTP头,必须无内容),并将当前连接中的数据转发到目标TCP连接,将目标TCP连接中的数据转发到当前连接
    1
    HTTP/1.1 200 Connection established
    客户端收到代理服务器的成功响应,开始通过当前连接传输数据(发送请求,接收响应)
    客户端继续发送
    1
    2
    GET / HTTP/1.1
    Host: www.baidu.com

    https://httpwg.org/specs/rfc7231.html#CONNECT
    此代理只是在客户端与目标服务器之间转发TCP会话数据,无需关心TCP上承载数据的具体含义,该方式支持代理HTTPS以及其他TCP会话

  3. 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支持)

  4. SOCKS5

    具体原理见 RFC https://datatracker.ietf.org/doc/html/rfc1928

    支持 TCP、UDP代理,支持远程DNS