2、网络通信基础:OSI七层模型与TCP/IP四层模型详解
聊网络通信,绕不开这两个模型。
OSI七层模型和TCP/IP四层模型,说白了就是两套「通信协议栈」的框架。我刚开始做分布式系统时,总觉得背这些层没什么用。直到有一次排查一个跨机房的数据同步延迟问题,才发现——不懂分层,你连问题出在哪一层都说不清楚。
2.1 OSI七层模型:理想化的通信蓝图
OSI(Open System Interconnection)模型是国际标准化组织定义的。它把网络通信拆成了七层,每一层只管自己的事。
| 层级 | 名称 | 核心职责 | 典型协议/设备 |
|---|---|---|---|
| 7 | 应用层 | 为用户应用提供网络服务 | HTTP、FTP、SMTP |
| 6 | 表示层 | 数据格式转换、加密、压缩 | SSL/TLS、JPEG |
| 5 | 会话层 | 建立、管理、终止会话 | NetBIOS、RPC |
| 4 | 传输层 | 端到端可靠传输 | TCP、UDP |
| 3 | 网络层 | 路由选择、逻辑寻址 | IP、ICMP、路由器 |
| 2 | 数据链路层 | 帧封装、MAC寻址、差错检测 | 以太网、交换机 |
| 1 | 物理层 | 比特流传输、电气信号 | 网线、光纤、集线器 |
你想想看,这七层其实很像一个公司的组织架构。应用层是前台,物理层是快递小哥。每一层只跟上下层打交道,不越级。
我的经验:在实际工程中,很少有人真的按七层去实现。但排查问题时,七层模型是个极好的「思维框架」。比如延迟高了,我会先问:是物理层的光纤断了?还是网络层的路由跳数太多?还是传输层的TCP重传?一层一层剥,问题就清晰了。
2.2 TCP/IP四层模型:互联网的事实标准
OSI太理想化了。互联网真正用的是TCP/IP四层模型。它把七层合并成了四层:应用层、传输层、网络层、网络接口层。
说白了,TCP/IP就是「精简版」的OSI。它去掉了表示层和会话层,把数据链路层和物理层合并了。为什么?因为互联网发展太快,没时间搞那么精细的分层。
| TCP/IP层 | 对应OSI层 | 核心协议 |
|---|---|---|
| 应用层 | 5/6/7 | HTTP、DNS、SSH |
| 传输层 | 4 | TCP、UDP |
| 网络层 | 3 | IP、ICMP |
| 网络接口层 | 1/2 | 以太网、Wi-Fi |
一个小技巧:面试时如果被问到这两个模型的区别,你就说「OSI是教科书,TCP/IP是实战手册」。我个人习惯用TCP/IP模型做设计,用OSI模型做排查。
数据封装与解封装过程
数据在网络上传输,不是直接扔出去的。每一层都会给数据「穿衣服」——这就是封装。
2.3 封装过程:从应用层到物理层
假设你要发一个HTTP请求。数据从浏览器出发,一路往下走:
- 应用层:生成HTTP报文(请求行+头部+正文)
- 传输层:加上TCP头部(源端口、目的端口、序列号),变成TCP段
- 网络层:加上IP头部(源IP、目的IP),变成IP包
- 数据链路层:加上MAC头部和尾部(源MAC、目的MAC、FCS校验),变成帧
- 物理层:把帧转成比特流,通过网线发出去
每一层加的东西,叫「协议头」。接收方收到后,一层一层脱掉这些头——这就是解封装。
核心概念:封装就是「加头」,解封装就是「脱头」。每一层只关心自己那层的信息。比如网络层只看IP头,不看TCP头里的端口号。
2.4 解封装过程:从物理层到应用层
接收方拿到比特流后,反向操作:
- 物理层:把比特流还原成帧
- 数据链路层:检查MAC地址和FCS校验,去掉MAC头,交给网络层
- 网络层:检查IP地址,去掉IP头,交给传输层
- 传输层:检查端口号,去掉TCP头,交给应用层
- 应用层:拿到原始的HTTP报文,交给浏览器渲染
整个过程就像俄罗斯套娃。我曾经在调试一个RPC框架时,发现数据总是少几个字节。排查了半天,原来是传输层加了TCP头之后,应用层又自己加了一层自定义头——两层封装冲突了。嗯,这里要注意:自定义协议时,一定要搞清楚封装层次。
网络通信中的关键指标
做分布式系统,这三个指标你必须烂熟于心:延迟、吞吐量、带宽。
2.5 延迟(Latency)
延迟就是数据从A点到B点花的时间。单位通常是毫秒(ms)。
延迟由四部分组成:
- 处理延迟:路由器、交换机处理数据包的时间
- 排队延迟:数据包在队列里等待转发的时间
- 传输延迟:把数据包推送到链路上的时间(= 包大小 / 带宽)
- 传播延迟:信号在介质中传播的时间(= 距离 / 光速)
避坑指南:我曾经以为带宽越大延迟越小。其实不对。带宽影响的是传输延迟,但传播延迟只跟距离有关。北京到上海的光纤,不管带宽是1G还是100G,光速传播时间都是大约10ms。所以跨机房部署时,物理距离才是延迟的硬约束。
2.6 吞吐量(Throughput)
吞吐量是单位时间内成功传输的数据量。单位是bps(比特每秒)或Bps(字节每秒)。
吞吐量 ≠ 带宽。带宽是理论最大值,吞吐量是实际值。影响吞吐量的因素很多:
- TCP窗口大小
- 丢包率
- CPU处理能力
- 应用层协议效率
举个例子:你的网卡是1Gbps(带宽),但实际下载速度只有50MB/s(吞吐量)。为什么?因为TCP的拥塞控制、协议开销、磁盘IO都在拖后腿。
2.7 带宽(Bandwidth)
带宽是信道能传输的最大数据速率。它是个「上限」概念。
带宽和延迟的关系,有个著名的公式:
带宽延迟积(BDP)= 带宽 × 延迟
BDP表示「在一条链路上最多能有多少数据在飞行」。这个值决定了TCP窗口应该设多大。
实战经验:我在调优一个跨洋数据传输系统时,发现吞吐量上不去。算了一下BDP:带宽100Mbps,延迟200ms,BDP = 100Mbps × 0.2s = 20Mb = 2.5MB。这意味着TCP窗口至少要2.5MB才能填满管道。默认的TCP窗口只有64KB,差了40倍。调大窗口后,吞吐量直接翻了3倍。
2.8 三个指标的关系
| 指标 | 定义 | 典型值 | 优化方向 |
|---|---|---|---|
| 延迟 | 单次传输时间 | 1-100ms | 减少跳数、使用CDN |
| 吞吐量 | 单位时间传输量 | 10Mbps-10Gbps | 增大窗口、减少丢包 |
| 带宽 | 理论最大速率 | 100Mbps-400Gbps | 升级硬件、链路聚合 |
说白了,带宽是路有多宽,延迟是路有多长,吞吐量是实际能跑多快。做分布式系统时,这三个指标要一起看。只看带宽不看延迟,跨机房部署会踩坑;只看延迟不看吞吐量,高并发场景会出问题。
总结一下:OSI七层模型是理论框架,TCP/IP四层模型是实战标准。数据封装和解封装是每一层加头脱头的过程。延迟、吞吐量、带宽是衡量网络性能的三个核心指标。搞懂了这些,你就能看懂网络通信的底层逻辑了。
下一章,我们会深入传输层,聊聊TCP和UDP的那些事。特别是TCP的三次握手和四次挥手——面试必考,实战必用。