1. 网络基础概念:OSI七层模型、TCP/IP四层模型、数据封装与解封装过程
说实话,我见过不少刚入行的朋友,一上来就扎进 socket 编程或者 tcpdump 抓包。结果遇到诡异问题,完全不知道从哪下手。为什么?因为网络分层这件事没吃透。
你想想看,数据从你的浏览器发出去,到服务器收到,中间经历了什么?谁负责打包?谁负责寻址?谁保证不丢包?这些问题的答案,全藏在分层模型里。
我个人习惯,不管学什么网络技术,先把这两张图画在脑子里:一张是 OSI 七层,一张是 TCP/IP 四层。今天我们就把它彻底讲清楚。
1.1 OSI 七层模型:理论上的完美蓝图
OSI 是国际标准化组织在 1984 年搞出来的参考模型。它把网络通信拆成 7 层,每一层只管自己的事。
为什么要拆?说白了,就是解耦。每一层只关心上下邻居,不关心其他层怎么实现。这样换硬件、换协议,都不影响整体。
| 层级 | 名称 | 核心职责 | 典型协议/设备 |
|---|---|---|---|
| 7 | 应用层 | 为用户提供网络服务接口 | HTTP, FTP, SMTP, DNS |
| 6 | 表示层 | 数据格式转换、加密、压缩 | SSL/TLS, JPEG, ASCII |
| 5 | 会话层 | 建立、管理、终止会话 | NetBIOS, RPC |
| 4 | 传输层 | 端到端可靠传输、流量控制 | TCP, UDP |
| 3 | 网络层 | 逻辑寻址、路由选择 | IP, ICMP, ARP, 路由器 |
| 2 | 数据链路层 | 帧封装、MAC 寻址、差错检测 | 以太网, PPP, 交换机 |
| 1 | 物理层 | 比特流传输、电气信号 | 网线, 光纤, 集线器 |
1.2 TCP/IP 四层模型:工业界的实战标准
OSI 七层太理想了。实际互联网跑的是 TCP/IP 四层模型,也叫 DoD 模型。它把七层压缩成了四层,去掉了表示层和会话层,把应用层、表示层、会话层合并成一层。
为什么能合并?因为在实际开发中,表示层和会话层的功能通常由应用层协议自己实现。比如 HTTP 协议里就包含了会话管理和数据格式协商。
| TCP/IP 层 | 对应 OSI 层 | 核心协议 | 数据单元名称 |
|---|---|---|---|
| 应用层 | 5/6/7 | HTTP, DNS, SSH, TLS | 消息 (Message) |
| 传输层 | 4 | TCP, UDP | 段 (Segment) / 数据报 (Datagram) |
| 网络层 | 3 | IP, ICMP | 包 (Packet) |
| 网络接口层 | 1/2 | 以太网, WiFi | 帧 (Frame) |
核心区别一句话: OSI 是教科书,TCP/IP 是实战手册。你工作中遇到的 99% 的问题,用 TCP/IP 模型就能分析清楚。
1.3 数据封装与解封装:数据在网线里到底长什么样?
好,模型讲完了。现在我们来点实在的——数据到底是怎么从你的电脑跑到服务器的?
这个过程叫封装。发送端从应用层开始,一层一层往下走,每经过一层就加一个头部。接收端从物理层开始,一层一层往上走,每经过一层就剥掉一个头部。
封装过程(发送端)
- 应用层: 生成原始数据。比如你发了一条 HTTP 请求:
GET /index.html HTTP/1.1。 - 传输层: 加上 TCP 头部。包含源端口、目标端口、序列号等。数据变成 TCP 段。
- 网络层: 加上 IP 头部。包含源 IP、目标 IP。数据变成 IP 包。
- 数据链路层: 加上 MAC 头部和尾部。包含源 MAC、目标 MAC、FCS 校验。数据变成以太网帧。
- 物理层: 把帧转成比特流,通过网线发出去。
解封装过程(接收端)
- 物理层: 收到比特流,组装成帧。
- 数据链路层: 检查 MAC 地址是否匹配,校验 FCS。没问题就剥掉帧头帧尾,把 IP 包交给网络层。
- 网络层: 检查 IP 地址,剥掉 IP 头部,把 TCP 段交给传输层。
- 传输层: 检查端口号,重组数据,剥掉 TCP 头部,把原始数据交给应用层。
- 应用层: 浏览器拿到 HTTP 响应,渲染页面。
1.4 一张图看懂分层与封装
下面这张 SVG 图,把 OSI 七层、TCP/IP 四层、以及数据封装的关系画在了一起。我建议你把它存下来,以后遇到网络问题,先对着这张图定位问题出在哪一层。
1.5 为什么你必须理解分层?
我举个例子。你在 Linux 上执行 curl http://example.com,如果返回慢,你会怎么排查?
- 应用层: curl 本身有没有超时设置?DNS 解析快不快?
- 传输层: TCP 握手花了多久?有没有重传?用
ss -ti看。 - 网络层: 路由可达吗?ping 一下看看丢包率。
- 数据链路层: MAC 地址有没有冲突?ARP 表对不对?
- 物理层: 网线松了?光模块坏了?
你看,没有分层思维,你只能瞎猜。有了分层思维,你就能像剥洋葱一样,一层一层定位问题。
tcpdump -i eth0 -nn -X port 80 抓一个 HTTP 请求的包,然后对照封装过程,看看每一层的头部长什么样。亲手拆一次包,比背十遍模型都有用。