1. 网络基础与OSI模型
各位同学,咱们今天聊聊网络基础。说实话,我见过太多嵌入式工程师,写驱动一把好手,一碰到网络协议栈就头大。其实没那么可怕,关键是把地基打牢。
网络是什么?说白了,就是让两台设备能互相说话。你想想看,一个传感器要把数据传给服务器,中间要经过多少环节?这就是我们今天要拆解的东西。
1.1 计算机网络的本质
计算机网络,就是把分散的计算机通过通信设备和线路连起来,实现资源共享和数据传输。嗯,这个定义很官方。我更喜欢这么说:网络就是让设备之间能「听懂」对方的话。
我在项目中遇到过一件事:两个设备明明物理上连好了,就是通不了。查了半天,原来是数据格式不匹配。一个用大端,一个用小端。你看,这就是网络协议要解决的问题——大家得约定好怎么说话。
核心要点:网络协议就是通信的「交通规则」。没有规则,数据就会乱成一锅粥。
1.2 OSI七层模型详解
OSI模型,国际标准化组织搞出来的。七层,从下往上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
记不住?我有个口诀:「物链网传会表应」。你品,你细品。
| 层级 | 名称 | 核心功能 | 常见协议/设备 |
|---|---|---|---|
| 第7层 | 应用层 | 用户直接交互的接口 | HTTP、FTP、SMTP |
| 第6层 | 表示层 | 数据格式转换、加密解密 | SSL/TLS、JPEG |
| 第5层 | 会话层 | 建立、管理、终止会话 | NetBIOS、RPC |
| 第4层 | 传输层 | 端到端可靠传输 | TCP、UDP |
| 第3层 | 网络层 | 路由选择、逻辑寻址 | IP、ICMP、ARP |
| 第2层 | 数据链路层 | 帧封装、MAC寻址、差错检测 | 以太网、PPP、交换机 |
| 第1层 | 物理层 | 比特流传输、电气特性 | 网线、光纤、集线器 |
每一层都有它的职责。我习惯把OSI模型想象成一个快递公司:
- 物理层:就是快递员和货车,负责把包裹运过去
- 数据链路层:分拣中心,检查包裹有没有破损
- 网络层:调度中心,决定走哪条路最快
- 传输层:客服,确保包裹完整到达
- 会话层:跟客户确认「你还在吗?」
- 表示层:翻译,把中文说明书转成英文
- 应用层:你下单的APP
我的经验:做嵌入式开发,重点掌握1-4层就够了。应用层协议看项目需求。会话层和表示层,说实话,大部分场景下TCP/IP协议栈已经帮你搞定了。
1.3 TCP/IP四层模型对比
OSI模型很完美,但太理想化了。实际互联网用的是TCP/IP模型,只有四层:
- 网络接口层:对应OSI的物理层+数据链路层
- 网络层:对应OSI的网络层
- 传输层:对应OSI的传输层
- 应用层:对应OSI的会话层+表示层+应用层
你看,TCP/IP把上面三层合并了,下面两层也合并了。为什么?因为实际用起来,会话层和表示层的功能往往被应用层自己实现了。比如HTTP协议里就自带了一些会话管理功能。
我曾经在做一个物联网项目时,用TCP/IP协议栈对接一个老设备。那个设备只支持OSI模型,结果两边对不上。最后我在应用层加了个适配层,才把问题搞定。嗯,这就是理论和实践的差距。
| OSI七层模型 | TCP/IP四层模型 | 典型协议 |
|---|---|---|
| 应用层、表示层、会话层 | 应用层 | HTTP、FTP、DNS、MQTT |
| 传输层 | 传输层 | TCP、UDP |
| 网络层 | 网络层 | IP、ICMP |
| 数据链路层、物理层 | 网络接口层 | 以太网、Wi-Fi、PPP |
避坑指南:我曾经在面试嵌入式工程师时,发现很多人把OSI和TCP/IP搞混。记住:OSI是理论模型,TCP/IP是实际实现。面试官问「数据链路层」,你答以太网帧结构,没问题。但如果你说「OSI的数据链路层对应TCP/IP的网络接口层」,那就更专业了。
1.4 数据封装与解封装过程
这是整个网络通信的核心。数据从应用层往下走,每经过一层,就加一个头部。这叫封装。到了接收端,从下往上走,每层剥掉一个头部,这叫解封装。
我画个图给你看:
发送端:
应用层数据: [HTTP请求体]
传输层: [TCP头部][HTTP请求体]
网络层: [IP头部][TCP头部][HTTP请求体]
数据链路层: [以太网头部][IP头部][TCP头部][HTTP请求体][FCS校验]
接收端:
数据链路层: 剥掉以太网头部,检查FCS
网络层: 剥掉IP头部,检查目标IP
传输层: 剥掉TCP头部,检查端口号
应用层: 拿到HTTP请求体
为什么会这样?因为每一层只关心自己的事。数据链路层不管你是HTTP还是FTP,它只管把帧从A传到B。网络层不管你是TCP还是UDP,它只管把包路由到目的地。
我刚开始学的时候,总觉得这样效率太低。加这么多头部,不浪费带宽吗?后来做项目才明白,这种分层设计最大的好处是解耦。你想换传输层协议?把TCP换成UDP,上层应用代码几乎不用改。你想换物理层?从以太网换成Wi-Fi,上层协议栈完全不受影响。
关键理解:每一层都只跟对等层通信。发送端的传输层跟接收端的传输层「对话」,中间的网络层只是帮忙传数据。这就是「对等通信」的概念。
举个例子。你在浏览器输入一个网址:
- 应用层(HTTP):构造一个GET请求
- 传输层(TCP):把请求分成数据段,加上端口号
- 网络层(IP):加上源IP和目标IP
- 数据链路层(以太网):加上MAC地址,计算校验和
- 物理层:变成电信号发出去
接收端反过来,一层层剥开,最后拿到HTTP请求,返回网页内容。
我记得有一次调试一个网络问题,数据就是发不出去。用Wireshark抓包一看,以太网帧的FCS校验一直报错。查了半天,是物理层的电平有问题。你看,问题出在最底层,但表现是应用层连不上。这就是为什么要理解整个协议栈——问题可能出现在任何一层。
实用建议:做嵌入式网络开发,建议你学会用Wireshark抓包分析。它能帮你看到每一层的数据封装情况。我每次遇到网络问题,第一件事就是抓包。数据不会骗人。
好了,这一章的内容就到这里。网络基础是后面所有章节的基石。你想想看,不理解数据封装,后面学TCP三次握手、IP路由、ARP协议,都会觉得云里雾里。所以,这一章一定要吃透。
下一章,我们聊聊物理层和数据链路层。嗯,就是网线、MAC地址、交换机这些东西。到时候我会分享一个我调试以太网PHY芯片的踩坑经历,保证让你印象深刻。