文章目录
- 1 为什么需要分层?
- 2 TCP/IP 五层网络模型
- 3 数据的封装(发送消息为例)
- 4 数据的分用(接收消息为例)
- 5 实际网络环境上的封装与分用
- 写在最后
1 为什么需要分层?
你问我为啥需要分层?那必然是有好处的啊!
我们来回顾一下面向接口编程有什么特点~
- 对于使用方来说,不必关心提供方是如何实现的, 只需要使用接口即可;
- 对于提供方来说,只需要利用封装的特性,隐藏内部实现细节,对外开发接口。
而对于协议的分层也是类似,后续比较容易针对某一层协议进行替换~
- 分层之后,层次之间耦合度降低,上层不必了解下层的细节,同理,下层也不需要了解上层的细节~
- 方便对某一层的协议进行替换~
- 分层之后,就可以让程序员在同一时刻只关注某一层上的子问题~
2 TCP/IP 五层网络模型
TCP/IP 通讯协议采用了 5 层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。
- 应用层 : 负责应用程序间的沟通,关注传输过来的数据要干啥用! 我们所聊的网络编程主要就是应用层。 对不同种类的应用程序它们会根据自己的需要来使用应用层的不同协议,邮件传输应用使用了SMTP协议、万维网应用使用了HTTP协议、远程登录服务应用使用了有TELNET协议。
- 传输层 :不考虑中间路径,只考虑起点和终点~ 负责两台主机之间的数据传输。如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机。
- 网络层 : 主要负责两个遥远的节点之间的路径规划~(地址管理和路由选择) 两个节点之间可能有多种路径可以到达,其作用就是选择一条最适合的。例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router)工作在网路层。
- 数据链路层 :主要关注两个相邻节点的传输~ 负责设备之间的数据帧的传送和识别。网络上相邻的节点,就是通过网线/光纤/无线直接连接的设备。
- 物理层 :网络通信中的基础设施,网线、光纤、网络接口等。
那么在协议分层的背景下,数据是如何通过网络传输的呢?
- 对于发送方: 把数据从上层到下层,依次交给对应层次的协议,进行封装~
- 对于接收方: 把数据从下层到上层,依次交给对应层次的协议,进行解析~
即就是所谓的 封装与分用~ 听起来很高大上?别急,下面我们具体来盘一盘!
3 数据的封装(发送消息为例)
假如 小黄使用微信发送一条消息给七七:“今天你写代码了吗?”,在网络模型各层会发生什么呢?提炼信息如下:
- 发送方:小黄,接收方:七七
- 消息内容:今天你写代码了吗?
注意:以下内容以理解为主,数据内容并不完全准确,比如数据包的结构,实际更复杂,这里作了简化处理~
首先来到 应用层~
微信 App 拿到上述提炼的数据,封装成如下的应用层数据包:
补充: 数据包的封装本质上是字符串拼接,为了区分不同的字段可能还会引入分隔符、长度信息等。即实际的数据包可能更复杂,例如以分号作为分隔符,上述数据包可能为:
5477;7745;2023-04-25;今天你写代码了吗?
应用层 -> 传输层
拿到上述数据,应用层要调用传输层提供的 api 来处理这些数据!传输层的协议中最典型的是 TCP 与 UDP,这里以 UDP 为例,针对上述数据包进行封装~
补充: 一个典型的数据报就是由
数据报头 + 数据载荷
组成的~ 可以将数据载荷理解为包装好的快递~ 该快递是要有寄件人和收件人相应的信息的。而 数据报头,就相当于 快递信息,加上数据报头,就相当于在快递箱子上进行了一个 “贴标签” 的操作~
传输层 -> 网络层
将上述传输层已经有的 UDP 数据报交给网络层的协议,最典型的就是 IP 协议~ 即拿到上述数据报后,需要进行进一步的封装:加上 IP 协议报头~
补充: IP 是找到主机,而端口号是确定主机上的 进程/程序 ~
网络层 -> 数据链路层
同样对上述数据报,再次进行封装,最典型的协议就是 以太网 ~
补充: 以太网是最常见的数据链路层的网络,比如我们平时使用的网线上网,就是在用以太网~
物理层
物理层拿到上述的以太网数据帧,则会将这样的 0101 二进制数据
转化成 光信号/电信号/电磁波信号 进行传输~
需要注意的是,以上的过程,操作系统已经帮我们封装好了~ 这就是所谓的 TCP/IP 五层网络模型的封装~
4 数据的分用(接收消息为例)
数据的发送过程我们了解了,那么又该如何接收呢?
其实很简单,如果说发送是封装的过程,那么接收就与之相反,则是分用的过程~
- 发送方,从上层到下层,依次封装,新增报头~
- 接收方,从下层到上层,依次分用,去掉报头~
在此为了方便理解,我们 不考虑发送方和接收方的中间节点的转发过程~
首先,来到 物理层~
物理层,网卡,接收到高低电平信号,会对信号进行解析,还原成 0101的二进制序列~
物理层 -> 数据链路层
上述拿到的 0101二进制序列,可以当作一个 以太网数据帧 就使用 以太网协议 进行处理:去掉帧头和帧尾,取出中间的数据载荷,上交给网络层~
补充: 以太网数据帧头有一个消息类型,根据该消息类型可以知道网络层是 IP 协议~
数据链路层 -> 网络层
接收到数据链路层的数据后由网络层的 IP 协议进行进行解析数据报。最主要的就是去掉 IP 报头,取出中间的载荷,上交给传输层~
补充: IP数据报报头也会有一个字段标识传输层使用的是何种传输协议~
网络层 -> 传输层
由 UDP协议 进行解析数据报,取出数据载荷,上交给应用层~
传输层 -> 应用层
由对应的应用程序,解析拿到的应用层数据报~ 这里以微信为例,则取出如下的字段,并在程序的界面中显示出来~
以上便是 TCP/IP 五层网络模型的分用 的流程了~
5 实际网络环境上的封装与分用
在真实的网络环境中,并不会这么理想,中间是需要经过许多中间节点进行转发的~ 概述图如下:
几点说明:
- IP 协议是一边传输一边规划路径~
- 重新封装过程中,源 mac 地址 与 目的 mac 地址 也会发生变化~
- 通常,在该过程中,交换机“二层转发”,路由器称为“三层转发”~
写在最后
以上便是本文的全部内容啦!创作不易,如果你有任何问题,欢迎私信,感谢您的支持!
本文被 JavaEE编程之路 收录点击订阅专栏 , 持续更新中。
创作不易,如果你有任何问题,欢迎私信,感谢您的支持!