目录
网络传输基本流程
引入
封装
过程梳理
图解
报文
解包
过程梳理
图解 -- 同层直接通信的证明
总结
解包时的报头分离问题
举例 -- 倒水
介绍
自底向上传输时的协议定位问题
介绍
解决方法
协议多路复用
介绍
优势
网络传输基本流程
引入
首先,我们明确一个前提,协议如何被体现,就是通过在数据前添加报头实现的 -- 协议的概念+本质+作用+最终表现形式,网络问题(技术+应用+解决的协议+存在原因),主机的对称性-CSDN博客
所以,每经过一层协议,就会添加一段报头
封装
过程梳理
我们根据信息传输的顺序自顶向下看
首先是应用层
- 因为我们一般都是使用某种软件来进行通信,而软件一般都会进行更新,但版本更新不是强制的,所以会存在新/老版本都要向服务器请求数据的情况
- 那么为了不乱套(新老版本的提供的功能不同,两者是有差异的),就肯定会为它加上一个版本字段,确保不同版本的软件能够正确地解析和处理收到的数据
- 而这个字段,正是在应用层的协议中
- 所以数据到了应用层后,会添加应用层协议的报头
- 该报头内就会有版本信息
然后来到传输层,该层用来保证可靠性
- 这个可靠性不仅仅保证数据成功运输,也包括信息的发送顺序等等(因为顺序乱了,意思就完全不一样了)
- 比如:
- 所以,协议会定义一个序号,用于为信息排序
- 当数据来到传输层,依然会添加该层协议的报头
- 报头内包含一系列字段,其中就有序号
同理,当数据来到网络层时(他解决主机定位问题)
- 数据中依然会继续添加该层协议的报头
- 报头内包括了自己的身份,目标主机是哪个等信息
链路层也是一样的
图解
- 每层新添加的报头都在最外侧
- 到达每层的数据(也叫做报文)都不一样
报文
指在网络中传输的数据单元,报文=报头+有效载荷
- 注意,这个报头仅仅是当前层协议的报头,剩下的数据就是有效载荷
- 有效载荷每经历一层,就会增加字段,增加的恰好是上一层添加的报头:
完成了这四层后,也就完成了封装的过程(将数据一层一层用报头包裹在里面)
解包
过程梳理
当我们将报文发送给对方主机后,对方主机就开始自底向上传输
- 恰好,报头可以被一层一层地解析
- 从图中可以看到,我们最外层的协议报头,恰好和[在对方主机中遇到的第一层协议]对应上了
- 又因为,这段报文在链路层就已经是二进制序列了,所以指针可以指向这块内存
- 不仅如此,我们还可以通过指针的强制类型转换,精准地指向该层的协议报头
- 剩下的部分,就是有效载荷,而有效载荷的开头,就是上一层的协议报头
- 之后将有效载荷交给自己的上一层
- 因为各层协议都是匹配的,重复上述过程,就可以准确地解码出每层对应的报头(之前一层一层包起来,现在再一层一层解开)
图解 -- 同层直接通信的证明
注意看,同层之间,发送的和收到的是同样的报文
这不就相当于同层之间在进行直接通信吗?
所以,也就证明了 -- 在逻辑上,每层之间根据约定在进行通信
和封装对应的,以上过程就被叫做解包
总结
所以,通信的过程就是不断进行封装和解包
解包时的报头分离问题
举例 -- 倒水
如果我们要把多次倒入的水,再分离出来,这是很难的事情
但如果我们将每次倒入的水都用容器装起来,再将容器扔进去,再想分离就很简单了
介绍
而在网络通信中的封装和分离过程也是同理
- 在封装的时候,就应该考虑之后该如何分离
比如:
- 协议里就规定好报头的大小 / 记录当前报头大小和报文大小
自底向上传输时的协议定位问题
介绍
- 我们经过协议封装后,得到的报头是特定协议的(具体选择哪个协议我们不用管)
- 但是将报文发送给对方主机后,下一层如何知道交给上一层的哪个协议呢
- 毕竟每一层的协议有很多,但我们必须交给封装数据的那个协议(必须要一一对应才能进行通信)
解决方法
所以,协议里还需要记录当前协议是谁
- 也就是在报头里增加一个标识字段,该字段指示上层协议的类型
- 从上到下传输时,下一层记录是上一层的哪一个协议交给我的
- 然后从下到上传输时,该层解析自己的报头后,就可以知道自己该交给谁了
而这个协议标识(也就是决定将有效荷载交给上层哪个协议的能力),是实现协议多路复用的关键
协议多路复用
介绍
指在通信过程中,通过使用不同的协议标识来区分和识别多个上层协议的技术
- 确保了在传输中的数据,能够被正确地解析和交付给相应的协议进行处理
优势
- 可以同时支持多种上层协议,使得网络更加灵活和可扩展
- 不同的应用和服务可以使用不同的协议,而这些协议可以在同一通信通道上共存,通过协议标识字段确保数据被正确地路由和处理