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

聊性能优化,绕不开网络模型。很多人觉得这是理论,跟实战没关系。我刚开始做优化时也这么想,直到有一次线上故障,排查了三天,最后发现是数据包在传输过程中被中间设备“撕碎”了重组失败。嗯,从那以后,我老老实实把这两张图刻在了脑子里。

说白了,OSI七层模型和TCP/IP四层模型,就是网络世界的“交通法规”。你写的每一行代码,发的每一个请求,最终都要按这套规则打包上路。不理解它,你连问题出在哪一层都说不清楚。

2.1 OSI七层模型:理想化的“教科书”

OSI(Open System Interconnection)是国际标准化组织搞出来的参考模型。它把网络通信拆成7层,每层只管自己的事。你想想看,这就像一家公司,每个部门各司其职,出了问题直接找对应部门就行。

层级 名称 核心职责 常见协议/设备
7 应用层 为用户提供网络服务接口 HTTP、FTP、SMTP、DNS
6 表示层 数据格式转换、加密、压缩 SSL/TLS、JPEG、ASCII
5 会话层 建立、管理、终止会话 NetBIOS、RPC
4 传输层 端到端可靠传输、流量控制 TCP、UDP
3 网络层 路由寻址、逻辑地址(IP) IP、ICMP、路由器
2 数据链路层 帧封装、物理地址(MAC)、差错检测 以太网、交换机、PPP
1 物理层 比特流传输、电气信号 网线、光纤、集线器
我的习惯:排查网络问题时,我习惯从第7层往下查。先看应用层日志,再看传输层连接状态,最后才去抓包看链路层。这样效率最高,不会在无关层上浪费时间。

2.2 TCP/IP四层模型:实战中的“精简版”

OSI模型太理想了,实际互联网用的是TCP/IP四层模型。它把OSI的上三层合并成应用层,下两层合并成网络接口层。我个人觉得,TCP/IP才是你真正需要背下来的东西。

TCP/IP层 对应OSI层 核心协议 数据单元名称
应用层 5、6、7 HTTP、DNS、TLS 消息(Message)
传输层 4 TCP、UDP 段(Segment)
网络层 3 IP、ICMP 包(Packet)
网络接口层 1、2 以太网、ARP 帧(Frame)
关键区别:OSI是“教你怎么做”,TCP/IP是“实际怎么做”。做性能优化,你盯着TCP/IP就够了。OSI模型更适合用来做理论分析和教学。

2.3 数据包封装过程:从“数据”到“比特流”

你发一个HTTP请求,数据是怎么从你的浏览器跑到服务器的?这个过程就是封装。每一层都会给上层的数据“穿衣服”——加上自己的头部信息。

我举个例子。你在浏览器里输入一个网址,敲回车。这一刻,数据包封装就开始了。

  1. 应用层:浏览器构造HTTP请求报文。比如 GET /index.html HTTP/1.1。这时的数据叫“消息”。
  2. 传输层:TCP协议把HTTP报文切成段,加上TCP头部(源端口、目的端口、序列号等)。这叫“段”。
  3. 网络层:IP协议给TCP段加上IP头部(源IP、目的IP)。这叫“包”。
  4. 网络接口层:以太网协议给IP包加上帧头部(源MAC、目的MAC)和帧尾部(FCS校验)。这叫“帧”。
  5. 物理层:帧被转换成比特流,通过网线发出去。
我曾经踩过的坑:有一次做TCP优化,我改了内核参数,结果吞吐量反而下降了。排查了半天,发现是MTU(最大传输单元)设置不对。数据包在IP层被分片,到了接收端重组失败,导致大量重传。记住:封装过程中,每一层都有大小限制。MTU是1500字节,TCP的MSS(最大段大小)就是1460字节(1500 - 20字节IP头 - 20字节TCP头)。改参数前,先算清楚这些值。

2.4 数据包解封装过程:从“比特流”回到“数据”

数据到了接收端,过程反过来。每一层剥掉自己那层的头部,把剩下的交给上一层。这叫解封装。

  1. 物理层:收到比特流,交给数据链路层。
  2. 网络接口层:检查帧头部的MAC地址,确认是给自己的。剥掉帧头和帧尾,把IP包交给网络层。
  3. 网络层:检查IP头部,确认目标IP是自己。剥掉IP头,把TCP段交给传输层。
  4. 传输层:检查TCP头部,确认端口号。剥掉TCP头,把HTTP报文交给应用层。
  5. 应用层:浏览器解析HTTP报文,渲染页面。

你想想看,这个过程就像俄罗斯套娃。发送端一层层套上去,接收端一层层拆下来。每一层只关心自己该做的事,不越界。

2.5 核心知识图谱

下面这张图,是我自己总结的。它把封装和解封装的过程画在了一起,方便你对照着看。

数据封装与解封装过程 发送端(封装) 应用层:HTTP 消息 传输层:TCP 段 网络层:IP 包 网络接口层:以太网帧 物理层:比特流 传输介质 (网线/光纤/无线) 接收端(解封装) 物理层:比特流 网络接口层:以太网帧 网络层:IP 包 传输层:TCP 段 应用层:HTTP 消息 说明: 1. 发送端:数据从应用层向下传递,每层添加头部(封装)。 2. 接收端:数据从物理层向上传递,每层剥掉头部(解封装)。 3. 每一层只处理自己层级的头部信息,不关心上层数据内容。 4. 性能优化关注点:传输层(TCP参数)、网络层(路由、MTU)、链路层(带宽、延迟)。

2.6 性能优化视角:每一层都是机会

理解了封装和解封装,你就知道性能优化该从哪里下手了。我个人习惯,按层来排查问题:

  • 应用层:减少HTTP请求次数、启用压缩、使用连接池。这是收益最高的优化点。
  • 传输层:调整TCP窗口大小、启用快速重传、优化拥塞控制算法。我遇到过很多应用,改一下TCP参数,吞吐量直接翻倍。
  • 网络层:优化路由路径、避免IP分片。MTU设置不合理,会导致大量重传,性能急剧下降。
  • 网络接口层:检查交换机端口协商、网卡驱动、中断亲和性。这些底层问题,往往被上层开发忽略。
避坑指南:我曾经接手过一个项目,应用层优化做得很极致,但网络延迟还是高。最后发现是网卡的中断被分配到了同一个CPU核心上,导致软中断处理不过来。调整了irqbalance后,延迟降了40%。记住:性能优化是全局的,别只盯着应用层。

嗯,这一章的内容就到这里。模型和过程是基础,但基础不牢,后面优化无从谈起。你先把封装和解封装的流程刻在脑子里,后面我们聊具体优化手段时,你就能快速定位问题出在哪一层了。