一、前言
OSI七层模型是我们耳熟能详的,其实没有太多可以说的地方,我这里就按自己的理解做一下汇总。
二、OSI 七层模型
OSI七层模型是由“国际标准化组织”制定的“参考”模型。
1、物理层
实际上就是对网线、光纤等“连接”介质进行规定,比如我们拆开一根网线会发现它其实是由8根细线组成的,生产网线时大家都要按一定规范来,比如这些细线在水晶头中的顺序就很重要,如果你打线的时候搞错了线序那网络自然是不会通的。
物理层比较有名的协议就是RJ45,有些场景下我们直接就说这个网络设备是RJ45接口或者用RJ45线,其实就是说这个设备是电口的,插普通的网线。
2、数据链路层
要说清楚数据链路层不太容易,比较直观的来说,交换机工作在二层,这个二层就是数据链路层。我们再回忆一下交换机的功能“在网络内无差别的传递数据”,这里的重点除了将数据从交换机的E0/0/1端口传递到E0/0/2端口外,还需要将数据从A交换机的E0/0/1传递到B交换机的E0/0/1端口,数据链路层就是负责将数据这样递来递去。
要实现这一系列的“递来递去”可不容易,其实是有一系列规范的,这里最麻烦的是不同品牌交换机之间、交换机和路由器之间、不同品牌路由器之间如何传递数据。这里需要注意,虽然路由器是工作在三层,但设备与设备间的直连通信还是基于二层协议的。如果大家都遵循一样的约定,实现数据的互通也就可行了。
数据链路层的协议主要就是解决如何将数据从一台设备传递到另一台这个问题,考虑下面这样的连接,两台交换机通过一根网线连接。
如果有一些电路知识,就晓得信息的传输其实是通过电信号的高低来传递的,比如:
二进制数:0 1 0 1 1 0 0 1
电信号:低 高 低 高 高 低 低 高
十进制数: 89
(1)比特流的传输
我们可以规定高电平就是1,低电平是0,并约定好每间隔1秒钟发送一次信号。怎么理解呢?比如第1秒我观察发现电路中的电压是低电平,就知道第一个信号是0,第2秒我观察发现电路中的电压是高电平,就知道第二个信号是1,依次类推经过8秒后,我们就从A交换机将数据“0 1 0 1 1 0 0 1”传递到了B交换机,不过真实情况下1秒钟的间隔时间就太长了。
举例来说,对于百兆端口,其含义是每秒可以传输100兆个bit数据,1兆等于1万亿,所以100兆就是一百万亿个bit数据,前面我们举例的01011001就是一个8bit的数据。
换一个视角,发送数据的交换机会每隔一百万亿分之一秒的速度来决定是发高电平还是低电平,而接收数据的交换机也会每隔一百万亿分之一秒的速度来观察电路上的电压信号,如果是高电平就是1,低电平就是0。换句话说,如果交换机能够以更快的速度来“观察”电路,则每秒传输的数据量也就越大。但电口交换机基本就被限制在了千兆这个级别,除了交换机的观察速度受限(次要原因),主要原因是从线路上的电压从1切换到0或者从0切换到1其实还是需要时间的,这个时间就限制了端口的传输速率。相应的由于光信号的切换时间更短,所以光口交换机可以做到万兆的速率。
(2)报文的约定
前面我们知道了可以通过网线上的高低电平来传输比特流,比特流也就是一大串01,传递过去以后如果不做新的约定我们还是没法传递有效数据。所以在数据链路层还需要约定“报文”的格式,比如下图这个以太网帧的格式。
在数据链路层大家都约定好特定位置的含义,比如最开头的6个byte含义就是目的设备的MAC地址。不同的协议还有不同的报文约定,交换机要能根据这些约定将长长的比特流完整地转发到目的地址,同时接收和处理数据的设备也要能根据约定将比特流解码成需要的信息或将特定信息封装成特定的报文。
(3)报文校验与重传
前面通过报文格式约定的方式,我们就可以将数据转成报文的形式,并以比特流的形式在网络中传输。但交换机也是可能出错的,比如在传输时某个特定bit的数据本来应该是0结果给传递成了1,那整个数据都错误了。为了避免这种情况,报文在末尾有个FCS字段,其实就是用于校验的,比如将整个报文做特定运算,比如发出报文时我计算的结果是100,我将这个值存到FCS字段,目标拿到报文后重新按特定算法对报文所有数据做一次计算,结果是101,那目标就知道这个报文是有错误的,他会直接丢弃这个错误报文。
在一些协议(比如TCP)中为了确保数据传输的正确性,它没有收到完整的数据时会要求数据源补上缺失的数据,但这是在三层处理了,所以在数据链路层本身并不会做重传,发现有错误的报文直接丢弃而不考虑数据的缺失。
(4)报文的传递
在数据链路层,交换机通过检查报文的“目标MAC”来传递数据。在ARP协议的帮助下,交换机可以获取到达各MAC的路径,从报文中获取目标MAC后,交换机就根据前面提到的“比特流”传输,将比特流传递给下一个交换机,下一个交换机收到比特流后根据报文约定将比特流解析成一个个报文,再从报文中获取目标MAC,如此循环则可以实现报文的传递。
(5)数据链路层总结
前面我们描述的比特流传输、报文约定、报文校验,加起来以及其他物理的、机制的等等约定,全部加起来就是数据链路层了。这些内容整理成册就是协议,一大堆大家都遵循的协议最终就实现了数据的二层交换。
前面物理层的实施主体是网线的生产厂商,数据链路层的实施主体则是交换机的厂商,不同的厂商执行同一个协议和标准,则数据就可以在这些二层设备或端口进行传递了。
3、网络层
网络层也称三层,我们常说路由器就是工作在三层,其最显著特性就是对“IP”的路由。前面数据链路层的目的是实现数据(报文)依据MAC地址可以在交换机和设备间正确的传递,而网络层则是在数据链路层的基础上,依据IP地址在路由器、交换机和设备间正确的传递。
(1)IP报文
下图是IP报文头,其实与数据链路层的逻辑类似,也是大家约定好特定的位置代表特定的含义,在IP报文里目标地址和源地址是IP这样的格式,比如192.168.1.1,而前面二层的报文目标地址和源地址是MAC地址。
(2)IP报文在二层的传递
先不说我要IP报文实现什么功能,现在IP报文要想通过交换机传递该怎么做?毕竟没有MAC地址在里面啊,目标都找不到。办法简单,像下面这样,只需要将三层报文放到二层报文的“内容”里就可以了,感觉上就是在三层报文的前面加一个二层的头。
如此就可以确保IP报文在交换机中的传递了。
(3)网络层的功能实现
在网络层,主要目的还是实现数据的传递,跟数据链路层差不多,但区别在于需要使用路由器基于IP地址来传递。路由器与交换机的很大区别就是它需要先有一张路由表,然后再根据这张表去传递数据,维护这张表是非常重要的,比如OSPF协议生成动态路由,或者可以手写静态路由。对于交换机它其实也有一张MAC地址表,主要是通过ARP协议来生产,但并不是先有表再传递数据,而是在需要传递数据时按需去生产MAC地址表。所以相对来说MAC地址表的生命周期比较短,而且并不全,交换机只需要关注当前目标MAC地址该如何到达即可,但又比较实时便于网络中设备的随时接入和离开。相对应的路由器就没那么方便了,每次网络的变动都可能会导致网络产生波动,而且每个路由器都必须具备全网的路由信息,否则数据无法通达。
由于有数据链路层实现了底层的数据传递(MAC到MAC),路由器主要工作还是将收到的报文根据目的IP传递到正确的端口,剩下的工作则由数据链路层(交换机)继续完成。像下图这个网络结构,PC1的数据要传递到PC2,前提是R1和R2中有正确的路由表,在这个前提下报文要分5个步骤到达目标。
- 当PC1需要将数据发给PC2时,它先将数据包装成三层的报文,里面有目的IP。但是网卡会发现目标IP与自己不在一个网段,于是它选择将数据交给“网关”192.168.1.254。但它并不知道网关在哪里,交换机LSW1也不知道,于是PC1的网卡会先广播ARP报文来获取192.168.1.254的地址同时生成ARP表来指明如何到达网关,同时交换机SW1也能生成相应的MAC地址表来指明192.168.1.254的位置。在这两个表的基础上,数据就可以在数据链路层协议(比特流、报文)下从PC1途径LSW1到达AR1。在传递过程中网卡会在三层报文前加一个二层的报文头将其包装成二层的报文,于是LSW1可以依据二层报文的目标MAC地址传递这个报文。
- AR1在收到二层报文后,会先将二层报文的头去掉得到三层报文,它通过目标IP和自己的路由表,得知下一跳的IP是192.168.2.2,但同样的它也不知道192.168.2.2具体在哪里,LSW2也不知道,所以路由器AR1一样会广播ARP报文来生成ARP表,同时LSW2会生成MAC地址表,于是到达192.168.2.2的二层路径就通了。AR1同样在进行二层传递时也需要先包装一个二层的报文头,LSW2根据二层的MAC地址传递数据。
- AR2在收到数据后也是先将二层报文头去掉,它查看目标IP后会发现目标与自己的直连网络就在一个网段,但具体位置还是不知道,没得说它还是先发个ARP广播,于是AR2得到ARP表,LSW3得到MAC地址表,二层路径再次打通,数据可以顺利到达PC2了。
(4)网络层回顾
回顾一下,其实网络层需要基于数据链路层,网络层只是负责了“路由”部分,实际数据的传递还是基于数据链路层。在数据链路层中,ARP协议非常重要,是底层“寻路”的基础,而寻路原理也非常简单,就是发广播去挨个问“XXX你在那”。
相对来说网络层的“路由”则是事先设定好的,所有路由器都必须事先知道网络中其他网段该如何到达
此外,网络层除了“路由”协议之外,还有生成路由和维护路由表的协议,另外再加上关于三层报文的约定,所有这些协议组成了网络层。
4、传输层
前面物理层、数据链路层、网络层已经实现了数据在网络中的传输,但这种传输只是能够通达而已,比如将砖块从厂里搬到院子,如果砖块是数据,公路、红绿灯和小汽车是物理层,地图是网络层,小汽车沿着公路和地图到了你家院子,砖块往地上一扔就完事儿了,具体这砖是谁的他不管了。
传输层主要解决2个问题,一是将数据交付到正确的地方,二是交付的数据不要出错。下图是最典型的传输层协议TCP报文头。
与前面二层三层的报文类似,TCP报文一样是套娃,像下图这样:
(1)端口号
其中源端口号和目标端口号就是用于确保数据可以给到正确的人,可以将应用程序想象成两个要传递数据的人,端口号就是他们的编号。报文里写上编号后,PC在拿到数据后就根据编号将数据给特定的应用程序。对于server端,它会监听特定的端口,client可以向这个端口发数据,在client与server建立连接时PC会随机给client分配一个端口号,如此server端返回数据时也不会找错人了。为啥要编号呢?因为一台PC里肯定不只一个server或一个client,一般十几二十个是正常的,多的可能有几百个,不编号肯定就送错数据了。
(2)序列号与校验位
序列号就是对TCP报文本身进行编号,12345这样。因为一条数据可大可小,如果数据量超过报文最大可携带的数据量,那就需要分批进行传输了。分批好理解,分批为啥又要编号呢,因为远距离传输它并不一定就是12345这样到达的,也有可能23145这样到达,所以必须得有这个序号才能确保接收方可以将数据正确拼接起来。
校验好理解,就是检查你收到的数据和发送方发出的数据是不是一样的。对于TCP协议如果接收到的数据校验不对,就会启动重传机制。最终目的还是要确保数据正确的传递。
(3)传输层回顾
其实传输层已经走到了“底层系统”的最末端了,传输层协议已经需要操作系统来完成,如果是嵌入式系统很可能还得自己来实现。传输层再往上其实就是“应用”的世界了,理论上传输层及传输层往下可以认为是各种设备、硬件、操作系统组成的,在系统应用看来他们是可以直接使用的资源而不需要自己费心去管理或“写代码”。从应用软件的角度来看,传输层就是数据点到点的传输,从网络的角度来看,到传输层任务就结束了。
5、会话层、表示层、应用层
就像前面说的,网络其实到传输层就结束了,再往上的会话层、表示层、应用层的划分感觉就有点狗尾续貂,也难怪在实践中又整了个TCP/IP四层模型将这三层全部归到应用层。所以这里我们也就跳过它们,讲起来也没啥意思,不过是人为臆想的。
6、OSI七层模型回顾
比较重要的有:
1)物理层,定义了线缆、硬件接口等物理的、电器的协议。
2)数据链路层,主要是有ARP协议、交换机、MAC地址
3)网络层,主要是有路由器、动态路由协议、路由表、IP地址
4)传输层,主要是有TCP协议、IP地址、端口号、校验位
5)会话层、表示层、应用层,都可以算到应用里
三、TCP/IP 四层模型
上面这个图其实就很好说明了TCP/IP的层次划分,其实就是将数据链路层和物理层合并叫链路层,将应用层、表示层、会话层合并叫应用层。
TCP/IP模型也是现在实际操作中使用的模型,我们可以再精简一下描述:
1)应用层,就是应用软件
2)传输层,端到端的数据传输,比如TCP协议
3)网络层,IP寻址,也就是依据IP地址来寻找目标的一系列协议
4)链路层,MAC寻址,也就是依据MAC地址来寻找目标的一系列协议
四、总结
对于网络模型还有一定需要注意,那就是下一层提供了接口供上一层使用,所以上层是不需要关心下层的具体实现。比如说,对于应用层的软件,他只需要知道目标IP和端口就可以开始传输数据,而不需要去关心数据是通过那个网络设备通过了那个运营商到达的目标用户。同理,对于传输层,他只需要将数据一股脑交给网卡,剩下的网络自会帮他完成。对于网络层,他只需按路由表将数据往指定端口扔就行了,具体的传输下一层会自动处理。