版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl

一、引言
在软件开发中,经常会听到"四层负载均衡""七层负载均衡""Nginx 七层反向代理""HTTP 工作在应用层""TCP 工作在传输层"等说法。这些说法都涉及网络分层模型。其中最常见、最经典的理论模型,就是 OSI 七层模型。
OSI七层模型是国际标准化组织提出的网络通信参考模型。它并不是互联网实际使用的协议栈,而是一个用于理解和划分网络通信职责的理论框架。对于 程序员而言,不需要死记每一层的全部协议,但理解每一层的大致职责、常见介质、常见设备,有助于理解 HTTP、TCP、IP、Nginx、负载均衡、API 网关、服务网格等技术分别位于什么位置。
本文将从基本概念出发,逐层介绍 OSI 七层模型,并在每一层中说明常见协议、传输介质和设备,最后结合 Java Web 开发中的常见技术进行说明。
二、为什么需要网络分层
网络通信是一个复杂过程。浏览器访问服务器时,中间可能经过网卡、交换机、路由器、防火墙、代理服务器、负载均衡器等多个环节。如果把这些事情全部放在一个整体中处理,设计、实现和排查问题都会非常困难。
分层的基本思想是:把复杂的网络通信拆成多个层次,每一层只负责一部分职责,并向上层提供服务。这样带来的好处包括:
- 降低复杂度,每一层只需关注自己的任务;
- 便于标准化,不同厂商可以按照同一层协议实现互操作;
- 便于排查问题,可以根据层次判断问题出在物理连接、IP、端口还是应用;
- 便于替换实现,例如底层用有线还是无线,上层 HTTP 应用通常不需要关心。
可以这样理解:网络通信像寄快递。你只需要写好信、填好地址,剩下的打包、运输、中转、派送由不同环节负责。每个环节各司其职,最终把信件送到对方手中。
三、OSI 七层模型总览
OSI 七层模型从下到上依次为:
| 层次 | 名称 | 主要职责 | 典型协议 | 常见介质 | 常见设备或软件 |
|---|---|---|---|---|---|
| 7 | 应用层 | 面向应用,处理 HTTP、邮件、文件传输等 | HTTP、HTTPS、FTP、SMTP、DNS、SSH | 无独立物理介质 | 七层负载均衡、反向代理、API 网关、WAF、CDN、Web 服务器 |
| 6 | 表示层 | 数据格式转换、编码、压缩、加密 | TLS/SSL、JPEG、ASCII、MIME | 无独立物理介质 | TLS/SSL 加速卡、加密机、编码压缩库 |
| 5 | 会话层 | 建立、管理、终止会话 | RPC、NetBIOS、SOCKS | 无独立物理介质 | SOCKS 代理、RPC 中间件、会话边界控制器 |
| 4 | 传输层 | 端到端通信、端口、可靠传输、流量控制 | TCP、UDP | 无独立物理介质 | 四层负载均衡器、四层防火墙、NAT 设备、LVS |
| 3 | 网络层 | 逻辑寻址、路由选择 | IP、ICMP、ARP、路由协议 | 无独立物理介质 | 路由器、三层交换机、防火墙、网关 |
| 2 | 数据链路层 | 相邻节点传输、MAC 地址、差错检测 | Ethernet、PPP、VLAN | 依赖物理层介质 | 网卡、交换机、网桥、无线 AP |
| 1 | 物理层 | 传输比特流,定义物理接口 | RS-232、RJ45、IEEE 802.3 物理部分 | 双绞线、同轴电缆、光纤、无线电波 | 中继器、集线器、调制解调器、光模块、网卡物理接口 |
从下到上的记忆口诀是:
物、数、网、传、会、表、应。
从上到下则是:
应、表、会、传、网、数、物。
四、逐层详解
1. 物理层
物理层位于最底层,负责在物理介质上传输原始比特流。它关心的是电压、光信号、无线频率、接口形状、线缆规格等。
常见介质包括:
- 双绞线:最常见的以太网网线,例如 Cat5e、Cat6,接口通常为 RJ45,成本低,适合短距离;
- 同轴电缆:早期以太网和有线电视使用,现在较少用于局域网;
- 光纤:分为单模和多模,带宽高、传输距离远,常用于机房、数据中心和骨干网;
- 无线电波:Wi-Fi、4G、5G 等无线通信的介质。
常见设备包括:
- 中继器:放大和再生信号,延长传输距离;
- 集线器:多端口中继器,收到数据后向所有端口广播,已基本被交换机取代;
- 调制解调器:进行信号调制与解调,例如光猫、宽带 Modem;
- 光模块:把电信号转换为光信号,用于光纤通信;
- 网卡的物理接口部分:负责发送和接收物理信号。
生活化比喻:物理层相当于公路、铁路、航线,双绞线和光纤就是具体的道路和轨道。
与 Java 开发的关系:Java 程序员通常不直接处理物理层,但服务器网卡、交换机、机房线路出现问题,会表现为网络不通。
2. 数据链路层
数据链路层负责在相邻节点之间传输数据帧。它处理 MAC 地址、差错检测、介质访问控制等。
常见协议包括 Ethernet、PPP、VLAN 等。
常见设备包括:
- 网卡:拥有 MAC 地址,负责组帧、发送和接收数据帧;
- 交换机:根据 MAC 地址表转发数据帧,是局域网的核心设备;
- 网桥:连接两个网段,根据 MAC 地址转发;
- 无线接入点:即 AP,负责 Wi-Fi 终端接入;
- 二层交换机:普通交换机,工作在这一层。
数据链路层本身没有独立的物理介质,它依赖物理层的双绞线、光纤或无线电波。
生活化比喻:数据链路层相当于从你家到快递点、从快递点到收件人这一段运输,交换机像小区快递站,根据门牌号把包裹分到不同楼栋。
与 Java 开发的关系:通常由操作系统和网卡处理。开发中较少直接接触,但 MAC 地址、交换机、VLAN 等概念属于这一层。
3. 网络层
网络层负责逻辑寻址和路由选择。它决定数据包从源主机到目标主机经过哪些路径。
核心协议是 IP,辅助协议包括 ICMP、ARP、路由协议等。
常见设备包括:
- 路由器:根据 IP 地址和路由表转发数据包,连接不同网络;
- 三层交换机:具备路由功能的交换机,常用于局域网内高速转发;
- 防火墙:可工作在网络层到应用层,常见防火墙至少能过滤 IP 和端口;
- 网关:广义概念,可以是网络层网关,也可以是应用层网关。
网络层同样没有独立的物理介质,它依赖下层的数据链路层和物理层。
生活化比喻:网络层相当于跨城市运输的路线规划,路由器像高速公路上的立交桥和导航系统。
与 Java 开发的关系:
- IP 地址属于网络层;
ping命令使用 ICMP,通常用于测试网络层是否连通;- NAT、路由、子网等概念属于网络层;
- 服务器之间能否互相访问,首先取决于网络层是否连通。
4. 传输层
传输层负责端到端通信。它通过端口区分不同应用,通过 TCP 或 UDP 提供不同的传输能力。
- TCP:面向连接、可靠传输、有流量控制和拥塞控制;
- UDP:无连接、不保证可靠,但开销小、速度快。
常见概念包括端口号、连接、三次握手、四次挥手。
常见设备或软件包括:
- 四层负载均衡器:根据 IP 和端口转发,不解析 HTTP;
- 四层防火墙:根据 TCP/UDP 端口做访问控制;
- NAT 设备:网络地址转换,常集成在路由器或防火墙中;
- LVS:常见的四层负载均衡软件。
传输层没有独立的物理介质,它依赖网络层及以下各层。
生活化比喻:传输层相当于快递公司。它负责把包裹从寄件人送到收件人,并决定是否要签收、是否重发、是否按顺序送达。
与 Java 开发的关系:
- Spring Boot 内嵌 Tomcat 监听 8080 端口,属于传输层;
- 浏览器通过 TCP 连接访问服务器;
- 四层负载均衡工作在传输层,根据 IP 和端口转发;
telnet IP 端口或nc -zv IP 端口测试的是传输层端口是否可达。
5. 会话层
会话层负责建立、管理和终止会话。它关注通信双方如何开始一次对话、如何保持会话、如何结束会话。
常见概念包括 RPC、NetBIOS、SOCKS 等。在现代互联网中,会话层往往与应用层合并实现,独立会话层协议不如传输层和应用层常见。
常见设备或软件包括:
- SOCKS 代理:不解析 HTTP,只转发连接,常被归到会话层附近;
- 会话边界控制器:用于 VoIP 等场景,管理会话;
- RPC 中间件:负责远程调用的会话管理。
会话层没有独立的物理介质。
生活化比喻:会话层相当于打电话时先拨号、建立通话、维持通话、最后挂断。它管理的是"这次对话"本身。
与 Java 开发的关系:
- HTTP Session 是应用层概念,不是 OSI 会话层协议;
- SOCKS 代理常被归到会话层附近,因为它不解析 HTTP,只转发连接;
- 大多数 Java 开发者不会直接编写会话层协议。
6. 表示层
表示层负责数据格式转换、编码、压缩和加密。它确保不同系统之间能够理解彼此的数据表示。
常见例子包括:
- 字符编码,如 ASCII、UTF-8;
- 数据格式,如 JPEG、MPEG;
- 加密协议,如 TLS/SSL;
- 数据压缩。
常见设备或软件包括:
- TLS/SSL 加速卡:专用硬件加速 HTTPS 加密解密;
- 加密机:用于密码运算和设备密钥管理;
- 编码、压缩、序列化库:例如 JSON、XML、Protobuf、JPEG;
- Nginx 的 TLS 终止能力:在软件层面完成 HTTPS 解密。
表示层没有独立的物理介质。
生活化比喻:表示层相当于翻译和打包。你写的是中文,对方只懂英文,就需要翻译;包裹需要压缩或加密,也在这里处理。
与 Java 开发的关系:
- HTTPS 中的 TLS 通常被归入表示层,或视为位于传输层与应用层之间;
- Nginx 做 TLS 终止,就是在入口层解密 HTTPS,再把 HTTP 请求转发给 Spring Boot;
- JSON、XML 的序列化与反序列化,在工程中通常由应用层框架处理,但涉及数据表示问题;
- 字符编码乱码问题,本质上与表示层职责相关。
7. 应用层
应用层是最靠近用户和应用的一层。它直接面向具体应用,处理 HTTP、HTTPS、FTP、SMTP、DNS、SSH 等协议。
典型软件包括浏览器、Web 服务器、邮件客户端、DNS 客户端等。
常见设备或软件包括:
- 七层负载均衡器:根据 HTTP 路径、Host、Header 转发;
- 反向代理服务器:例如 Nginx,作为统一入口;
- API 网关:负责鉴权、限流、路由、聚合;
- Web 应用防火墙:即 WAF,防护 HTTP 攻击;
- CDN 边缘节点:缓存和分发静态资源;
- Web 服务器:例如 Nginx、Apache、Tomcat;
- 代理服务器:例如正向代理、HTTP 代理。
应用层没有独立的物理介质,它依赖下层所有层次提供的通信能力。
生活化比喻:应用层相当于你写的信的内容,Nginx、API 网关、WAF 像公司前台和安检。
与 Java 开发的关系:
- HTTP、HTTPS 属于应用层;
- Spring Boot 提供 REST API,属于应用层;
- Nginx 作为七层反向代理,能解析 HTTP,属于应用层;
- API 网关、Kubernetes Ingress、服务网格七层能力,通常工作在应用层;
- CORS、JWT、OAuth2 等也属于应用层概念;
- CDN 缓存静态资源,通常也涉及应用层。
五、TCP/IP 模型与 OSI 的对应
OSI 是理论参考模型,实际互联网更常用 TCP/IP 模型。常见有四层模型和五层模型。
| OSI 七层 | TCP/IP 四层 | TCP/IP 五层 |
|---|---|---|
| 应用层、表示层、会话层 | 应用层 | 应用层 |
| 传输层 | 传输层 | 传输层 |
| 网络层 | 网络层 | 网络层 |
| 数据链路层、物理层 | 网络接口层 | 数据链路层、物理层 |
也就是说,在实际开发中,表示层和会话层通常被并入应用层。HTTP、TLS、JSON、Session 等,在 TCP/IP 视角下大多归入应用层处理。
六、一次 HTTP 请求的分层视角
以浏览器访问 Spring Boot 应用为例:
text
浏览器 -> Nginx -> Spring Boot
从分层角度看:
- 应用层:浏览器生成 HTTP 请求,包含方法、路径、请求头、请求体;
- 表示层:如果使用 HTTPS,TLS 负责加密;
- 会话层:建立和管理通信会话;
- 传输层:TCP 建立连接,使用端口,例如 443、80、8080;
- 网络层:IP 负责寻址和路由;
- 数据链路层:以太网等负责相邻节点传输;
- 物理层:通过双绞线、光纤或无线电波传输比特。
到达服务器后,过程反向进行:
- 物理层接收信号;
- 数据链路层解析帧;
- 网络层解析 IP;
- 传输层交给对应端口;
- Nginx 在应用层解析 HTTP;
- 如果是静态资源,Nginx 直接返回;
- 如果是
/api请求,Nginx 通过反向代理转发给 Spring Boot; - Spring Boot 处理业务后返回 JSON;
- Nginx 再把响应返回给浏览器。
七、Java 开发常见技术所在层次
| 技术或概念 | 主要层次 | 说明 |
|---|---|---|
| HTTP、HTTPS | 应用层 | Java Web 最常接触的协议 |
| Spring Boot REST API | 应用层 | 提供业务接口 |
| Nginx 七层反向代理 | 应用层 | 能解析 HTTP,按路径、域名转发 |
| Nginx 四层代理 | 传输层 | 根据 IP、端口转发,不解析 HTTP |
| 四层负载均衡 | 传输层 | 典型如 LVS |
| 七层负载均衡 | 应用层 | 典型如 Nginx、HAProxy |
| API 网关 | 应用层 | 鉴权、限流、路由、聚合 |
| Kubernetes Ingress | 应用层 | 定义 HTTP 入口规则 |
| 服务网格 Sidecar | 四层或七层 | 治理服务间通信 |
| CDN | 应用层 | 缓存和分发静态资源 |
| TCP、UDP | 传输层 | 端口、连接、可靠传输 |
| IP、ICMP | 网络层 | 地址、路由、ping |
| MAC、Ethernet | 数据链路层 | 局域网传输 |
| TLS/SSL | 表示层附近 | 加密、HTTPS |
| SOCKS 代理 | 会话层附近 | 更底层的代理 |
| CORS、JWT、OAuth2 | 应用层 | 浏览器安全、认证授权 |
| 双绞线、光纤 | 物理层 | 传输介质 |
| 交换机 | 数据链路层 | 根据 MAC 转发 |
| 路由器 | 网络层 | 根据 IP 转发 |
八、常见误解
1. OSI 七层模型不是实际协议栈
OSI 是理论参考模型。实际互联网使用 TCP/IP 协议栈。学习 OSI 是为了理解分层职责,而不是要求每个协议严格对应七层。
2. 表示层和会话层在现代互联网中弱化
在 TCP/IP 中,表示层和会话层通常并入应用层。TLS、JSON、Session 等,工程中往往由应用层框架处理。
3. HTTPS 不是独立一层
HTTPS 是 HTTP over TLS。HTTP 仍在应用层,TLS 通常被归入表示层或位于传输层与应用层之间。
4. 四层和七层负载均衡不同
- 四层负载均衡工作在传输层,看 IP 和端口;
- 七层负载均衡工作在应用层,看 HTTP 路径、Host、Header。
因此,四层负载均衡不能根据 /api 路径分流,七层可以。
5. ping、telnet、curl 测试的层次不同
ping使用 ICMP,主要测试网络层;telnet IP 端口或nc -zv IP 端口测试传输层端口是否可达;curl测试应用层 HTTP 是否正常。
6. Nginx 既能做四层,也能做七层
Nginx 常见用法是七层反向代理,但它也可以通过 stream 模块做四层代理。说"Nginx 是七层反向代理"时,通常指其 HTTP 反向代理能力。
九、总结
OSI 七层模型从下到上为:
物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
对 Java 开发者来说,最重要的是建立以下认知:
- 物理层看介质,例如双绞线、光纤、无线电波;
- 数据链路层看 MAC 和交换机;
- 网络层看 IP 和路由器;
- 传输层看端口和四层负载均衡;
- 会话层、表示层在现代互联网中通常并入应用层处理;
- 应用层看 HTTP 和七层代理,例如 Nginx、API 网关、WAF、CDN;
- 四层负载均衡在传输层,七层负载均衡在应用层。
可以用一个生活化比喻总结:
应用层是你写的信,表示层负责翻译和加密,会话层负责建立通话,传输层是快递公司,网络层负责跨城市路由,数据链路层负责相邻节点运输,物理层是公路、铁路和航线。双绞线和光纤是具体道路,交换机和路由器是路口和立交桥。
理解分层模型的价值,不在于背诵协议名称,而在于遇到问题时能判断问题大致出在哪一层。例如,ping 不通偏网络层,端口不通偏传输层,HTTP 返回 502 偏应用层和反向代理转发。掌握这种分层思维,再理解正向代理、反向代理、Nginx、负载均衡、API 网关和服务网格,就会更加清晰。