Appearance
OSI 七层与 TCP/IP 四层:分层、职责与关系
网络分层模型最重要的意义,不是让你背出“第几层叫什么”,而是先分清:
- 这一层到底在解决什么问题
- 它和上下层的边界在哪里
- 为什么真实工程里更常讲
TCP/IP,但学习时仍然会提OSI
1. 为什么网络一定要分层
一次网络通信至少会遇到这些问题:
- 应用数据怎么组织
- 两端进程怎么建立端到端传输
- 数据包怎么找到目标机器
- 底层链路怎么把数据真正送出去
如果一套协议同时解决全部问题,复杂度会非常高,而且任何一个局部修改都会牵一发动全身。
所以分层真正解决的是 让每层只处理自己最核心的一类问题,并通过稳定接口和上下层协作。
2. OSI 七层模型是什么
OSI 是 Open Systems Interconnection,中文常叫“开放系统互联参考模型”。
它更偏一套理论上的标准分层方式。
七层通常是:
- 物理层
- 数据链路层
- 网络层
- 传输层
- 会话层
- 表示层
- 应用层
很多初学者第一次看会觉得层太多。
更稳的理解方式是,OSI 更像一张把网络职责拆得更细的分析地图。
3. TCP/IP 四层模型是什么
真实互联网协议族更常按 TCP/IP 模型来理解。
常见写法会分成四层:
- 网络接口层
- 网络层
- 传输层
- 应用层
它不是说底层职责真的只有四层,而是把 OSI 里一些更细的层合并了。
所以工程上更常见的理解是:
OSI | TCP/IP |
|---|---|
| 物理层 + 数据链路层 | 网络接口层 |
| 网络层 | 网络层 |
| 传输层 | 传输层 |
| 会话层 + 表示层 + 应用层 | 应用层 |
4. 每一层大致在做什么
4.1 网络接口层
它更偏“数据在本地链路上怎么发出去”。
例如:
- 以太网
- Wi-Fi
- MAC 地址
- 帧封装
它主要负责把数据交给当前链路去传,不负责跨多个网络做全局路由。
4.2 网络层
它更偏“数据包怎么找到目标机器”。
这里的核心协议就是 IP。
它主要解决:
- 逻辑寻址
- 路由转发
- 跨网段通信
4.3 传输层
它更偏“目标机器上的哪个进程来收,以及传输特性是什么”。
这里最常见的是:
TCPUDP
它主要解决端到端通信问题。
4.4 应用层
它更偏“业务语义怎么表达”。
例如:
HTTPHTTPSDNSSMTP
它解决的是请求、响应、域名解析、邮件等更贴近业务和应用协议的问题。
5. OSI 和 TCP/IP 的关系到底怎么理解
很多人会把它理解成“两个互相打架的体系”,这不准确。
实际写项目时,更多是这样:
OSI更像理论参考模型TCP/IP更像真实互联网协议族的归纳方式
所以学习时经常同时讲这两个模型,是因为:
OSI更适合把职责分析清楚TCP/IP更适合落到真实协议和工程实践
🌟 如果一定要压缩成一句话,OSI 更像理论坐标系,TCP/IP 更像真实世界正在跑的协议分层。
6. 这一层最重要的能力边界
分层模型里最容易混的,不是名字,而是边界。
6.1 网络层和传输层不是一回事
- 网络层关心“包怎么找到目标机器”
- 传输层关心“目标机器上的哪个端点来收,以及传输特性是什么”
6.2 传输层和应用层不是一回事
- 传输层关心“怎么送”
- 应用层关心“送的内容按什么协议组织”
6.3 Socket 也不等于某一层协议
Socket 更像程序对网络通信能力的编程入口,它会同时接触 IP 地址、端口、协议族等概念,但它本身不是分层模型中的某个协议层。
7. 一个请求大致会穿过哪些层
以浏览器访问 https://example.com 为例,可以粗略理解成:
- 应用层:组织
HTTP请求,同时可能涉及DNS - 传输层:通常使用
TCP - 网络层:通过
IP寻址和转发 - 网络接口层:通过以太网或 Wi-Fi 把数据帧发出去
所以所谓“访问网页”,本质上不是单个 HTTP 协议自己完成全部工作,而是多层协作的结果。
8. 一个网络请求从发起到收到响应,完整会经历什么
如果只说“请求会经过七层”,还是太抽象。
更适合建立整体感的方式,是顺着一次真实访问把主线走一遍。
假设用户在浏览器地址栏输入:
text
https://example.com/api/users/1001这次请求大致会经过下面这些步骤:
- 浏览器先解析 URL,识别出协议是
HTTPS、目标域名是example.com、路径是/api/users/1001 - 浏览器先尝试查缓存,这里的“本地”主要指浏览器缓存和操作系统缓存,看当前域名有没有还没过期的
DNS结果 - 如果这些缓存都没有命中,才会继续向配置好的本地 DNS 服务器发起查询,把域名解析成目标 IP
- 浏览器拿到目标 IP 后,开始和目标服务建立
TCP连接 - 如果是
HTTPS,还要在TCP之上继续完成TLS握手 - 握手完成后,浏览器才真正发送
HTTP请求报文 - 请求报文会被分段、封装成
TCP段、IP包、链路层帧后发出去 - 中间路由设备根据目标 IP 把包一跳一跳转发到目标服务器
- 服务器网卡收到帧后,逐层向上拆包,最终交给对应端口上的服务进程
- 服务端应用处理业务逻辑,生成
HTTP响应 - 响应再按相反方向逐层封装,回到客户端
- 浏览器收到响应后,先解密、再解析响应头和响应体,最后决定是否渲染页面、更新状态或继续发后续资源请求
这里第 2 步和第 3 步很容易混,最好单独区分一下:
浏览器缓存:浏览器自己记住之前解析过的域名结果操作系统缓存:操作系统层面也可能暂存最近用过的 DNS 结果本地 DNS 服务器:通常是路由器、运营商 DNS、公司内网 DNS 或公共 DNS,例如8.8.8.8
也就是说,这里说“本地有 DNS 结果”,实际写项目时,更多是这样:
本地缓存里已经有可用的 DNS 解析结果。
而不是“本机自己就是一台 DNS 服务器”。
如果缓存命中,流程会更短一些:
- 浏览器解析 URL
- 浏览器或操作系统直接拿到缓存里的 IP
- 跳过远程 DNS 查询
- 直接进入
TCP连接建立 - 如果是
HTTPS,继续做TLS握手 - 然后发送
HTTP请求
如果缓存没有命中,流程才会变成:
- 浏览器解析 URL
- 浏览器和操作系统都没找到可用缓存
- 向本地 DNS 服务器发起查询
- 本地 DNS 再根据自己的缓存或继续向上游查询拿到结果
- 把 IP 返回给客户端
- 客户端再进入后续的
TCP、TLS、HTTP流程
这条链路最重要的意义,不是背步骤,而是先建立一个稳定认识:
一个请求不是“浏览器发个 HTTP 就完了”,而是域名解析、可靠传输、安全握手、报文封装、路由转发、应用处理共同协作的结果。
9. 把这 12 步放回各层分别在做什么
可以把上面的全过程重新映射回分层模型:
| 阶段 | 更主要落在哪层 |
|---|---|
| URL 解析、构造请求语义 | 应用层 |
DNS 域名解析 | 应用层 |
TCP 三次握手 | 传输层 |
TLS 握手 | 应用层和传输层之间的安全层 |
| 数据分段、确认、重传 | 传输层 |
IP 寻址和路由转发 | 网络层 |
| 以太网 / Wi-Fi 帧发送 | 网络接口层 |
| 服务端逐层拆包并交给应用 | 从网络接口层一路向上到应用层 |
| 业务处理并返回响应 | 应用层 |
这里最值得记的一点是:
DNS不替你发业务请求TCP不理解/api/users/1001是什么意思IP不知道状态码是200还是500HTTP也不负责把包跨多跳网络送到目标机器
所以分层真正的价值,就是让每一层只负责自己这段问题。
10. 一张更完整的流程图
mermaid
sequenceDiagram
participant User as 用户
participant Browser as 浏览器
participant DNS as DNS 服务器
participant Server as 服务端应用
User->>Browser: 输入 https://example.com/api/users/1001
Browser->>Browser: 解析 URL 与检查缓存
Browser->>DNS: 查询 example.com 的 IP
DNS-->>Browser: 返回目标 IP
Browser->>Server: TCP 三次握手
Server-->>Browser: TCP 连接建立
Browser->>Server: TLS 握手
Server-->>Browser: TLS 建立完成
Browser->>Server: 发送 HTTP 请求
Note over Browser,Server: 请求会经历分段、封装、IP 路由与链路层传输
Server->>Server: 应用处理业务
Server-->>Browser: 返回 HTTP 响应
Note over Server,Browser: 响应同样会逐层封装并返回客户端
Browser->>Browser: 解密、解析响应、渲染或更新页面这张图的重点不是把中间每个包都画出来,而是帮助你建立“从用户输入到页面拿到结果”的主线顺序。
11. 为什么有时一个页面请求看起来只发了一次,实际却远不止一次
因为浏览器拿到主 HTML 后,往往还会继续触发很多后续请求,例如:
CSSJavaScript- 图片
- 字体
- 接口请求
也就是说,你看到的“打开一个页面”,底层通常不是一次请求,而是一串相关请求的组合。
这也是为什么网络面板里经常会看到:
- 先拿 HTML
- 再拿静态资源
- 再发接口请求
所以“一个页面加载过程”比“一个 HTTP 请求”通常更复杂。
12. 常见误区
12.1 以为 OSI 七层就是现实网络设备逐层对应
不准确。
它更偏分析模型。
12.2 以为学网络就是背层名
真正重要的是每层解决的问题和边界。
12.3 以为协议名出现在哪一层只是记忆题
不是。
放在哪一层,决定了它到底负责什么、不负责什么。
13. 一句话总结
分层模型这条主线,本质上是在解决 如何把一次网络通信拆成若干职责清晰的层,让应用语义、端到端传输、跨网络转发和底层链路传输分别由不同层来承担。