大家好呀
我是浪前
今天讲解的是网络篇的第二章:UDP协议的封装分用
我们的协议最开始是OSI七层网络协议
这个OSI 七层网络协议 是计算机的大佬写的,但是这个协议一共有七层,太多了太麻烦了,于是我们就把这个七层网络协议就简化为五层了
UDP协议的封装分用全过程
- TCP/IP 五层网络协议
- 网络设备所在分层
- 封装和分用
- 封装的全过程:
- 发送方:
- 1: 发送方A的应用层(应用程序) QQ:
- 2: 发送方A的传输层:
- 3: 发送方A的网络层:
- 4: 发送方A的数据链路层:
- 5: 发送方A的物理层:硬件设备:
- 分用的全过程:
- 1: 接收方B的物理层:
- 2: 接收方B的数据链路层:
- 3: 接收方B的网络层(IP协议)
- 4:接收方B的 传输层(UDP协议)
- 5:接收方B的 应用层 QQ应用程序:
- 交换机A的工作:
TCP/IP 五层网络协议
举一个例子:
我在淘宝店铺买了一个刷子:
商家发货就要去关注我的收件人地址和电话,发件人地址和电话(这个就是传输层要去关注包裹传输的起点和终点)
商家要把这个包裹交给快递公司:
这个TCP/IP协议一共有五层:
应用层:传输的数据在应用程序中如何使用
程序在拿到数据之后,要用数据去干什么,解决什么问题(程序员最关注的一层)**
负责我买到这个刷子是用来干什么的?
刷床?刷沙发?打小孩?
传输层:关注的是通信的起点和终点
负责关注网络数据包的起点和终点(从哪里来到哪里去),是端到端的传输
负责关注通信的起点和终点,关注网路数据包的起点和终点是端到端的传输
网络层:关注的是通信中的路径规划
负责关注起点到终点之间要走哪一条路(路径规划)
确定传输的路线: 上海 - 南京 - 无锡 - 西安
规划出哪一条路径最好?
考虑传输效率?传输成本?传输时间最短?传输过程最方便?
网络层关注的是通信过程中的路径规划,
数据链路层:负责两个相邻的节点之间的传输和通信细节,即数据传输情况 :
上海到南京 是用飞机空运来运输
南京到无锡市用铁路运输
无锡到西安使用大货车进行运输
物理层:网络通信过程中的硬件设备,基础设施
通信过程中的物理运输 公路-铁路-航线
为什么要写四层:
因为不算物理层就是四层,为什么?
因为物理层是纯硬件的
说是五层,但是下面这四层都是在操作系统内核,硬件,驱动程序中已经实现好了(计算机内置了)
我们作为程序员在网络编程过程中能够影响到的也就只有应用层了
应用层对应到应用程序,也就是程序员写的代码软件,需要手动实现
传输层和网络层都是操作系统内核,都是在操作系统的内核中实现的,这两层都是现成的,不需要手动实现
数据链路层和物理层是驱动程序+硬件来实现的
硬件厂商提供了硬件,都会配上一个驱动程序
有了这个驱动程序,系统才可以很好地操作这个硬件
网络设备所在分层
对于一台主机,
它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四 层;
对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;路由器工作在网络层
对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层;交换机工作在数据链路层
对于集线器,它只实现了物理层
上面是一个经典的笔试题。
上述的路由器和交换机指的是经典的路由器和交换机
封装和分用
封装和分用描述了网络通信过程中基本的数据传输流程
封装和分用是网络传输数据过程中,最核心的流程
封装的全过程:
例子如下所示:
A 通过QQ给B发送了一个hello:
这个操作会出现什么流程?
发送方:
1: 发送方A的应用层(应用程序) QQ:
QQ从消息输入框中获取到用户A输入的hello,hello是一个字符串
QQ就要把这个字符串构成一个应用层的数据包
QQ这样的程序内部就设置了一个应用层的协议,应用数据包就是按照这个应用层协议约定的格式来构造的
这个格式就是一个字符串的拼接
这个应用层协议往往都是实现这个程序的人自己定义的,其他人都没有权限修改
但是我们是可以自己约定的:
比如:
我们约定的应用层协议的格式如下:
发送方QQ号;接收方QQ号;发送时间;消息正文
12344;34556;2024-1-1 12:00:00;hello
上述就构成了一个简单的应用层数据包
应用程序就会调用系统提供的API把这个应用层数据包交给传输层
2: 发送方A的传输层:
会把上述的应用层数据包作为一个整体再构造成为一个传输层的数据包
这个传输层涉及到的协议最重要的就是这个TCP和UDP协议:
此处我们假定是使用UDP协议来进行通信,此时就会构造一个UDP的数据包
这个UDP数据包一共包含两个部分:
- 报头(header)
- 载荷(payload)
载荷里面的东西就是应用层数据包
如下图所示:
形如上述,添加报头的过程就是==封装==
其实就是拼接字符串
只不过拼接的是报头,具有一定的结构
例子:
商家发货一件衣服,不能够直接发,一般都是要先进行包装,使用塑料袋子进行包装
包装的作用是什么?
给快递套上包装,既能够起到保护作用,又能够用来贴标签
标签上就可以写一些用来发送快递的关键信息
上述的封装的过程就是这个衣服被包装的过程
封装的作用是什么?
我们这里的UDP报头虽然不能够起到保护的作用,但是可以起到“贴标签”类似的效果
就能够承载一些关键的用来转发数据的信息
**对于UDP报头来说,UDP报头是一个二进制数据,承载的最重要的信息就是源端口和目的端口,这两个端口就是被记载在UDP报头中
当我们拼接好一个传输层的数据包之后呢,就要把这个数据包进一步交给下层,网络层继续进行封装了
交给下层指的是下层协议提供一组API(函数),上层调用这个API(函数),并且把刚才构造好的数据 通过参数传过去,下层协议就可以来处理这个数据了)
源端口和目的端口是在传输层
源IP和目的IP是在网络层
传输层的数据打包好了之后,数据会继续被交给网络层:
3: 发送方A的网络层:
网络层涉及到的最核心的协议就是IP协议:
在网络层包含很多的属性,最重要的属性就是源IP和目的IP
网络层的IP协议把刚才传输层的UDP数据包作为一个整体,把这个整体作为IP协议的载荷,然后拼上IP协议的报头,构造成为一个数据包:
内容如下:
- IP协议的报头
- IP协议的载荷
如图所示:
在这个IP协议报头中:
也会包含一些辅助转发的关键信息,此处最关键的信息就是源IP和目的IP
此时构造完成一个完整的IP数据包之后,IP协议继续调用数据链路层的API,把数据再交给数据链路层这里的协议进行处理
网络层数据打包好了之后,会继续把数据交给数据链路层来进一步打包
4: 发送方A的数据链路层:
数据链路层涉及到的核心协议叫做以太网:
此处,我们使用“以太”来作为网络传输的介质
以太网就是日常见到的有线网络
我们日常使用的网线也是“以太网线”,日常使用的网口也是“以太网口”
日常使用的交换机也是“以太交换机”
**以太网数据帧:
以IP数据包作为一个整体,在这个IP数据包的前面加上一个以太网帧头,后面加上一个帧尾
中间是载荷
如下图所示:
以太网帧头中最重要的信息是源mac地址,目的mac地址
这样的数据封装好了之后还要继续向下走,交给物理层
5: 发送方A的物理层:硬件设备:
**把上述的这样的以太网数据帧这样的二进制结构(一串 0 1 0 1) 这样的数据:
将这样的数据转化为光信号(光纤)/电信号(网线)/电磁波(无限wifi)
然后进行发送
此时经过上面的一系列操作,从上层协议到下层协议,层层给数据包添加报头,终于是把这个hello这个数据给发送出去了,(刚出家门)
以上就是封装的过程
数据发送出去之后,就会经过一些列的交换机和路由器进行转发,A和B一般来说不是直接网线连接的,中间还要经过很多的交换机/路由器设备进行转发
这个中间过程我们先不谈,接下来先说明清楚
当数据到达接收方B之后,接收方B要对数据进行一个“分用”的过程
分用的全过程:
**下面是接收方B发生的事情:
我们先来假定这个数据包已经到达B的网卡了,看这个B会如何处理这个数据包
接收方B的这个处理数据包的过程就是 "分用"的过程
1: 接收方B的物理层:
物理层收到的数据 是光信号/电信号/电磁波,物理层就会把这些物理信号转换为数字信号(二进制的 0 1 0 1 )
在转换之后会得到一个以太网的数据帧,进一步会把这个数据帧交给数据链路层处理
2: 接收方B的数据链路层:
通过以太网协议,针对以太网数据进行解析,会解析出以太网帧头和以太网帧尾,以及中间的载荷
以太网:发送方和接收方得使用一样的协议才行
我们这里进行解析: 把以太网帧头去掉,以太网帧尾去掉
如图所示:
按照以太网数据帧的格式来解析,取出其中的载荷,之后再交给上层协议:
3: 接收方B的网络层(IP协议)
网络层是按照IP协议的格式来解析,取出其中的载荷,再交给上层协议
此时去掉IP报头之后:
4:接收方B的 传输层(UDP协议)
按照UDP协议格式来解析,取出其中的载荷,再交给上层协议:
此时就去掉UDP报头,取出剩下的载荷,交给上层协议:
5:接收方B的 应用层 QQ应用程序:
此时应用层拿到数据之后,在根据端口号来判断把数据交给哪个应用程序
QQ这个程序就要解析这个数据,这个解析过程也是按照前面程序员自定义的应用层协议展开的
此时按照QQ应用程序内部的应用层协议格式来解析数据~
如何解析的?
就是把上图中的数据按照分号进行切割,就得到了这里的QQ号信息,发送时间,发送消息的正文
此时QQ程序拿到这些数据之后,就会弹出一些提示,并且把消息/消息的发送者/发送时间 都显示到聊天窗口上
以上就是分用的过程
分用的过程就是封装的逆向过程
数据报并不是发送方一发送出去就立马到了接收方那里,而是在网络中间还会经历一个转发的过程
通过路由器/交换机来进行转发,
在真实情况下,并不是一出门就直接到了,而是两个主机一般都不是直接通过网线直连的,而是通过一系列的交换机或者路由器来进行数据转发的
但是实际上即使是经过交换机或者路由器,上述的封装分用过程,也还是同样适用的
只不过,封装分用的程度不一定是到应用层(不一定是五层都有,可能是只涉及到了几层)
比如:
对于经典交换机来说,就只需要封装分用到数据链路层即可
对于经典的路由器来说,就只是需要封装分用到网络层即可
如果数据报在中间的转发过程中,转发到了路由器上,那么也要经历一个封装分用的过程,只不过是封装分用到网络层:
当路由器拿到数据之后,路由器会将数据解析到网络层,拿到IP地址之后,决定下一步如何传输,
下一步传输的时候,又会重新经过网络层,数据链路层,和物理层的封装才能从路由器中传输出去
*如果数据报被转发到了交换机上,那么就会在交换机上进行一个封装分用到数据链路层的过程,
所以封装分用这个过程在网络通信中是贯穿始终的,数据经历的每一个节点都要进行封装分用的过程
交换机A的工作:
下述是A的光电信号;
交换机A的物理层就会把从A发出的光电信号转换成以太网数据帧二进制数据交给数据链路层:
而在交换机上面也是实现了数据链路层的:
此时交换机A的数据链路层就会对上述的数据进行解析:
这个解析过程,一方面要去除载荷部分,另一方面要解析到帧头的关键信息
- 去除载荷
- 解析帧头
根据帧头中的信息,决定下一步把数据往哪里进行发送,根据这个情况再进一步地构造出新的以太网数据帧~
新的数据帧如下图所示:
把这个新的数据继续通过物理层发送出去
这里的以太网帧头,对于交换机来说,已经够用了,就不需要再进行解析了
刚刚是交换机,现在是路由器:路由器的情况更加复杂一些
要封装分用到网络层
当路由器拿到A的光电信号之后:
A的光电信号如下:
先是物理层拿到光电信号,转成二进制数据交给数据链路层:
数据链路层对上述的数据进行解析,去掉以太网帧头,拿出载荷,交给IP协议
如下图所示:
IP协议又会进一步对这个数据进行解析,解析IP报头,再一次取出载荷,
路由器为什么要解析IP报头?
因为路由器需要通过IP报头中的目的IP来知道具体接下来如何转发
取出的数据 会被IP协议重新进行封装操作:
即刚刚取出的数据会被重新加上(封装上)IP报头
如下图所示:
数据被重新封装上IP报头之后,会被交给数据链路层,继续加上帧头和帧尾
如下图所示:
此时我们又构成了一个数据链路帧,此时这个数据再交给物理层,去转成光电信号,继续传输
此时我们的路由器只是封装分用到网络层,说明路由器并不在乎UDP数据和应用层数据
对于一台主机,
它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型的下四层;
对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
路由器是工作在网络层的
对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP五层模型的下两层:
交换机是工作在数据链路层的
对于集线器,它只实现了物理层
上述的路由器和交换机指的是经典的路由器和交换机
事实上的路由器和交换机的功能更加复杂强大
很多的交换机也具有一些路由器的功能,也可以工作在网络层
很多的路由器也具有一些交换机的功能,也可以工作在数据链路层
甚至有些交换机路由器还可以工作在应用层
如果交换机要截取/解析你所传输的数据,那么就会封装分用到应用层,把hello拎出来看看
在上述图片中的每一个节点都会涉及到封装分用的过程
所以网络传输数据不是一个简单的事情,背后有大量的工作 ,只不过这些工作都是硬件&驱动
&操作系统 帮我们完成了
注意:
我们在描述一个网络上传输的数据“单位”可能会用到几个术语:
包(packet): 网络数据包
使用场景: IP数据包
段(segment):网络数据段
使用场景: TCP数据段
报(datagram) : 网络数据段
使用场景: UDP数据段
帧(frame) : 网络数据帧
使用场景: 以太网数据帧
上述的几个术语都是网络传输的基本单位。
我们今天就学习到这里,下次见~