网络协议基础回顾:OSI七层模型与TCP/IP四层模型、数据包封装与解封装过程

说实话,很多刚入行的朋友觉得协议模型太理论,跟抓包没啥关系。我当年也这么想。

直到有一次,客户说网页打不开,我抓了一堆包,愣是看不出问题在哪。后来老工程师点了一句:“你看看是哪一层断了?” 我才意识到——不懂分层,你连问题出在哪个环节都说不清。

这一章,咱们就把这两个模型和数据的封装解封装过程彻底捋一遍。你想想看,搞懂了这些,抓包时你就能一眼定位问题。

2.1 OSI七层模型:理论上的完美分层

OSI七层模型是国际标准化组织(ISO)在1984年提出的。它把网络通信分成了七层,每一层各司其职。

我个人习惯把这七层分成两组来记:上面三层(应用层、表示层、会话层)是“用户侧”,下面四层(传输层、网络层、数据链路层、物理层)是“网络侧”。

层级 名称 核心职责 常见协议/设备
7 应用层 为用户提供网络服务接口 HTTP、FTP、SMTP、DNS
6 表示层 数据格式转换、加密解密、压缩解压 SSL/TLS、JPEG、ASCII
5 会话层 建立、管理、终止会话连接 NetBIOS、RPC
4 传输层 端到端可靠传输、流量控制、差错校验 TCP、UDP
3 网络层 逻辑寻址、路由选择、分组转发 IP、ICMP、ARP、路由器
2 数据链路层 帧封装、物理寻址(MAC)、差错检测 以太网、PPP、交换机
1 物理层 比特流传输、电气特性、机械特性 网线、光纤、集线器、中继器

抓包排错要点: 抓包工具(如Wireshark)主要工作在2-7层。物理层的问题(比如网线断了)你抓包是看不到的,得靠硬件排查。

2.2 TCP/IP四层模型:工业界的实际标准

OSI模型虽然完美,但太复杂了。实际互联网用的是TCP/IP四层模型。它把OSI的上三层合并成了“应用层”,把数据链路层和物理层合并成了“网络接口层”。

说白了,TCP/IP模型更务实。你在工作中遇到的99%的问题,都能用这个模型来解释。

TCP/IP四层模型 对应OSI层级 核心协议 数据单元名称
应用层 5、6、7 HTTP、HTTPS、FTP、DNS、SSH 消息(Message)
传输层 4 TCP、UDP 段(Segment)/ 数据报(Datagram)
网络层 3 IP、ICMP、ARP 包(Packet)
网络接口层 1、2 以太网、PPP 帧(Frame)

我的经验: 面试时经常有人被问“OSI和TCP/IP的区别”。我一般这么答:OSI是教科书,TCP/IP是实战手册。OSI定义了“应该怎么做”,TCP/IP定义了“实际怎么做”。

2.3 数据包封装与解封装:数据在网线里到底长什么样?

这是本章最核心的部分。你抓到的每一个包,都是经过层层封装的结果。

封装的过程,就像寄快递。你写一封信(应用层数据),装进信封写上收件人(传输层加端口号),再套个快递袋写上地址(网络层加IP地址),最后贴上快递单(数据链路层加MAC地址),交给快递员(物理层发送)。

2.3.1 封装过程(发送端)

  1. 应用层: 生成原始数据。比如你访问一个网页,浏览器生成HTTP请求消息。
  2. 传输层: 加上TCP或UDP头部。头部包含源端口和目标端口。数据变成“段”。
  3. 网络层: 加上IP头部。头部包含源IP和目标IP。数据变成“包”。
  4. 数据链路层: 加上MAC头部和尾部。头部包含源MAC和目标MAC,尾部是FCS校验。数据变成“帧”。
  5. 物理层: 把帧转换成比特流,通过网线发送出去。

2.3.2 解封装过程(接收端)

接收端是反过来的过程。每一层只处理自己关心的头部信息,然后把剩下的数据交给上一层。

  1. 物理层: 收到比特流,还原成帧,交给数据链路层。
  2. 数据链路层: 检查MAC地址是否匹配,校验FCS。没问题就去掉MAC头部和尾部,把包交给网络层。
  3. 网络层: 检查IP地址是否匹配。去掉IP头部,把段交给传输层。
  4. 传输层: 检查端口号,重组数据。去掉TCP/UDP头部,把消息交给应用层。
  5. 应用层: 浏览器拿到HTTP响应,渲染出网页。

避坑指南: 我曾经遇到一个案例,抓包看到TCP三次握手成功了,但HTTP请求就是发不出去。排查了半天,发现是MTU(最大传输单元)设置有问题,导致IP层分片后,接收端重组失败。所以,封装和解封装过程中,每一层的参数都可能成为瓶颈。

2.4 核心知识体系:一张图看懂分层与封装

下面这张SVG图,把OSI七层、TCP/IP四层、以及数据封装的过程整合在了一起。建议你保存下来,以后抓包时对照着看。

OSI七层 vs TCP/IP四层 与 数据封装过程 OSI 七层模型 7 应用层 HTTP/FTP/DNS 6 表示层 SSL/TLS/JPEG 5 会话层 NetBIOS/RPC 4 传输层 TCP/UDP 3 网络层 IP/ICMP/ARP 2 数据链路层 以太网/MAC 1 物理层 网线/光纤 TCP/IP 四层模型 应用层 HTTP/HTTPS/FTP DNS/SSH/SMTP 数据单元:消息 传输层 数据单元:段 网络层 数据单元:包 网络接口层 数据单元:帧 包含MAC地址 数据封装过程(发送端) 应用层:原始数据(HTTP请求) 传输层:TCP头部 + 数据 → 段 网络层:IP头部 + 段 → 包 数据链路层:MAC头部 + 包 + FCS → 帧 物理层:比特流 → 网线发送 解封装是反过程 接收端从物理层开始 逐层去掉头部,直到应用层

2.5 抓包视角:你看到的每一层长什么样?

打开Wireshark抓一个HTTP包,你会看到类似下面的结构。我习惯从上往下看,先看应用层,再看传输层,最后看网络层和数据链路层。

Frame (帧): 1514 bytes on wire
    Ethernet II (数据链路层)
        Destination: 00:1a:2b:3c:4d:5e (目标MAC)
        Source: 00:5e:4d:3c:2b:1a (源MAC)
        Type: IPv4 (0x0800)
    Internet Protocol Version 4 (网络层)
        0100 .... = Version: 4
        .... 0101 = Header Length: 20 bytes
        Source: 192.168.1.100
        Destination: 203.0.113.50
    Transmission Control Protocol (传输层)
        Source Port: 54321
        Destination Port: 80 (HTTP)
        Sequence Number: 1
        Acknowledgment Number: 1
        Flags: 0x018 (PSH, ACK)
    Hypertext Transfer Protocol (应用层)
        GET /index.html HTTP/1.1\r\n
        Host: www.example.com\r\n
        User-Agent: Mozilla/5.0\r\n

我的习惯: 抓包排错时,我一般先看传输层(TCP/UDP)的端口号和标志位,确认连接是否建立。然后看网络层的IP地址,确认数据包是否到达目标。最后看应用层的内容,确认请求和响应是否正确。这样一层层排查,效率最高。

2.6 为什么抓包排错必须懂分层?

我给你举几个实际场景:

  • 场景一:网页打不开。 抓包看到TCP三次握手成功,但HTTP请求没响应。问题出在应用层(比如Web服务器挂了)。
  • 场景二:视频卡顿。 抓包看到大量TCP重传。问题出在传输层(网络丢包严重)。
  • 场景三:能上QQ但打不开网页。 抓包看到DNS请求没响应。问题出在应用层(DNS解析失败)。
  • 场景四:内网通但外网不通。 抓包看到IP包的目标地址是公网IP,但没看到网关的MAC地址。问题出在网络层(路由配置错误)。

你看,不懂分层,你连问题出在哪个环节都说不清楚。懂了分层,你就能快速定位,精准排错。

总结一句话: 分层模型是网络排错的地图。没有地图,你只能在数据包的海洋里瞎转悠。