代理服务器处于网络模型哪一层,没有统一答案。有人认为属于应用层,有人说是会话层,还有人觉得和VPN一样工作在网络层。几种说法都能找到对应的场景,差异取决于代理类型,还有它处理数据的方式。
按照OSI七层模型划分,最常用的HTTP代理属于应用层网关。客户端提交完整HTTP请求给到代理,代理解析目标地址与请求内容,以自身身份向目标服务器发起新连接。目标服务器看到的IP是代理地址,不是客户端IP。代理收到响应之后,原样或者修改内容返回客户端。这个过程代理必须读懂HTTP协议,识别请求行、请求头、状态码,所以需要运行在应用层。它能实现的功能也依托这个层级,网页缓存、URL过滤、修改请求头、访问控制、记录访问日志,全部依赖解析应用层内容。

HTTPS代理情况稍微复杂。客户端先向代理发送CONNECT请求,代理和目标服务器建立TCP连接,后续双方数据通过这条隧道转发。代理只能获取目标域名和端口,无法读取加密后的HTTP内容,缺少解密能力。这个场景下代理更接近TCP中继,虽然触发方式依靠应用层CONNECT方法。如果代理开启SSL中间人解密,就回到应用层,可以读取完整HTTP内容,前提是客户端信任代理证书。
SOCKS代理层级和HTTP代理不同。SOCKS5协议一般归类到OSI会话层,也就是第五层。它不解析HTTP,不区分传输的是网页、邮件还是游戏流量。客户端告知SOCKS代理,需要连接某个IP和端口,代理建立连接之后双向转发字节流。协议支持TCP、UDP,自带认证,无法读取应用层内容。所以SOCKS代理通用性更强,可以代理各类流量,代价是不能基于应用内容做访问管控。放到TCP/IP模型理解,SOCKS介于传输层和应用层之间,依托TCP/UDP,但不属于传输层协议。
透明代理、反向代理是另外两类形态。透明代理依靠网络层路由、防火墙重定向规则实现。客户端没有手动配置代理,请求到达网关时,被悄悄转发到代理服务器。重定向动作发生在网络层或者传输层,但代理服务器接收请求之后,依旧在应用层解析处理。反向代理部署在服务端一侧,客户端以为直接访问目标网站,实际请求先抵达反向代理。Nginx、HAProxy这类反向代理运行在应用层,可以依据域名、URL路径、请求头路由,同时实现负载均衡与SSL终止。四层负载均衡器工作在传输层,只识别IP与端口,不解析应用层内容,和七层反向代理不是一类东西。
NAT经常拿来和代理对比,但二者层级不一样。NAT运行在网络层与传输层,修改IP数据包源地址或者目的地址,完成地址转换。代理属于应用层或者会话层概念,建立两条独立连接,客户端到代理一条,代理到目标服务器一条。NAT设备对客户端和目标服务器透明,代理清楚知晓自身处于中间转发位置。
VPN和代理层级差别更明显。IPsec VPN工作在网络层,把完整IP包加密封装进另一个IP包传输。OpenVPN、WireGuard大多运行在传输层或者网络层,创建虚拟网卡,整机流量全部走隧道。代理一般只处理指定应用流量,或是依靠PAC脚本、系统代理配置限定转发请求。VPN相当于让整台设备接入另一个内网,代理只是单独为请求更换传输路径。
回到最开始的问题,代理服务器主要工作在应用层,HTTP代理、反向代理、SSL中间人代理都属于这类。SOCKS代理偏向会话层,层级更低,通用性更强。透明代理依靠网络层、传输层做流量重定向,但代理本身逻辑依旧在应用层或会话层执行。理解层级划分,排查代理故障会更方便。代理连接失败,先确认TCP连通性,属于传输层问题。TCP连接正常但网页打不开,大概率是应用层代理协议不匹配。单个应用代理异常,其他应用正常,就要看该应用使用SOCKS还是HTTP代理,请求投递到哪一层。