本文由 资源共享网 – ziyuan 发布,转载请注明出处,如有问题请联系我们![免费]代理VPN 详解
收藏前言 在对webRTC 原理分析中,发现访问STUN 得代理不生效,分析底层发现走的是UDP, 而目前使用的代理只支持TCP。 针对代理 http/https, socks5, vpn 只是知道他是代理,可以翻墙,其他很是模糊,所以写了这篇原理分析对比得文章。 一、 代理的工作原理 代理大概分为两种: http/https 代理, socks5代理。 1. 普通 HTTP/HTTPS 代理
|
流程:
客户端(你的浏览器)不直接连接目标服务器,而是连接代理服务器。
客户端 发送请求给代理:GET http://www.example.com/index.html。
代理 收到请求,解析 HTTP 头部,看懂你要去哪里。
代理 代替你向 www.example.com 发起 TCP 连接并发送请求。
代理 收到服务器的响应数据,再原封不动地转交给你。
关键点: 代理服务器完全看懂了你的请求内容(URL、Header、Body),它是在应用层工作的。
当你访问 https:// 网站时,数据是加密的,代理看不懂内容,也不知道你要请求哪个具体的页面(URL path),它只知道你要去哪个域名。这时它扮演的是“管道工”的角色。客户端 发送一个特殊的 HTTP 请求给代理:CONNECT www.google.com:443 HTTP/1.1。
代理 收到 CONNECT 指令后,它知道你不想让它看内容,只想让它帮忙搭个桥。
代理 向 www.google.com:443 建立一个 TCP 连接。
代理 回复客户端:200 Connection Established(连接已建立)。
盲转发: 此后,代理不再解析任何数据,它只负责把客户端发来的加密二进制流(TCP 包)直接转发给服务器,反之亦然。
流程:
关键点: 这就是所谓的 HTTP Tunnel(隧道)。代理此时退化成了一个 TCP 转发器。
HTTPS 代理(“隧道”模式 / CONNECT 方法)
2. SOCKS5 (Socket Secure Version 5) 代理
SOCKS5 介于 应用层(HTTP/FTP)和 传输层(TCP/UDP)之间。
不解析协议: SOCKS5 根本不在乎你传的是 HTTP 网页、FTP 文件、SMTP 邮件还是比特币交易数据。它只负责转发二进制数据流(Bytes)。
纯粹的转发: 一旦连接建立,它就变成了一根透明的管子。客户端发什么,它就转什么;服务器回什么,它就回什么。
这就是为什么它比 HTTP 代理更灵活、更快(因为它不需要解析复杂的 HTTP 头部)。
SOCKS5 的工作流程(握手过程)
SOCKS5 的建立过程比 HTTP 代理稍微复杂一点,分为三个阶段:
第一阶段:协商(Negotiation)
客户端 连接到 SOCKS5 代理服务器(默认端口 1080)。
客户端 发送一个包:“你好,我支持 SOCKS5 协议,我支持的认证方式有:无密码、账号密码认证。”
代理 回复:“好的,我们就用‘账号密码’方式吧。”(或者“不需要密码,直接来”)。
第二阶段:认证(Authentication - 可选)
如果协商结果需要验证,客户端会发送用户名和密码,代理验证通过后继续。
第三阶段:请求(Request)—— 关键步骤!
这是 SOCKS5 最强大的地方。客户端会告诉代理:“请帮我连接到 1.2.3.4的 80 端口。”
或者(这是 HTTP 代理做不到的):“我要发送 UDP数据,请给我分配一个 UDP 转发端口。”
第四阶段:转发(Relay)
如果是 TCP: 代理连接目标,连接成功后,直接把客户端的数据流对接过去。
如果是 UDP: 代理会告诉客户端:“好的,你把 UDP 包发到我的 IP:Port X,我会帮你转给目标。”
2. 为什么支持UDP
SOCKS5 专门设计了一个命令叫 UDP ASSOCIATE。
原理如下:
TCP 握手: 客户端先通过 TCP 连接告诉 SOCKS5 代理:“我要发 UDP 数据。”
分配端口: 代理服务器会在自己身上开一个临时的 UDP 端口(比如 50001),并把这个端口号通过 TCP 告诉客户端。
打包发送: 客户端把要发送的 UDP 数据(比如游戏操作),加上一个SOCKS5 头部(告诉代理这包数据要去哪),发给代理的 50001 端口。
拆包转发: 代理收到 UDP 包,剥掉 SOCKS5 头部,把原始数据发给目标服务器(比如游戏服务器)。
回传: 游戏服务器回包给代理,代理再加个头部发回给客户端。
注意: SOCKS5 的 UDP 转发依然需要一条 TCP 连接来维持“控制信令”(如果 TCP 断了,UDP 转发也会停止)。
3. SOCKS5 的另一个杀手锏:远程 DNS 解析
这是做爬虫或科学上网时非常重要的功能。
HTTP 代理: 通常是你本机解析好域名(DNS),拿到 IP,再告诉代理去连这个 IP。这会导致DNS 污染(你还没连上代理,DNS 就被劫持了)。
SOCKS5 代理: 支持服务端解析 (Remote DNS)。
你可以直接告诉代理:“我要连 www.google.com”。
代理服务器会在它的网络环境里解析这个域名,拿到真实的 IP,然后连接。
这样你的 ISP(运营商)根本不知道你想访问哪个域名,只知道你连了代理。
二、VPN
当你安装 VPN 软件(如 OpenVPN, WireGuard, Cisco AnyConnect)时,你会发现电脑的网络设置里多了一个"虚拟网卡"(通常叫 TUN 或 TAP 适配器)。VPN 和代理最大的区别:
代理(Proxy): 只是一个运行在后台的软件程序。浏览器或 App 需要主动把数据发给它,它才能转发。如果 App 不理它(比如游戏或 WebRTC),流量就直连了。
VPN: 它欺骗了操作系统。它在系统里虚拟了一张网卡。
VPN 启动后,会修改操作系统的路由表 (Routing Table)。
它告诉操作系统:“嘿,现在所有的网络流量(不管是什么协议),全部交给这张虚拟网卡处理!”
操作系统非常听话,把所有要发往互联网的数据包(IP Packet)都塞给了这张虚拟网卡。
网络模型差异(OSI 模型):
第 7 层(应用层): HTTP, FTP, SMTP —— HTTP 代理在这里工作。
第 4 层(传输层): TCP, UDP —— SOCKS5 代理在这里工作。
第 3 层(网络层): IP (Internet Protocol) —— VPN 在这里工作。
原理:
IP 协议(第 3 层)是 TCP 和 UDP(第 4 层)的载体。
TCP 数据包是包裹在 IP 包里的。
UDP 数据包也是包裹在 IP 包里的。
ICMP(Ping 命令)也是包裹在 IP 包里的。
因为 VPN 工作在第 3 层,它直接处理 IP 数据包。 它根本不关心这个 IP 包里面装的是 TCP 还是 UDP,甚至不关心是 HTTP 还是游戏数据。它只负责把这个 IP 包“打包带走”。VPN 处理 UDP 的具体流程如下:
拦截: 你的游戏/WebRTC 发出一个 UDP 数据包。操作系统根据路由表,把这个包交给了 VPN 的虚拟网卡。
封装(打包): VPN 软件拿到这个 UDP 包,把它加密,然后再包一层。
内层: 原始的 UDP 数据。
外层: VPN 自己的协议头(比如 OpenVPN 协议,通常也是用 UDP 传输)。
发送: VPN 把这个“包中包”通过真实的物理网卡(Wi-Fi/网线)发给 VPN 服务器。
解包: VPN 服务器收到后,剥开外层,拿出原始的 UDP 数据包,帮你在目标网络中发送出去。
二、HTTP(<=2.0)/HTTPS, SOCKS5,VPN 对比
| 维度 | HTTP / HTTPS 代理 | SOCKS5 代理 | VPN (虚拟专用网) |
| OSI 模型层级 | 第 7 层 (应用层) | 第 5 层 (会话层) | 第 3 层 (网络层) |
| 核心角色比喻 | 翻译官(读懂内容,帮你传话) | 接线员(帮你插线,不听内容) | 专用隧道/装甲车(打包所有数据,直接运走) |
| TCP 支持 | 支持 | 支持 | 支持 |
| UDP 支持 | 不支持(无法玩游戏/WebRTC) | 支持(需开启 UDP Associate) | 完美支持 |
| ICMP (Ping) 支持 | 不支持 | 不支持 | 支持 |
| 生效范围 | 局部 (App 级)仅对设置了代理的浏览器/脚本生效 | 局部 (App 级)仅对支持 SOCKS5 的软件生效 | 全局 (系统级)接管电脑/手机的所有流量 |
| 数据处理方式 | 解析内容能看到 URL、Header,甚至修改网页 | 透传数据只转发二进制流,不关心内容 | 封装数据将 IP 包加密封装,操作系统底层转发 |
| 加密能力 | 弱 / 无(HTTPS 仅加密内容,代理知道你去哪) | 无(标准协议不加密,需配合 SSH/TLS 使用) | 强(全程加密隧道,ISP 无法窥探) |
| 速度与性能 | 慢(需解析头部,开销大) | 快(纯转发,开销小) | 中(因加密解密和封装,有一定损耗) |

