对网络七层协议的简单理解

前言

本来是要写 C# Http 通讯 这篇流水账的,结果刚写一句就蒙了:http 和 socket 到底啥区别啊,凭什么 http 可以通过域名找到服务器啊,网络到底是怎么实现通讯的啊。。。

然后就开始百度,总结了这篇 “作文”。

好奇给我们探索的力量:朋友的微信消息是怎么发到你手机上的?

只要理解了网络七层协议,就知道这个问题的答案了。

先说好,要真正掌握这个问题的答案,有 N 本书等着去看。这里只是简单理解。(搭个台阶先)

先说好,答案不是 “聊天消息是靠意念传过去的”,不是 “你去问麻花疼啊”。

网络七层协议

一条微信消息从一部手机达到另一部手机,可谓长途跋涉、翻山越岭,哪怕两部手机放在同一张桌子上。

微信消息在互联网上穿梭并且抵达目标地点的难度,远远高于不在重庆的高架上迷路。

为了分工、统一这个过程,国际标准化组织 ISO 于 1981 年正式推荐了一个网络系统结构:七层参考模型,叫做开放系统互连模型 (Open System Interconnection,OSI)。中文名:网络七层协议。

这个标准模型的建立,使得各种计算机网络向它靠拢,大大推动了网络通信的发展。

微信消息正是穿过层层协议,才抵达了聊天对话框里。

网络七层协议一共七层,每一层的分工如下所示:

名称 实例 作用
7 应用层 HTTP,FTP等 与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。
6 表示层 加密,ASCII等 这一层的主要功能是定义数据格式及加密。
5 会话层 RPC,SQL等 定义了如何开始、控制和结束一个会话,和对多个双向消息的控制和管理。
4 传输层 TCP,UDP 这层的功能包括是否选择差错恢复协议还是无差错恢复协议。
3 网络层 IP,IPX等 这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址。
2 数据链路层 ATM,FDDI等 它定义了在单个链路上如何传输数据。
1 物理层 Rj45,802.3等 物理层规范,有关传输介质的特性。

简单理解

情景

假如有一个村子,有 A、B 两个人,分别住在两个相隔很远的山头,他们没有手机,想要聊天,就得靠吼:

1,物理层

但是天天这样吼真的很累啊,受到老师的启发,他们制作了一个 “电话”:

这个 “电话”,就是物理层。

他们用了一根线来传递声音,那用两根线可以吗?当然可以,换一个三角形的杯子可以吗?也可以,反正声音传过去了,没准声音还更清晰呢。

所以实际生活中,会看到网线、光纤、座机电话线、USB等形式各样的通讯耗材,只是电气设计不一样,但都是用来传输上一层(数据链路层)的数据,都属于物理层。

2,数据链路层

有一天村子里来了一个人 C, 住在了另外一个山头上。C 想加入 A、B 的聊天群,也做了一个 “电话”,接入了 A、B 的聊天系统中:

但是问题来了,有时候 A 和 B 想私聊,然而 C 是妹纸,有些话不方便说。

于是三个人凑钱,买了一台交换机,当 A 只想和 B 聊天时,交换机就不给 C 发 A、B 之间的消息。交换机里记录着三个人的 “电话” 的编号,轻松地区分了三个人:

这下就 ok 了,如果村里子再来山大王,想入群,把 “电话” 接到交换机就好了。

这个交换机,就是数据链路层。

实际生活中,“电话” 的编号就是 MAC 地址。交换机正是利用局域网内网卡的 MAC 地址不同,把数据传送到正确的设备上的。局域网里就是这么做的。

3,网络层

世界很大,有另一个村子,也有这么一群可爱的人。世界也很小,两个村子的人想联合建个大群,新鲜事儿能多一些。

于是,他们统一把 “电话线” 接到了同一个交换机上,由该交换机做他们的接线员,效果刚刚的👍。

但是,高瞻远瞩的村长却并不满意,他认为这无非就是大一点的局域网,难道以后想扩大群,全都这么搞吗?

每个消息都要过交换机,那交换机要忙不过来了,而且人越多,交换机处理的越慢,最后会死机的啊。

于是村长提议对线路进行改造:两个村各自搭建局域网,村与村之间,加一台设备,做村与村之间的数据转发。

村长还给这个设备起了个名字:路由器。

对于村内的消息,只在村内的交换机上流通,村与村之间的消息再由交换机传输。这样整个通讯系统就可扩展了:

如图所示,村子之间有不同的编号,叫做村编号,每个出村子的消息都带有目标村的编号、目标电话的编号,这样路由器就知道这个消息该往哪个村子转发,交换机就知道该把消息具体给哪个人。

1,村子 1 里的 A 想给同村的 C 发消息,交换机拿到消息,呦,发给本村 C  的啊,直接就把消息给 C 发过去了。

2,村子 1 里的 A 想给村子 5 里的 A发消息:交换机拿到消息,呦,本村没有这个电话编号啊,消息丢给路由器 1 。 路由器 1 拿到消息,呦,这不是给村子 5 的消息嘛,根据最优路径原则,消息应该丢给路由器 3。路由器 3 拿到消息,呦,这不是给村子 5 的嘛,就发给了村子 5 的交换机。村子 5 的交换机拿到消息,呦,这不是给 A 的嘛,就发给了 A。

路由器,就是网络层。

多亏了路由器,才把一个一个的小局域网,构建成全球这个巨大的 “局域网”。

通过上面的拓扑图可以看到,每个村都要有一个全球唯一的编号(公网 IP),这样路由器才知道哪个 IP 的消息应该发给哪个村,然后再选择路径。而且路由器还会选择最佳路径,相关的路由算法有 Dijkstra 算法等。实际生活中,网络拓扑会比这个复杂很多,有些地方使用 NAT 协议,有些地方使用局域网静态映射。

4,传输层

改造后的通讯系统,实用性、扩展性都很强,于是被广泛的使用,越来越多的村子加入了这个 “局域网” 。

随着接入系统的路由器、交换机、“电话” 越来越多,又出现了另外一个问题:数据时不时的会丢失、重复、错误。现象就是有些人的 “电话” 声音断断续续、重复等。

村长派人去调查了一下,发现问题的原因很复杂:

  • 有些人的 “电话” 用了两根线,甚至还有人的 “电话” 用了五根线。这样不同 “电话” 之间可以传输的最大信息量不一样,即 “电话” 的性能不一样。A 一次性给 B 的数据,B 可能要花两倍的时间接收。
  • 不同村子里的人数不一样,交换机的品牌也可能不一样,数据交换速度不一样。
  • 不同路由器品牌可能不一样,性能不一样,连接着的交换机数量也不一样,路由算法分析速度不一样。

等等。

由于各个节点、子网在性能上的不一致,使得数据在传输时延迟、带宽、步调的不一致,导致最终出现了数据紊乱的情况。

为了解决这个问题,村长建议对通讯数据质量要求比较高的用户,使用一定的 “通讯协议”。

比如:

A 对 B 发消息,先发:准备好了吗?我要发消息给你了。

B 收到消息后,回复 A:准备好了,开始发吧。

A 再说:好的我要开始发了。

…..

再严谨一点,还要沟通好他们之间的网络带宽、重传规则、数据校验等,以这样的方式屏蔽掉物理层、数据链路层、网络层的性能差异,确保数据准确无误的传输。

对通讯数据质量要求一般的用户,可以不这么复杂,采取别的简单一点的协议。

为了保证接口的统一,所有的通讯系统都要加上这个步骤,虽然麻烦了一点,但是解决了数据时不时的会丢失、重复、错误的巨大 bug 。

而且用户可以根据需要,选择协议的类型。

把这个协议单独拎出来,就是传输层

传输层包含多种协议,最有名的就是 TCP 和 UDP,他们的具体内容说起来可多了,这里就不说了。

5,会话层

会话层建立在传输层之上,最广范的作用就是 “断点续传”,在传输一些大文件的时候起作用。

6,表示层

村长的这个网络确实不错,越来越多的人用上了电话。但是,With the remarkable improvement of people’s living standard….  跑题了。。。。

打电话确实方便,但是不能满足人们日益增加的形式多样的交流需求。

声音能转成数字发送,图片应该也可以。于是就有人研究出来,在现有的系统上再加一层,做数字信号和图片的双向转化。

于是各种各样的信息,比如图象、视频、文本、图纸、邮件等,在发送端先由表示层转成数字信号,再交给会话层发出去;接收方收到数据后,把数据过一遍表示层,出来的就是相应的文件了。

在表示层以下的环节中,万物皆是 0 或 1,只有经过表示层的转化,数据才变成对应的信息。

与此同时,表示层还承担着数据加密等功能。

7,应用层

这一层,就是各种各样的 App 啦,程序猿设计 App 的时候不必关心数据是怎么翻山越岭在用户和服务器之间传输的,App 没 bug 就烧高香了。。。

用户就更简单了,App 怎么做出来的都不用知道,会用就行。

这就是网络分层封装的意义。

实际的网络应用中,不一定是完全按照这个分层来完成通讯要求的,会根据实际情况进行调整,不同的模型也有不同的分层规则:

解开疑惑

以上就是 “网络七层协议” 的简单理解。微信消息就是从应用层,一层一层的往下走,到达目标交换机后,再一层一层地往上走,最终显示在了对方的微信里。

微信消息和 QQ 消息都发到了对方手机上,为什么不会串?因为微信和 QQ 各占不同的通讯端口,就像两个管道里的水,不会串。

不同朋友之间的微信消息为什么不会串,因为消息带有不同的标志,微信程序帮我们区分开了。

恕我水平有限,文中如有错误之处,欢迎留言,不吝赐教。

文中参考了很多资料,每一层都有写的非常好的文章,链接如下,供详细参考:

应用层 https://blog.csdn.net/qq_33102061/article/details/81141821

表示层 https://baike.baidu.com/item/%E8%A1%A8%E7%A4%BA%E5%B1%82

会话层 https://www.zhihu.com/question/58798786?sort=created

传输层 https://www.2cto.com/net/201511/448991.html

网络层 https://blog.csdn.net/qq_38668258/article/details/84987881

数据链路层 https://www.cnblogs.com/xiaofeng666/p/6718955.html

物理层 https://www.cnblogs.com/fasionchan/p/9450811.html

发表评论