5 hjs 5天前 82次点击
Hello你们好,我是hgs!
我们接着上篇帖子继续聊网络。今天我们来聊聊OSI网络模型。
上一篇帖子是主要讲述物理层面传输的,但实际上网络更大的部分是软件与逻辑层面的。
当你在社区中某位小伙伴的帖子下评论的时候,有没有思考过,当你写下评论点击发送的时候,这些文字到无限电波之间又发生了什么?无线电磁波是怎么能够表示文字的呢?
其实最开始的网络,面对一个很巨大的问题,成千上万的设备互联在一起,但是我怎么才能让这些设备互相搞懂对方发送的信息,这就成了一个问题。这就好像湖南人和广东人见面,他们俩都说方言,那肯定谁也听不懂。而国际标准组织就是要实现一种网络上的普通话,让大家都遵守这种通信规则,这样大家都能互相理解对方说的什么。
说干就干,1978年,国际标准组织ISO技术委员会开始设计和研究模型的框架。一直持续到1984年,ISO 发布了 ISO/IEC 7498,这个标准就是OSI 开放设备互联模型的官方标准。
OSI 非常复杂,这也为它后来没有实现而变成理论埋下了伏笔。但虽然说它后来变成了理论,但现今的网络架构也都是依托于它改良的。
OSI 一共有7层,每一层都负责对应的职责,7层组合在一起就能够做到让你按下发送键,信息就能到对面设备。有一种神器碎片合成为神器的感觉哈!
有人可能会好奇,为什么会分成7层,为什么会有层级这种概念?给大家举个例子,假设你在组装小汽车。组装的零件都是互不干扰的,它们只要保证连接处的统一,也就是说能把这些零件顺利的组装在一起即可。如果小汽车的轮子坏了,我们只需要把轮子拆下来,换个新轮子,而不用改变车的整体结构。又譬如你想让车头升级一下,上面装俩大灯。那你就把车头拆下来,在上面放俩大灯再装回去。你看,依然没有改变车的整体结构。
我们可以发现,按照上面的思路,我们对小汽车的某个部分升级只需要很短的时间。因为我们不需要对小汽车的整体结构做变动!
分层结构本质也是这样的,如果某一层需要调整,我们只需要调整这一层即可,而不用对整体做变动。当然前提是层与层的接口要始终保持不变。
OSI 从上至下,分别为 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
应用层就是指我们的应用程序,比如你打的字,对方打的字,你发的语音,对方发的语音。就是我们可以看到的东西,都是这个层级的。浮于表面者,应用层是也。我用这几个字来形容应用层!
表示层已经来到了我们看不见的区域,这一层负责格式转换,以及加密、解密、压缩等等。我来简单解释一下,什么叫格式转换?我们的字符,语音,图片,反正是所有东西。在设备的内部都是二进制形式的,二进制就是只有0和1的一串数字。而我们为什么没有看到0和1,那是解码的功劳。表示层就负责把我们能理解的东西转换到二进制,这个转换的过程也叫做编码。形象点比喻,就好像你找了个翻译,把你写好的寄给英国的朋友的信,翻译成英文一样。
加密、解密,这也是很关键的功能。有的小伙伴有可能知道https,在我们访问网站的时候,譬如我们的社区,它的前缀就是https,后面再跟xxx.com或者cn。这个https是安全的传输协议,SSL/TLS 就是https的加密核心。有趣的是SSL/TLS 就位于表示层。我们还是拿宋信的例子举例,你找了一个翻译,把中文的内容翻译到了英文,但你怕别人偷看,又把它按照指定的密码加密了,你的朋友只有密码才能解开你信件的内容。但是你忽然又觉得这封信太大了,于是你把信纸折了起来,这就是压缩,你把信纸折起来之后,它的体积就变小了,就可以装到信封里了。而压缩在网络中也非常有用,压缩可以使得数据的体积变小,从而能节省不少的流量,还能提高速度。
会话层就是建立连接的开始了,这个时候你也能说一句,手拉手,我们都是好朋友。会话层的主要作用就是与通信的目标,建立一条逻辑会话。除了这项职责,他还负责中断会话,以及恢复绘画的功能。不知道各位听没听说过断点续传,简单说就是如果你在下文件的时候忽然断了,恢复的时候便可以从上次下载的地方继续下载。。有的断点续传,就跟绘画层有关。绘画层检测到绘画意外终止,或者出现问题,就会尝试在出现问题或者终止处恢复绘画。形象比喻,给老师打电话,你和老师之间便建立了一个通道。然后你和老师说着说着,忽然他就听不清了。然后你四处走动,终于找到一个信号好的地方,然后你就从刚才终止的地方继续讲,这就是恢复。终于你和老师聊完了,你挂断了电话,这就是终止会话。但我要强调一下,会话层,它只是建立了一条逻辑上的通道,而不是真正的物理通道,真正的物理通道在下面。
传输层负责数据可靠的传输,这一层是很重要的,如果没有它你就会体验到前一秒还说着a话题,下一秒忽然就变成c话题了。除了可靠传输之外,传输层还会把大的数据分割成为小段的数据段,并加上编号。其实传输层不仅能可靠传输,它也会不可靠的。
实现可靠传输的是TCP,它每一次向对方发送完数据段,都会等待对方确认收到。如果没有收到确认信息,TCP 还会重发没有收到的数据段。当然,除了以上之外,他还负责确保目标设备收到的数据段与发送设备发送的数据段顺序一致,这样方便组装。实现不可靠传输的是UDP,这个老哥就懵了,我不管你收没收到,我一口气全给你发过去!
形象的比喻一下,你要寄一个巨大的快递。我们把巨大的快递分成了若干包,这就是拆分到数据段。TCP 公司会确认客户收到每份包裹,而且保证收到的顺序和发货的顺序是一模一样的,这样就方便客户组装。于是他们发送包裹的时候就会询问,你收没收到,客户说收到了。一直重复这种步骤,如果客户说没收到,那就需要重发。UDP 公司就比较直接了,我管你收没收到,全部发出去,丢了也不关我的事儿。
所以TCP 用于需要可靠的场景。比如你下载文件,你敢不敢使用UDP?假如你下载一个软件,如果你使用了UDP,并且你运气爆棚,中间还丢了几个数据段。迎接你的是你的设备收到了一个不完整的数据,它组装出来的也是一个不完整的数据包,也就相当于你安装了个残缺的软件。轻则功能异常或者缺失,重则直接安装失败。所以这个时候你就应该使用TCP,只有确认每一段的数据都收到,你才能拥有一个完整的软件。
UDP 更常用于一些实时性比较高的地方,对于可靠性的要求没那么强烈。比如视频直播,这种实时性的场景,追求的就是速度。所以使用UDP是很棒的做法,因为它不确保每段数据的收到情况,它只顾着闷头发送,速度自然就上来了。
网络层数据的导航仪,它负责路由和选址。网络层就是根据ip来通过查找路由表帮助你的数据找到一条距离目的地最近的路径。这一层最常见的物理设备就是路由器,因为路由器就可以帮助你路由你的数据。
数据链路层两点一线的守护者。数据链路层负责直线上的两个设备之间的传输,它会把数据封装成帧。除了封装成帧之外,还会加入帧头和帧尾。并且会在帧中加入发送设备的MAC地址和目标设备的MAC地址。
MAC 是全球唯一标识你设备的一串不可变的地址,就像我们的身份证号,这是你无法改变的。有了这个东西,才能确保真正准确的找到设备,而ip地址并不能保证这一点,因为它可以被更改。
除了上面提到的功能之外,数据链路层还负责确保是否完全收到数据帧,如果数据帧有损坏,它会直接丢弃,并且要求重发。当然哈,数据链路层不做重发这事,他只负责扔东西。重发这活还得上层的干。
除了这些,数据链路层还有流量控制的功能。它要确保自己发的不能过快,导致对方接收不过来。
最后一层,最底层,也就是物理层,这一层就是真正的物理设备。这一层考虑使用什么传输媒介,是光纤还是铜缆,还是其他的东西。他也规定电波怎么代表二进制的0和1。
至此整个模型已经剖析完毕,其实我这也只是一个宏观的概览,还有很多的细节没有讲到。但这些东西就已经很复杂了,直到此时,我已经写了3000多个字。
让我们在简单的概括一下吧,第7层应用层,我们日常使用的软件,我们能看到的东西,处于这一层。第6层表示层,啊要发送的信息编码,或者把接收的信息解码,还有加密和压缩功能。第5层会话层,创建,终止,恢复逻辑绘画通道。第4层传输层,决定可靠传输还是不可靠传输,分割大数据为数据段。如果是可靠传输,要确保对方按照正确顺序完整的收到所有数据段。第3层网络层,负责路由和选址,确保数据能够按照最优的路径到达目标设备。第2层数据链路层,确保两个直连设备之间正确的传输数据帧以及控制流量,控制流量可以保证对方有时间接收所有的数据帧。第1层物理层,规定使用传输的媒介。规定电波怎么表示二进制等。
形象的比喻,物理层就像快递运输中的货车、公路、汽油等这些东西。数据链路层就好像快递从城市的a网点发往城市的b网点,关键在于直连,也就是说它们在同一片区域下。你的手机到你家的WiFi这一段就可以视为数据链路层,或者路由器到光猫。网络层就相当于导航软件,帮你找到去往目的地的最优路径。剩下的层级在上面已经有了解释,在此就不水字数了。
接下来让我们实际举个例子看看,你要给隔壁城市的女神发微信。首先你发送的内容来到表示层被编码,微信肯定是要把你发送的数据加密的,因此在这一层还会加密,然后你又发了一个巨长的语音,这个时候还会压缩。然后来到绘画层,你的设备与对方设备建立连接会话。数据继续下发,来到传输层,被分割为数据段。微信的信息肯定使用可靠传输,所以会选择TCP,接下来开始发送数据段。第1个数据段来到网络层,你的设备通过设备中的路由表,选择了就近的设备有可能是你家的WiFi。然后这个数据段下发到数据链路层,被封装成帧,向着WiFi进发。你家的WiFi收到了这个数据段,把它解包到网络层看了一眼它的目的地,又从 WiFi自己的路由表里找到了就近的设备,有可能就是你家的光猫。然后这个数据段又被下发到链路层,封装成帧,发送至光猫。接下来就是熟悉的过程,顺着光纤来到光纤盒。通过光缆来到机房,又在区域路由器被还原为网络层。然后继续查表,继续发送,一直重复这个步骤。只要记住数据段来到路由设备就会还原成网络层,路由设备再根据数据段头部的目的地地址,找到最近的设备。然后再把它还原到数据帧向着最近的设备发送。
接收端收到了传过来的数据,是这么还原的。它会反向操作,也就是从物理层一级一级的向上传数据,直到应用层。为什么要这么复杂呢?不能一步到位呢?我之前没有提到过,其实在发送的时候,数据从应用层往下走的时候,每一层都会在发送的数据前面加上头。来到表示层,可能会有表示头,传输层会有传输头,数据链路层还有帧头等等。接收方也需要把这些头部去掉,所以会把传过来的数据自底向上,一层一层的过滤,主要目的就是去掉头部。而且当数据走到接收方的传输层的时候,传输层还会向发送方确定数据已收到,这是对于可靠传输TCP而言的。
还记得吗?我前面说了这些大数据会被分块,因此待接收方收到所有的数据段之后,进行组装,这才形成了最终的数据包。
从我上面的描述,大家有可能会这么认为,OSI 是串行工作的,它会把一个数据段1层1层的下发,直到下发到最底层发出去,才会处理第2段数据。实际这是不对的,每一层都在不停的工作,他们是并行的,就像流水线上的工人一样。轮胎布不停的在制造轮胎,在此同时,玻璃部门在不停的生产车窗。同一时刻,组装部门又在不停的把送过来的零件组装成汽车。OSI 也是这么工作的,网络层处理第一数据段的时候,传输层已经开始准备下发第2个数据段了。同一时刻表示层有可能正在加密新的数据。这样做的好处就是节省时间,大家不妨想一下,如果是串行的话,只有一个数据段发出去才处理第2个,那速度很慢。如果同时处理的话,速度便会提高上来。因为串行处理的时候,肯定有很多层在某一时刻是空闲的。但并行处理的话,每一层都不会闲着。
不知道大家发现没有OSI的每一层,好像都在与对方对应的一层交流。数据链路层就对着对方的数据链路层,它们两个负责交换数据帧以及判断是否损坏。传输层的这种交流的感觉更明显,发送方的传输层要确保接收方的传输层,发送回确认收到,或者是没有确认收到的信息。兜兜转转,我们就会发现真的不存在某一层和对方的其他层产生联系,譬如我方的表示层可以与对方的数据链路层说话。
所以问题来了,为什么发送方的某层级,只能对接收方的对应层级交流呢?我个人感觉其实就是职责分离,我不是说过吗?层级与层级之间互不干涉,每一层只做每一层的工作。所以工作相同的层级,自然会产生联系,而工作职责不同的层级也无法互相交流。
写了这么多,本篇帖子也要接近尾声了。最后再讲讲物理层究竟是怎么表示二进制的!
电磁波可以根据发送电压的高低来定义二进制的0和1。比如电压高于多少伏代表1,电压低于多少伏代表0。所以在物理层面,高低电压的不断组合,就代表了二进制的组合。接收设备接收到了高低不同的电压组合,把它们翻译到数字信号,也就是我们见到的零和一了。而用电压代表0和1的信号叫模拟信号,翻译之后变成了数字信号,这个翻译的过程叫模数转换。
本篇帖子到这里就完全结束了,感谢大家的观看,我们下期再见。
其实可以一边看这个,一边看官方资料,互相佐证,官方资料会更准确,更系统,我这都是自身的理解总结的。有的也是一些错误
当然发出来,如果能帮助到大家也更好,哈哈