目录
1.前置基础知识
1.1局域网和广域网
**(1)局域网:**这是一个相对的概念。比如一间教室可以认为是一个局域网、一栋教学楼、一个学校、一个城市等等。在一个局域网内,连接到局域网上,可以互相通信
**(2)广域网:**这是全球最大的广域网,称为:The Internet,万维网。
1.2.主机、路由器、转换机
**(1)主机:**一个设备称为主机。例如:一个手机、平板、电脑都可以称为一个主机。
路由器和交换机,都是用来组建网络的重要设备。
(2)路由器
路由器,有一个WAN口和多个Lan口,其中Lan口负责连接主机,而WAN口负责连接更大的主机。
(3)交换机
交换机,可以认为是路由器的进一步拓展。目的:路由器上面的lan口太少,而交换机则对其进行了拓展,也就是有更多的lan口。
1.3.IP地址
(1)标识一个网络设备,通过这个地址,就可以找到这个设备,进而进行通信
(2)IP地址,有四个字节的数字组成,也就是32位。
(3)表示方法:使用点分十进制的形式。使用三个.号将ip地址分成四个部分,每个部分的数据为一个字节,范围为:0-255(IPv4)
(4)例如:192.168.100.176
1.4.端口号
端口号,是用来标识应用程序的。不同主机的端口号可以一样,端口号的范围就是一个主机内
2.协议
2.1.协议的定义
**(1)协议,**其实就是一种约定,一种规则。通信双方,对于通信规则的约定,一定是通信双方都可以得到认可的。
(2)例子
A和B约定某一天网恋见面,因为没有真实见过面,所以他们就会事先约定好一种规则。比如A穿一条白色连衣裙,B穿着西装。两个人之间,也是可以称为一种协议的。
(3)为什么通信需要协议
一般通信都是指不同主机之间发生的,但是两个主机往往都不一样(设备、操作系统、硬件),所以需要约定协议。
2.2.协议分层
(1)背景
在网络通信中,这是一个非常庞大的结构。如果只有一个协议,很不好管理所有的内容,也会造成协议非常的庞大,所以就需要拆分。不同的部分,采取不同的协议。这也称为拆分。
(2)例子1
例如,我们在写代码的时候,如果一个方法里面要实现的功能非常多,就需要将每个功能拆分成若干个方法,进行封装。一个复杂的类同理,最好是只表示一方面,比如,人的性格作为一个单独类,一个人是怎么跑步的,又作为一个新的类。
(3)例子2
在一个大厂的,人是非常多的,各种关系,等级也是非常的复杂。如果一个普通员工需要汇报工作,是向谁汇报呢?这是非常的乱的,所以,就需要拆去分层管理。
大概下面这样的分层结构。

这就是一种分层结构,下层的人需要向上一层的人汇报工作,上一层的人管理下一层的人。
协议分层,自然也是类似的效果。很多协议,就会按照功能的不同,分层不同的层级,每个层级都有对应的主线任务(目标/要解决的问题),上层协议会调用下层协议的功能,下层协议会给上层协议提高服务。
2.3.协议分层的好处
(1)有封装的效果
在封装之后,某一层协议不需要其他层协议的细节,降低了学习使用的成本。
比如:我们在写代码的时候,属于某一层协议,当去调用一些系统api的时候,就是去调用其他层的协议,我们不需要知道他是怎么使用这个功能的,只需要会使用即可。
(2)能做到解耦合
实现分层之后,任意层的协议,都是可以灵活调换的。
就比如:当系统api里面的实现改变之后,那也是那一层干的事情,跟我去调用没有任何关系。
因为分层很好用,所以现在的网络结构也是采取分层的结构。
2.4.网络结构
一般有两种分层结构:OSI七层模型(理论模型,只存在于书上)和TCP/IP五层或四层模型(大多数网络的结构)
(1)OSI的七层结构分别是什么?
物理层、数据链路层、网络层、传输层、应用层、表示层、会话层
(2)TCP/IP五层协议
物理层、数据链路层、网络层、传输层、应用层。
我们一般就学习五层模型
2.5.TCP/IP五层协议
(1)物理层
物理层,规定了硬件层面的。比如网线、网卡。他们的形状大概是什么样子?内部是怎么包装的等等。
(2)数据链路层
关注的是,两个相邻节点之间的通信
(3)网络层
关注的是对于通信路径的规划。也就是设置一条路线,就决定了路径上会经过哪些节点。"点到点的传输"
(4)传输层
关注的是通信双方的"起点"和"终点",也就是端到端的传输。
(5)应用层
应用层,是拿到了数据,然后要将数据拿来干什么,如何使用
网购举例:
A:我下单了一件商品,并且写上了自己的快递信息(姓名+电话+收货地址等);商家收到订单之后,也会在快递包装上面标注自己的快递信息。对于我和商家来说,就相当于是传输层,只需要关心起点和终点。(我下单之后,只需要填好信息,最后快递就肯定会到达我指定的地点处,至于是怎么到的,我不需要关心)
B:当商家将快递给快递小哥,并且拿到了快递驿站。此时,驿站需要根据我填写的地址信息,进行快递运输路线的规划。(比如:快递在北京,我在桂林。路径大概就是北京--河北--湖北--湖南--桂林),这就是网络层需要完成的任务。至于怎么根据路径到达的,我不关心
C:当路径确定后,对于两个相邻地点之间该怎么运输。比如,使用飞机运算、三轮车运输、货车运算、火车运算等等,这是快递员的选择,也就是数据链路层需要完成的事情。当快递到达之后,用户如何使用,就跟我没有关系了
D:当快递到了之后,我就拿到了快递。至于我如何使用该商品,吃了也好用也罢,是我说了算,这就是应用层需要完成的事情了。
我们需要掌握的:
我们使用最多的就是应用层,但是应用层需要和传输层接触,所以需要重点认识传输层。
对于其他层,我们不需要关心他是如何实现的,但是传输层,要去关注,特别是传输层给应用层提供的api,因为我们需要去调用该api,用来实现一些功能。
2.6.协议的封装和分用
这里要认识的就是每层协议之间,是如何配合工作的。上层协议可以调用下层协议,下层协议需要给上层协议提供服务。
A通过qq向B发送一条消息,消息内容是:love。底层是如何将消息传递给B的呢?
封装:
(1)应用层
在聊天窗口将"love"的消息发送出去后,在qq应用程序的应用中,就有一个特定的协议(具体什么协议,我们不清楚,也不需要关心),规定发送的信息的格式,要包含的东西。下面我们假设是这样规定的:
单单发送一条消息,需要包含这些信息:A的qq号、B的qq号、发送时间、消息正文;并且按照这样的格式和顺序组织起来,组成一整个字符串。

当应用层将数据打包成:应用层数据包后,应用层就会调用传输层提供的api,进行将数据包发送给传输层。
(2)传输层
传输层拿到的是"应用层数据包"

在传输层中,也有它自己的协议;传输层有两个重点协议:TCP和UDP协议,我们现在使用UDP协议进行举例。
传输层做的事情:传输层会根据UDP协议,就会给应用层数据包的包头加上一个UDP报头,组成UDP数据包

UDP报头中包含的信息:
UDP报头的一些属性,如:发送人的端口号、收件人的端口号等,就是传输层干的事情
接下来,传输层也会调用网络层的api,将UDP数据包发送给网络层.
(3)网络层
网络层这里拿到的是UDP数据包

在网络层中,也有它自己的协议,典型的协议就是:IP协议
网络层会根据IP协议,继续对UDP数据包进行进一步的封装,这里是在UDP数据包的头部加上:IP报头,称为:IP数据包

IP报头包含的信息:发件人的IP地址和收件人的IP地址。现在才知道要发送给的主机是谁
接下来,网络层会将打包好的IP数据包通过数据链路层提供的api,发送给下一层。
(4)数据链路层
这一层,拿到的就是IP数据包

数据链路层,典型的协议就是:以太网
就和根据协议,和这一层的数据格式,继续对数据进行封装和打包。
数据链路层,就会在IP数据包的两头加上帧,其中头部加上的是帧头,尾部加上的是帧尾。

此时,数据才进入网卡驱动中,还是以二进制的形式存在,但是信息还未发送出去,接下来就是要发送数据了。
接下来,数据链路层就会将以太网数据帧发送到物理层
(5)物理层
物理层要做的事情,就是将上面的二进制数据,转成 光信号/电信号/电磁波,才能进行后续的发射。
上述对数据进行层层包装的过程,就称为"封装"。
但是,数据并不是直接从A的物理层到达B的物理层,而是先从A的物理层到达交换机/路由器,经过一系列的转发之后,才能到达B
分用:
当数据到达B这把之后,就会发生下面一系列的步骤
(1)物理层
B的物理层接收到 交换机/路由器 转发过来的光信号,就会将其转化成二进制数据,然后将其交给数据链路层。
(2)数据链路层
在数据链路层这里,拿到的数据是物理层转发过来的,大概是下面这样子。

而这边的数据链路层,不再是加上帧头和帧尾,而是解封装;也就是会根据以太网协议,将帧头和帧尾去掉,变成下面的载荷数据,从而交给网络层。

(3)网络层
网络层也就是拿到上面的数据

接下来,网络层也会根据IP协议,对载荷数据进一步解封,也就是会将IP报头去掉,取出真正的载荷,从而交给传输层。

(4)传输层
传输层拿到的就是网络层传送过来的数据

传输层就会根据UDP协议,进一步解析数据(关键的端口号),并将UDP报头去掉,进而交给应用层。

(5)应用层
最后,qq应用程序就拿到了下面的数据包。

将其进一步解析,拿到结构化的数据,并进行反序列化,拿到最终的数据。