通信协议、计算机七层/四层模型、编解码序列化、外设、MCU知识总结

内容纲要

七层/四层模型


七层/四层模型详见:
https://www.atdevin.com/4265.html
https://www.atdevin.com/5382.html
https://www.atdevin.com/6614.html

TCP/IP协议各层作用

协议层 关键元素 作用
数据链路层 MAC地址 依靠MAC地址,构建同子网主机到主机的数据包传输链路
网络层 IP地址 依靠IP地址,构建源子网到目标子网的数据包传输链路
传输层 端口 依靠端口,构建源进程到目标进程的传输链路
应用层 应用自定义规则 依靠客户端与服务端共同定义的规则完成客户端与服务端的交互

详见:https://blog.csdn.net/weixin_33804582/article/details/85979643

TCP/IP五层对应的数据单元

比四层模型,多算一个物理层)

  • 应用层:传输数据单元PDU
  • 运输层:运输层的报文
  • 网络层:IP数据报(IP分组)
  • 数据链路层:(数据帧)(段加上ip地址称作数据包,数据包加上MAC地址称作数据帧)
  • 物理层:01010101011101101010101

TCP/IP五层发送数据过程

file

TCP/IP接收发送数据过程

file

详见:https://www.atdevin.com/4265.html

计算机信息处理过程

假设被处理的信息是一串文本,并需要从一台设备传输到另外一台设备,并显示。
1.序列化,把文本编码成计算机可处理的二级制
2.各层协议的处理,比如经过http->TCP->IP,经过各层协议处理。
3.可能还有从cpu/mcu的RAM中保存ROM中之类的处理。
4.传输到另外一台计算机
5.各层协议的的反向操作,把各层协议头信息剥离后,形成内容
6.内容解码,机器理解的二进制转化成文本
7.GUI显示(渲染之类的)

不管是哪一层的协议,计算机放到内存(buf)里面的都是0101二进制的东西,因此信息的处理首先是序列化成二进制,然后是他通过Http、TCP、IP等协议,一层一层添加协议头。

信息的显示,都是一层一层通过协议拆解出最后的信息体,然后反序列化出可读的文本。对于高级语言编程,序列化这个过程,对开发者是黑盒,但序列化是真实存在的。

序列化(字符集与字符编码)

定义

什么是序列化,通过Unicode、utf-8、ascii等编码方式,把信息转换成二进制的过程。
file

字符集就是字符的集合,如常见的 ASCII字符集,GB2312字符集,Unicode字符集等。这些不同字符集之间最大的区别是所包含的字符数量的不同。

字符编码则代表字符集的实际编码规则,是用于计算机解析字符的,如 GB2312,GBK,UTF-8 等。字符编码的本质就是如何使用二进制字节来表示字符的问题。

编码表,字符编码将人类的字符编码/转换成计算机能识别的数字,这种转换必须遵循一套固定的标准,该标准无非是人类字符与数字的对应关系,称之为字符编码表。

字符集和编码是一对多的关系,同一字符集可能有多种字符编码,如Unicode字符集就有 UTF-8,UTF-16 等。

常见字符编码简介

  • bit:二进制位。
  • Bytes:字节。
  • ASCII码表:用1Bytes表示一个英文字符,1英文字符=8bit=1Bytes。
  • GBK:用2Bytes表示一个中文字符,1Bytes去表示英文字符。
  • unicode:内存中使用的是unicode编码,unicode把全世界的字符都建立好对应关系,用2Bytes去表示一个字符,比如,0000 0000 0000 0000
  • utf-8:用1Bytes表示英文,用3Bytes表示中文。

字符编码需要记住的概念

  • 内存中固定使用unicode编码,我们唯一可以改变的存储到硬盘时使用的编码
  • 要想保证存取文件不乱码,应该保证文档当初是以什么编码格式存的,就应该以什么编码格式去读取
  • python3解释器默认编码是UTF-8,python2解释器默认编码是ASCII
    x='上' 
    #如果文件头为coding:utf-8,那么"上"被存成utf-8格式的二进制
  • 编码与解码
    unicode——-编码encode——–>gbk
    unicode<——-解码decode——–gbk

ascii编码

美国于上个世纪60年代制定了一套字符编码,英语字符与二进制位之间对应关系,做了统一规定。故此诞生了一直沿用至今的ASCII 码。

ASCII 码表

unicode编码

英语用128个符号编码就足够了,但是用来表示其他语言,128个符号是不够的。此时,unicode编码出现了。

unicode是这样一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码(在0-127位,unicode与ascii表示的字符相同)。

但是unicode编码存在另一个问题,例如:

  • 字符A的unicode码是\u0041,二进制标识为1000001.
  • 中文“一”的unicode码是\u4E00,二进制表示为100111000000000
  • 此时保存A需要一个字节,八位bit,保存“一”需要两个字节,16位bit,如何保存能让计算机知道几位bit代表一个字符?此时,utf-8出现了.

utf-8编码

utf-8编码解决的就是计算机中的字符保存的问题。

上述字符,“A”,“一”,如果都用两个字节表示,浪费资源,如果A用一个字节,“一”用两个字节,计算机无法字节识别(几位byte代表一个字符?)。

utf-8就是定义了一种计算机可以识别的用几位字节表示一个字符的方式。

utf-8定义:
1)对于单字节的符号,且第一位为0,后面7位为 Unicode 码. 因此对于英语字母,UTF-8 编码和 ASCII 码是相同的

2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

举例说明:

对于A来说,一个字节即可表示,那么他的utf-8的编码第一位是0,后7位是65,即01000001,

对于“一”来说,用utf-8编码需要3个字节,那么第一个字节中前三位都是1,第四位0,后天每个字节前两位都是10,可以表示的utf-8位数是1110XXXX 10XXXXXX 10XXXXXX,此时X共有16位,正好是unicode编码需要的位数,用unicode编码填充X即可。

所以,A的utf-8编码仍是65,“一”的utf-8编码是:11100100 10111000 10000000

UTF-8/UTF-16/UTF-32

编码方式 码元 编码后字节数
UTF-8 8位 1-4字节
UTF-16 16位 2字节或者4字节
UTF-32 32位 4字节

详见:
https://blog.csdn.net/weixin_41228949/article/details/122187108
https://blog.csdn.net/jimojianghu/article/details/125403110
http://t.zoukankan.com/kingyanan-p-9126115.html

各种协议属于什么层

链路层 :物理层面的,即驱动
网络层 :TCP协议的X次握手,建立网络连接,这个过程算网络层。
传输层 :IP协议的拆包组包方面的验证,这个过程算传输层。
应用层 :传输信息内容的协议,比如HTTP、MQTT、COAP
HTTP相关的各种协议

物联网方向的各种协议:
物联网方向的各种协议

详见:https://blog.csdn.net/qq_39043923/article/details/90475226
https://blog.csdn.net/feiyanaffection/article/details/124479550

协议栈

NB-Iot网络协议栈

file

详见:https://blog.csdn.net/weixin_43662090/article/details/120515121

HTTP协议栈

file

file

详见:https://www.cnblogs.com/zqfdgzrc/articles/10488101.html

协议涉及的方面

一款协议可能需要考虑的方方面面。

  • 连接(网络)
  • 传输
  • 安全
  • 内容

外设

GPIO,I2C,SPI,UART,USART,USB等通信方式/硬件接口的区别
【整理】嵌入式系统的各种常见外设

MCU

单片机(MCU)最强科普(万字总结,值得收藏)
什么是MCU?MCU基础知识讲解