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 物理层 比特流传输、电气信号 网线, 光纤, 集线器
我的经验: 面试时经常有人背七层名称,但一问「表示层到底做了什么」就卡壳。我建议你记住一个场景:你访问 HTTPS 网站,浏览器和服务器握手时,表示层就在做证书验证和加密协商。这不是空概念,是实实在在的代码逻辑。

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 数据封装与解封装:数据在网线里到底长什么样?

好,模型讲完了。现在我们来点实在的——数据到底是怎么从你的电脑跑到服务器的?

这个过程叫封装。发送端从应用层开始,一层一层往下走,每经过一层就加一个头部。接收端从物理层开始,一层一层往上走,每经过一层就剥掉一个头部。

封装过程(发送端)

  1. 应用层: 生成原始数据。比如你发了一条 HTTP 请求:GET /index.html HTTP/1.1。
  2. 传输层: 加上 TCP 头部。包含源端口、目标端口、序列号等。数据变成 TCP 段。
  3. 网络层: 加上 IP 头部。包含源 IP、目标 IP。数据变成 IP 包。
  4. 数据链路层: 加上 MAC 头部和尾部。包含源 MAC、目标 MAC、FCS 校验。数据变成以太网帧。
  5. 物理层: 把帧转成比特流,通过网线发出去。

解封装过程(接收端)

  1. 物理层: 收到比特流,组装成帧。
  2. 数据链路层: 检查 MAC 地址是否匹配,校验 FCS。没问题就剥掉帧头帧尾,把 IP 包交给网络层。
  3. 网络层: 检查 IP 地址,剥掉 IP 头部,把 TCP 段交给传输层。
  4. 传输层: 检查端口号,重组数据,剥掉 TCP 头部,把原始数据交给应用层。
  5. 应用层: 浏览器拿到 HTTP 响应,渲染页面。
我曾经踩过的坑: 有一次排查一个丢包问题,我在应用层抓了半天日志,死活找不到原因。后来用 tcpdump 在网卡出口抓包,才发现是 MTU 设置不对,导致 IP 分片被丢弃。你看,如果不懂封装过程,你根本想不到问题出在第三层和第四层之间。

1.4 一张图看懂分层与封装

下面这张 SVG 图,把 OSI 七层、TCP/IP 四层、以及数据封装的关系画在了一起。我建议你把它存下来,以后遇到网络问题,先对着这张图定位问题出在哪一层。

OSI七层与TCP/IP四层模型及数据封装过程 OSI 七层 / TCP/IP 四层 与 数据封装过程 OSI 七层 7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 TCP/IP 四层 应用层 传输层 网络层 网络接口层 数据封装过程(发送端) 应用层数据 (Message) TCP头 + 应用层数据 (Segment) IP头 + TCP头 + 数据 (Packet) MAC头 + IP头 + TCP头 + 应用层数据 + FCS (Frame) 解封装是反向过程:物理层 → 数据链路层 → 网络层 → 传输层 → 应用层,逐层剥头

1.5 为什么你必须理解分层?

我举个例子。你在 Linux 上执行 curl http://example.com,如果返回慢,你会怎么排查?

  • 应用层: curl 本身有没有超时设置?DNS 解析快不快?
  • 传输层: TCP 握手花了多久?有没有重传?用 ss -ti 看。
  • 网络层: 路由可达吗?ping 一下看看丢包率。
  • 数据链路层: MAC 地址有没有冲突?ARP 表对不对?
  • 物理层: 网线松了?光模块坏了?

你看,没有分层思维,你只能瞎猜。有了分层思维,你就能像剥洋葱一样,一层一层定位问题。

我的建议: 学完这章,你可以在 Linux 上做个小实验。用 tcpdump -i eth0 -nn -X port 80 抓一个 HTTP 请求的包,然后对照封装过程,看看每一层的头部长什么样。亲手拆一次包,比背十遍模型都有用。