目录
把多个机器连接在一起,就构成了一个局域网。
从上图可以看出来,机器之间两两相连是不靠谱的,没那么多网线,没那么多网口,成本很高!
因为我们就发明了交换机和路由器,通过交换机和路由器完成多台机器之间的通信。
交换机是把多个机器连接到一个 "局域网" 中了。
路由器则是把多个局域网连接起来。在交换机和路由器的反复连接之下,就可以把很多的设备都连接在一起,使它们直接可以进行通信。当机器足够多的时候,就可以将其称为 "广域网" 。但事实上,局域网和广域网之间没有明确的界限。
简单来说,协议就是 "约定",通过一些约定,来表达一定的含义。
举个例子,就比如相亲,男方和女方在没见过的情况下,要在约定的地点见面。万一当天相亲的人很多,并且约在附近的人也很多,就容易出现约错人的情况,于是就可以在来之前约定好 "暗号"。这个"暗号"就相当于这里的协议。
网络上传输的数据,本质上是通过 光信号(电磁波) / 电信号(网线)来实现的,通过这两信号,就可以传输二进制数据了。在传输数据的时候,我们假设高低电频用 1 / 0 来区分,那么不同的 0,1 排列组合,表达的是什么信息,就需要通过 "协议" 来约定!!
网络通信其实是一个非常复杂的过程,有很多问题,很多细节要处理。如果就使用一个协议,来解决所有问题,就会造成这个协议,复杂无比!!
🍃1.于是聪明的程序猿就将协议拆分,把一个协议拆成多个协议。这就和我们平时写代码一样,一个类如果写的太复杂,我们就将其拆成多个类,一个方法如果写的太复杂,就将其拆成多个方法。
🍃2.协议在拆分的过程中,程序猿们就发现,部分拆出来的协议,解决的问题都大致相同。因此,程序猿们就将这些协议分成很多类,每一层都有很多协议,这些协议做的工作都差不多,这就是写一分层!(类似于,我们的类定义很多的时候,为了方便管理,功能相似的类都放在同一个包下面)
🍁协议分层的好处
1.下层协议给上层提供服务,上层调用下层协议。起到了一个封装的效果,实现上层协议的人,不必考虑下层协议的细节。
2.起到解耦合的效果,可以把同一层的协议替换成其他协议,对于其他层次的协议来说,基本无感知的(透明的)。(结合下图理解)
🍁两种分层模式
1.OSI 七层网络模型。(只是理论上存在,实际上没有这么实现)
2.TCP/IP 五层网络模型。
这两种分层模式有很多相似之处,重点看一下第二种分层模式。
🍃1.物理层:网络通信的基础设施。
🍃2.数据链路层:两个相邻的结点之间如何传输。
🍃3.网络层:两个点之间的路径规划。
🍃4.传输层:两个点之间的通信。(不考虑路径规划)
🍃5.应用层:数据传输过去之后,具体怎么使用。
如何结合实例理解这五层模型??
比如我在淘宝上买了一双鞋,下单后,卖家就把货通过快递发给我。
🍃1.卖家在发货的时候,只需要考虑发件人(起点)和收件人(终点),这里的卖家就相当于传输层。
🍃2.当卖家将货交到物流公司的手里时,物流公司就要规划好从那条路线走,成本最低,这里的物流公司规划路径就相当于网络层。
🍃3.规划好路线后,就进行两个集散点的之间的运输,运输过程中既可以是通过飞机,也可以是汽车,具体咋运输的这个过程就相当于数据链路层。
🍃4.运输可能走高速公路,也可以走普通马路,这里的高速公路,马路就相当于物理层。
🍃5.最后货送到我手里的时候,我可能自己穿,我也可能卖给别人,怎么使用取决于我自己,这里的如何使用就相当于应用层。
这五层模型中,只有应用层,是咱们自己写代码处理的。下面的四层,都是由操作系统以及硬件设备处理好的了。所以网络编程的主要工作,就是写应用层的代码,来处理应用层的协议数据。
【经典面试题】
我们知道了交换机和路由器的功能都是用来组建局域网,那么它们分别工作在什么层?
交换机是工作在数据链路层。
路由器是工作在网络层。
(这里只针对经典的交换机和经典的路由器,实际上,当下的交换机和路由器功能都越来越强大了,彼此之间也有很多功能重叠了,甚至这些设备可能有一些传输层,应用层的功能)
封装和分用描述了网络是如何传输数据的。(注意这里的"封装"和面向对象的封装、继承、多态中的封装还不太一样)
例如我们使用QQ发送消息,主机 A 给主机 B 发送一条 "hello",看似一个很简单的发送过程,它背后其实要做的工作是非常多的。
🍁封装
1.首先,主机A 先到应用层(QQ应用程序),把用户输入的数据,整理成应用层数据报。相当于通过类似于"字符串拼接的方式",将其构造成更完整,信息更多的数据,再传输。(加报头都是通过类似字符串拼接的方式)
接下来就需要把这个数据报交给传输层(操作系统内核)。
2.传输层会根据当前使用的传输层协议,给应用层数据报,进行进一步的组装。假设现在使用 UDP 协议。(传输层的协议)
组装好了之后,继续把这个数据报,交给网络层。
3.网络层,主要使用的是 IP 协议,再进行进一步组装。
这里组装好之后,再交给数据链路层。
4.数据链路层,比如使用以太网协议,再进一步的组装。
这样就构造了一个以太网的数据帧(本质上是一堆二进制序列)再把这个数据交给物理层。
5.物理层,拿到数据之后,把这里的二进制序列,转化成 光信号 / 电信号,再把光电信号,发送出去即可。
上述1,2,3,4,5 从上至下,依次添加报头的过程,就成为封装!!(这就好比,发一个快递,快递要套上恒多层包装一样)。
🍁分用
忽略中间的传输过程。当主机 B 收到上述数据的时候,做的工作就是封装的 "逆过程",称为 "分用"。每一层协议把对应的协议报头给解析出来,并且去掉报头。(类似于拆快递)
1.物理层,把光电信号转换回二进制的数据,得到以太网的数据帧,如何交给数据链路层。
2.数据链路层,去掉数据帧头和帧尾,把载荷去取出来,然后交给网络层。
3.网络层,IP 协议解析出 IP 报头,并去掉报头,然后把载荷取出来,交给传输层。
4.传输层,UDP 协议再进行解析报头,并去掉报头,把载荷取出来,然后交给应用程序。
5.应用层,QQ应用程序再解析这里的信息,显示到界面上。
上述过程体现出了,网络通信中,各个层次的协议是如何分配工作的。
【补充】:
上述的封装分用,不仅仅出现在主机上,也会出现在传输过程中,包括在交换机和路由器上。
经典路由器是封装分用到网络层,经典交换机是封装分用到数据链路层。
本篇博客就到这里了,谢谢观看!!