OSI 与 TCP/IP:分层对照 + 各层典型协议一览
把网络拆成「层」,是为了:定位问题时知道该查哪一层、读文档/抓包时知道当前在看哪一层的协议。本篇只做地图与直觉,具体协议细节放在后续各篇。
1. 为什么要有分层
真实网络里,主机、路由器、交换机各自只做一部分事情。分层把「端到端传数据」拆成多个职责清晰的步骤:上层只依赖下层提供的服务,而不关心下层怎么实现。这样 TCP/IP 能在以太网上跑,换 Wi‑Fi、换光纤,上层应用往往不用改。
下面两套模型说的是同一件事的不同画法:OSI 七层偏教学,TCP/IP 偏工程实现。很多中文教材会再折中成五层(把 OSI 最上面三层合并成「应用层」)。
2. OSI、五层与 TCP/IP 的对应关系
要点只有几句:
- 「应用层」在工程里是个大筐:OSI 的会话、表示、应用,在 TCP/IP 里往往都统称应用层协议。
- TCP/IP 的「网络接口层」:对应 OSI 的数据链路层 + 物理层(比特怎么编码、帧怎么在介质上传),抓包时你看到的「Frame」主要来自这一带)。
- 后文说「第几层」时,若无特别声明,按五层从下到上数:物理 → 数据链路 → 网络 → 传输 → 应用。
3. 各层「协议地图」(认路用)
先建立「这一层大概管什么、常见词有哪些」的印象;与 Wireshark 里包展开顺序(Frame → IP → TCP → HTTP)也能对上号。
| 层级 | 这一层大致管什么 | 常见协议 / 概念(举例) |
|---|---|---|
| 应用层 | 具体应用语义:网页、域名、邮件… | HTTP/HTTPS、DNS、FTP、SMTP、SSH、MQTT… |
| 传输层 | 进程到进程:端口、可靠/不可靠、拥塞 | TCP、UDP;端口(如 80、443) |
| 网络层 | 主机到主机:跨网段寻址与路由 | IPv4/IPv6、ICMP、路由协议(如 OSPF、BGP 等,偏运维) |
| 数据链路层 | 同一链路/二层域内:帧、MAC | 以太网、ARP(常视为紧贴 IP 的辅助)、交换机转发 |
| 物理层 | 比特与介质:电气、光、无线电 | 网线、光纤、Wi‑Fi 射频 |
ARP 常被放在「链路层与网路层之间」来讲:它为「已知 IP、求 MAC」服务,抓包常在以太帧里看到,后文写网路/链路时会再碰。
4. 封装与各层 PDU 叫法
数据从应用往下交时,每一层会给数据加上本层的控制信息(首部,有时还有尾部),像套娃一样,称为封装;对端再逐层剥掉,称为解封装。
各层对自己这一层「一整块数据单元」的习惯称呼(PDU)大致是:
| 层级 | 常见 PDU 称呼 | 备注 |
|---|---|---|
| 传输层 | TCP 段(segment);UDP 数据报(datagram) | 口语里也有人泛称「包」 |
| 网络层 | 分组 / IP 数据报(packet) | 常说「IP 包」 |
| 数据链路层 | 帧(frame) | 以太网帧等 |
| 物理层 | 比特流 | 抓包里有时不单独展开 |
封装有什么用? 让每一层只读自己需要的那点头信息,就能完成本层职责,上层不必知道下层介质是网线还是 Wi‑Fi。 大致包括:在传输层用端口号区分「同一 IP 上不同进程」;在网络层用 IP 地址做跨网段选路;在链路层用 MAC / 帧在一段链路上可靠投递(还可带差错检测等);物理层只管比特如何编码传输。对端按顺序剥封装,每一层去掉自己的首部,把「载荷」交给上一层,直到应用拿到原始数据。这样分工清晰、可替换(例如换物理介质往往不必改 HTTP 语义)。
5. 输入网址到显示网页的完整过程
这是一个将前面所有分层核心概念串联起来的“终极面试题”。当我们不仅在浏览器里敲下 https://www.example.com 并按下回车时,网络世界究竟经历了什么?
-
URL 解析与 DNS 查询(应用层查找)
- 浏览器首先解析 URL 的结构,确定通信协议(HTTPS)与域名(www.example.com)。
- 浏览器需要目标主机的 IP,便依次查询浏览器缓存、操作系统(
hosts文件)、本地 DNS 路由器缓存,若未命中则向 ISP 的 DNS 服务器发起请求,并最终解析出真正要通信的服务器 IP 地址。
-
TCP 建立连接(传输层三次握手)
- 拿到目标 IP 后,操作系统的协议栈准备在双端之间建立可靠的数据通道。
- 客户端(浏览器随机分配端口)向服务端(默认 443 端口)发起 TCP 三次握手(SYN -> SYN+ACK -> ACK)。
- (注:因为是 HTTPS,随着 TCP 链接建成后,立刻会追加进行 TLS/SSL 四次安全握手以协商加密密钥。)
-
封装并发送 HTTP 请求(层层包装出海)
- 浏览器将用户的访问意图组装成纯文本的 HTTP Request 报文(包含 Header 与体)。
- 传输层:将超长的 HTTP 报文切分成多个 TCP 段 (Segment),标上源目的端口号与序号。
- 网络层:将 TCP 段打包成 IP 数据报 (Packet),标上源 IP 与目标 IP。
- 数据链路层:如果目标 IP 不在局域网内,通过查询路由表,利用 ARP 请求得出“默认网关(光猫/路由器接口)”的 MAC 地址,封装包进入以太网帧 (Frame) 中。
- 物理层:网卡将帧转化为光电/无线电波信号,向外发送。
-
路由转发与寻址(网络层的万里长征)
- 数据包离开你的路由器,进入主干网,途径经过一个个骨干路由器与交换机。
- 路由器一层一层拆开数据包,查看网络层里的目标 IP,查询自己的路由表(最长前缀匹配Longest Prefix Match),再重新包装链路层的 MAC 后,将数据包扔向下一跳(Next Hop)。直至抵达百公里外的机房主机。
-
服务器处理并响应(层层解包归原)
- 目标服务器收到光电信号后,一层接着一层去壳拆盒**(解封装)**:核对 MAC -> 剥掉 IP 头 -> 剥掉 TCP 头组装好乱序的分段 -> 将完整的 HTTP Request 数据通过预设端口递交给应用层的 Nginx / Tomcat 进程。
- Web 进程读取完请求并查询数据库后,组装好 HTTP Response(包含 HTML 等资源)按照同样的逻辑原路发回给你的主机。
-
浏览器解析渲染
- 浏览器收到回传的 HTML 页面资源后,开始解析 DOM 树与 CSSOM 树,引擎构建呈现出精美的画面。并进一步发请求拉取相应的图片与 JS 文件。