嵌入式视角看OSI模型
OSI 模型这个话题,虽然在教材和网络上已经被讲了无数次,但大多数讲解都以计算机网络为背景,从 HTTP、TCP 等协议展开说明。
说实话作为既非计算机科班出身,也非网络相关行业从业者的我来说,计算机网络是十分陌生且晦涩的,对初学者不太友好。当初我看完计算机网络书籍之后,仍云里雾里的,还是不太理解分层的真正意义和它跟实际开发有什么关系。
经过几年工作实践,动手写协议、调通信、分析数据包,才逐渐理解每一层的价值,所以今天想尝试抛开传统的网络角度,站在“嵌入式通信协议”的视角,重新解释一下 OSI 模型。
本文内容仅为个人工作实践总结,能力有限,如有谬误,欢迎指正,谢谢。
OSI 模型(Open Systems Interconnection Model,开放式系统互联模型)是一个用于描述网络通信过程的分层模型,共分为了七层,每层有各自的清晰的职责分工,十分便于系统设计和协议开发。
受限于资源,在嵌入式中通常不会完整实现 OSI 七层,但该模型对于通信协议的设计和开发非常有指导意义,在实际项目中会根据系统需求简化为3~5层通信协议结构。
完整的模型分层如下图(图片来自《嵌入式系统:硬件、软件及软硬件协同》,作者Tammy Noergaard):
下层对于上层都是透明的,即在逻辑上两个设备上对应层之间是可以直接交互的。
第1层:物理层
该层提供电气和物理规格
关注内容:
- 通信需要通过几根线相连?
- 工作电压多少?多少电压代表“1”,多少电压代表“0”
- 通信速率是多少?
- 数据支持的传输方向?单工、半双工、双工?
- 设备连接方式?点对点、一主多从、多主多从?
UART示例:
- 需要Vcc、Tx、Rx、GND四根线;
- 电平标准是RS232或者TTL;
- 通信速率不定,设备双方约定好即可,常见的速率有115200bps、9600bps等;
- 支持全双工,即可同时收发数据;
- 设备连接是点对点;
第2层:数据链路层
描述字节如何在物理线缆上传输。
关注内容:
- 在多设备场景中,当前的数据是要发给谁的?
- 数据帧的bit如何定义?帧头、帧尾、校验码?
- 数据帧有无校验?什么校验方式?
- 每帧数据的数据量是多少?
- 数据的传输流向如何规定?
UART示例:
- 由于UART设备点对点连接,第一个问题无需考虑,而在支持多设备的协议中,如SPI使用CS进行片选、IIC使用设备地址进行选择;
- UART数据定义一帧数据有起始位(帧头)+8位数据位+校验位(可选)+停止位(帧尾);
- UART可选使用奇偶校验,不是所有协议都在该层有校验,如SPI;
- UART每帧10~11.5bits;
- UART数据全双工,也无需考虑,如半双工的IIC则是通过ACK来交换数据线的控制权的;
第3层:网络层
该层负责将一个可变长的信息(包)从一端传送到另一端。
关注内容:
- 当前信息是要发给谁的?和上层第一个问题不同的是,这里表述的是软件层面上的地址,而不是物理地址
- 数据帧要如何分包组包?
软件地址用来指向设备中的抽象主体,这在嵌入式中比较少见,一般就一个主体去处理通信信息。举个比较相似的例子,一般使用IIC去读写外部寄存器时:起始->从设备地址(读/写)->寄存器地址->ACK/NACK;其中的寄存器地址就如同软件地址;
UART一帧数据有效位只有8位,显然不能满足大部分应用需求,所以需要接收/发送多帧,最后将多帧数据组合成完整的数据包。这个时候就需要规定哪些帧是属于同一包的:
- 定长,规定固定8帧或者16帧为一包?
- 超时,规定多久没有数据流那前面的数据为一包?
- 魔数,特定包头包尾来进行划分?
AT指令示例:AT+ID?
一帧数据发送一个ASCII码,该指令可以分解为 "A" "T" "+" "I" "D" "?" "\r" "\n"共8帧
"AT"可作包头,"\r\n"可作包尾。
第4层:传输层
该层提供可靠的机制来传输数据。
关注内容:
- 整包数据是否完整准确?
- 丢包、错包是否重传?
基于传输效率考虑,数据链路层不会提供过于复杂的校验,甚至是无校验。那为了保证整包数据的准确性,增加校验是必要的,常见的校验方式有CheckSum校验、CRC校验;
那校验后发现个别数据帧错漏要请求重传呢?比如,如果有包序信息,那就可以单独请求该包序号的数据重新发送。
第5层:会话层
负责建立、管理和终止会话。
关注内容:
- 会话的交互流程?如请求—应答—结束三步走流程
我觉得可以把会话换成交互来理解,一次会话就是两个设备之间一次完整的通信交互。
如AT指令交互:
主设备发送: AT+BATTERY_VOLT?
从设备回复: +BATTERY_VOLT: 3750,40
从设备确认结束: OK
以上就是一次会话,从AT+CMD?开始建立会话,到+CMD:value进行会话交互,最后到OK终止会话。
第6层:表示层
该层定义数据结构,可能还会有压缩和加密。
关注内容:
- 定义数据结构,转换 row data 成结构体
- 可能包含加密、压缩等(高级应用)
以上面的AT指令为例:
接收到的row_data[LEN] = {0xA6,0x0E,0x28};
数据定义结构定义struct {uint16_t volt;uint8_t percent};
经过表示层处理后即可输出volt = 3750;percent = 40;
第7层:应用层
该层接受用户交互并形成一个通信请求。
关注内容:
- 提供接口供业务模块调用,发起通信请求
- 屏蔽底层通信细节
即提供一个调用接口给其他模块,用来发起通信。
如:send_cmd_to_slave(uint8_t cmd,uint8_t *param);
那当其他模块,如按键模块,识别到Key1被按下时就查询从设备电量,可以调用send_cmd_to_slave(CMD_REQUEST_BAT_PERCENT, NULL);发起通信查询。
这样,其它模块就不需要关心底层用的什么协议,什么接口,内部具体什么交互逻辑。
嵌入式常用通信结构
在资源极其有限的mcu中,一般会简化到3层:
- 物理层:收发数据,例如 UART/SPI/I2C 驱动;
- 数据链路层:处理帧结构,分帧/组帧,处理包校验;
- 应用层:处理数据业务逻辑,如 AT 指令解析;
当项目稍微复杂后,推荐使用 5 层:
- 物理层:收发数据,例如 UART/SPI/I2C 驱动;
- 链路层:处理帧结构,分帧/组帧,处理包校验;
- 网络层:软件地址识别,拆包组包;
- 表示层:结构化数据,映射为具体含义的变量;
- 应用层:负责通信业务逻辑,如命令处理、回复响应。
小结
OSI 模型虽然来源于计算机网络,但其“分层设计”的理念在嵌入式通信中同样适用。
其实对于嵌入式开发者来说,学习OSI 模型最重要的并不是去死记硬背每一层的具体定义,而是要理解“为什么要分层”、“每层解决什么问题”。清晰的职责划分才能带来更好的可维护性、可扩展性。
嵌入式视角看OSI模型的更多相关文章
- python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)
先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...
- OSI模型详解
OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 . 完成中继功能的节点通常称为中继系统.在OSI七层模型中,处于 ...
- 8.2 OSI模型
OSI模型它是为了使不同的网络厂商.硬件厂商它们的系统能够良好的进行兼容,进行互连而提出来的,是由ISO(国际标准化组织在1979年公布的),它是现在的计算机网络领域的金科玉律.大家都认可的一个标准, ...
- 计算机网络OSI模型
一. 理想模型-OSI 7层模型 那么数据是如何传输的呢?看下图:上层的Header+DATA作为新的Data再次被封装,到达目的地后就像剥洋葱一样掐头(去尾)最终留下你所要传的数据. 各层功能详细阐 ...
- Mybatis系列全解(七):全息视角看Dao层两种实现方式之传统方式与代理方式
封面:洛小汐 作者:潘潘 一直以来 他们都说为了生活 便追求所谓成功 顶级薪水.名牌包包 还有学区房 · 不过 总有人丢了生活 仍一无所获 · 我比较随遇而安 有些事懒得明白 平日里问心无愧 感兴趣的 ...
- 计算机网络基础(1): 拓扑结构/ OSI模型/ TCP/IP模型
来自mooc <计算机网络基础及应用>南京理工大学. <计算机网络技术>宁波城市职业技术学院.来自网易云课堂<计算机网络工程基础>高骞. chapter1 导论 计 ...
- CANopen学习——OSI模型复习
CanOpen协议实现了物理层和数据链路层,OSI模型是完整的7层. OSI模型网络七层包括物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 物理层:提供信息传输的物理连接通道,包括使用的 ...
- OSI模型七层模型结构
OSI模型,即开放式通信系统互联参考模型(Open System Interconnection,OSI/RM,Open Systems Interconnection Reference Model ...
- 网络基础---OSI 模型与TCP/IP
一.网络的演进: 1.简单的联接:1960's ------------ 1970's Host Network 六十至七十年代,网络的概念主要是主机架构的低速串行联接,提供应用程序执行.远程打 ...
- 网络七层OSI模型简介
0. 网络七层OSI模型(Open System Interconnection)总览: 1. 应用层 2. 表示层 :表示层的作用是使通信的应用程序能够解释交换数据的含义.这些服务包括数据压缩 ...
随机推荐
- Educational Codeforces Round 180 (Rated for Div. 2) C. Coloring Game
C – Coloring Game 思路:不难看出,当 Alice 选完三个数 a b c(其中 a ≤ b ≤ c)后,Bob 能选的只有两种情况: 选择 c,这样只用比较 a+b 和 c 的大小关 ...
- 让 AI 帮我部署网站,太方便了!
大家好,我是程序员鱼皮,今天分享一个用 AI 提升效率的神技巧~ 以前,我们开发一个网站,需要先提出需求.再设计方案.再写代码开发.最后部署上线.我们都知道 AI 现在写代码越来越溜了,慢慢地替代了我 ...
- 解决EasyExcel读取日期为1905年
问题 用EasyExcel导入Excel的时候读取日期出现问题,部分日期读取变成1905年 Excel中的日期格式比较特别,是yyyy.MM格式的,和数字类型的小数非常相似 和Excel中的日期对不上 ...
- SciTech-BigDataAIML-Boltzmann constant波尔兹曼常数 + Boltzmann Machine波尔兹曼机模型
SciTech-BigDataAIML- Boltzmann constant
- Argo CD持续交付工具部署
介绍 Argo CD 是一款适用于 Kubernetes 的声明式 GitOps 持续交付工具. 架构 Argo CD 是作为一个 Kubernetes 控制器来实现的,它能持续监控运行中的应用程序, ...
- win10正式版如何禁止OneDrive开机启动的问题
有一位深度官网的小伙伴,在使用win10系统时发现,自带的OneDrive开机就自启动,又无法在设置取消这个开机启动项.该如何解决呢?本文中,深度技术小编就来为大家带来详细的禁止方法,可以看看参考一下 ...
- 2022年12月最新出炉的实时区县乡镇街道geojson数据Echarts地图数据乡村联动数据下载
发现个可以免费下载全国 geojson 数据的网站,推荐一下.支持全国.省级.市级.区/县级.街道/乡镇级以及乡村六级的联动数据 geojson 数据下载地址:https://geojson.hxkj ...
- Unity3D 中的简单 Steam 创意工坊实现
添加 Steamworks 软件包 转到 https://github.com/rlabrecque/Steamworks.NET/releases 并下载最新版本,确保下载 .unitypackag ...
- (译) 理解 Elixir 中的宏 Macro, 第五部分:组装 AST
Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir ...
- (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
Elixir Macros 系列文章译文 [1] (译) Understanding Elixir Macros, Part 1 Basics [2] (译) Understanding Elixir ...