前言
本来是要写 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