模型&协议
在互联网发展的早期,不同的计算机厂商有不同的网络传输协议,例如:IBM的SNA协议、苹果的AppleTalk协议等,这些协议互不兼容,导致虽然不同的产商计算机在物理层面是链接的,但是在网络上基本无法完成正常通信。这就导致一个用户如果使用了某个厂商的某个网络产品,就得用这个厂商的相关的网络产品。如果厂商更换协议或者停产或者更换厂商的设备,那么就要换掉整套网络设备。
协议
上述的情况明显不利于行业的发展,于是开始有公司和组织开始研究基于异构机型的网络通信技术。但是在使用不同的CPU、OS、网络部件差异化计算机上去使用同一套技术实现明显是不现实的。那么假设不规定具体的技术,而是事先形成某种“约定”,不同的厂商只要使用自己的技术按照“约定”实现相应的功能即可。这种”“约定”我们称作协议,协议规定了某项技术需要遵守的规则,在计算机网络中,主要是规定了数据格式化和处理的规则。例如分组交换协议,就是规定了传输过程中被分割的数据包的报文头部应该写入哪些信息和这些信息应该如何处理等。
协议的重要性
协议的重要性不言而喻,计算机与人不同,我们用不同的语言沟通的过程中可以自行将对方的语言(假如了解对方的语言)翻译成自己能够理解的内容,但对于计算机来说,数据从物理层捕获到电信号/数据信号到应用程序,需要经过事先定义的好的规则层层转码才能得到,计算机的各个组件需要严格遵守规则才能完成通讯。因此不同格式的数据对于计算机来说就是无法理解的语言(就像各地的方言)而网络通信协议则是规定了计算机通信的规则(就像大家都用普通话)。根据协议来设计和开发计算机软硬件就可以实现差异化产品的通讯。
模型
模型就是对现实或虚拟的事物的逻辑抽象,用规范、简化的模式来描述某个事物。放到网络通信中,模型就是用来描述计算机网络数据传输和格式化的逻辑抽象。模型定义了标准的框架,描述了整个通信的过程,定了通信过程的标准和规范。
协议就是实现模型的具体规则,针对模型各部分的功能,详细的描述了数据的顺序、格式、错误处理等等的内容,即描述了实现的规则,又保证了有效性和可靠性。
而模型则是为设计协议提供了指导原则,模型提供了框架和原则,让协议设计者可以设计出符合规范和标准的协议。
OSI模型
为了解决差异化计算机间通讯的标准化问题,ISO(国际标准化组织)制定了OSI(Open Systems Interconnection)开放式通信系统互联参考模型,基于该模型定义的OSI协议虽然并没有得到很好的普及,但是该模型却用于后续的很多网络协议的制定中。
OSI模型将整个计算机网络体系划分为7层架构:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层,层级上下级关系如下:
分层的逻辑
网络通信过程是一个很复杂的过程,OSI模型将负责的过程整理成抽象的易于理解的7层模型。对网络通信中的必要功能做了归纳和分类,总结出各层的作用和层与层之间的关系。
按照OSI模型,通信的双方中的发送方将数据交接给最高处,然后层层下发,下发的过程中每层会根据自己的需求对数据进行加工,直到最下层,然后通过物理链路传递到接收方,接收方会按相反的方向从最底层层层解码将数据传递到最高处,最终传递给目标应用程序。大致的流程如下:
需要注意的是:模型总结了各层的作用和交互的逻辑,但并没有对协议的细节和相关的接口做详细的定义,它是一个概念上的抽象,并不是具体的实现。
分层说明
应用层
这一层主要是为应用程序提供接口使得应用程序可以实现联网,同时也规定了数据格式和传输交互的规则。需要注意的在模型中,应用程序本身并不存在应用层中,在系统模型来看应用层可以看做是计算机系统的网络模块中一层,应用程序想要处理远程的资源,就必须与应用层“对接”。“对接”主要就是应用程序使用应用层协议来实现网络通讯和数据交互。但是前面也说过协议只是一些规范,所以在实际的实现中,一般应用程序会内置相应协议的实现。应用程序与应用层的关系可以说是实现与规范的关系。
表示层
主要负责数据格式转换,将上层的数据转换成可以传输的格式,或者将下层的数据转换成上层可以理解的数据。这一层的作用是将数据标准化,因为不同的设备对于同一段数据流的解析结果可能会不一样。同时也是会对数据进行压缩和加密,减少包大小同时保证传输的安全性。
会话层
负责建立、断开、管理网络应用之间的会话连接,连接建立后,会按照应用间的约定来收发数据。这里会对数据进行分割和处理,增加顺序标识,处理数据错误。确保数据能够正确的传输和接收。
这里建立的是上层应用程序间(细分应该是对应的应用进程间)的通道。但是会话层只是管理何时建立链接、何时发送数据、如何处理数据等问题,它不具备实际的传输能力。所以会话层还是要依赖下面的层完成真实的数据传输。
传输层
顾名思义,负责传输的,传输层会在通信双方建立逻辑上的通信连接(传输层也不会执行真正的数据传输,主要是负责建立节点间的连接关系),并且管理整个传输的过程。管理的方式包括:
- 数据分割,会将从会话层接受到数据包(数据分段),切割成合适的大小,增加顺序标记和校验信息
- 确保数据正确传递,当数据传输失败时,会负责重发
- 流量控制,不会一次性发送所有数据,根据具体的算法或协议来实现流量控制,避免网络拥堵
- 反向解包,接收到对方的数据后会反向解码,并传递给会话层
网络层
传输层建立了逻辑上的链接,实际上将数据传输给对端的处理是由网络层来完成的。网络层负责数据的路由和发送。在通信的两个主机之间可能会存在多个网络,网络层会负责寻址,并找出连通两端的最佳路径,因此在数据在这一层会再次打包并增加源地址和目标地址信息(地址是唯一的,现在基本都是IP地址),确保数据准确的传输到目标主机。
这里简要的说下路由的逻辑,路由寻址这个事情是发生在传输的过程中的,在整个网络中存在大量的路由器,路由器中存放有路由表,路由表会记录该路由所能抵达的所有目标的信息,路由表的一条信息包括以下内容:
- 目标地址,最终可以抵达的目标
- 下一跳的路由地址,加入路由链路是A->B->C,从A到C,中间需要经过B,B即为下一跳的路由
- 数据接口,数据从哪个接口出去,方便到达下一跳
- 优先级,路径的优先级,以便选择最优的路径
整个路由的过程并不是通过一个网络层完成的,而是整个网络中的多个设备多个网络层完成的。
数据链路层
数据链路层负责相邻的节点间的数据传输,这里相邻的节点指的是物理上相互链接的两端。这一层主要负责将网络层传下来的数据封装成数据帧,并添加帧头帧尾,用于标识帧的起始和结束,同时会进行错误检查,提供稳定可靠的传输。
物理层
物理层是网络通信的基础,负责将数据(比特流)转换成电信号或者光信号,通过物理介质(电缆、光缆等)将信号传给接收方,同时也接受对方传输过来的信号,并将其转回数据。
TCP/IP模型
TCP/IP是目前使用最流行最广泛的协议,TCP/IP协议是一系列的协议,制定了从物理层面到应用层面的一系列的规范。
模型协议与OSI模型对比如下:
明显,相较于OSI模型,TCP/IP模型简化了一些,但是不同的是OSI是先有模型再制定协议,TCP/IP则是先有基础协议再出的参考模型。
分层说明
应用层
TCP/IP的应用层等于将OSI的上三层应用层、表示层、会话层合并。根据对应的协议可以看出来,在实际的实现中,TCP/IP的应用程序在实现协议的时候都会把OSI这三层的功能都实现了。
还是以浏览器(现在所有浏览器都支持TCP/IP协议)为例,浏览器在模型中就是典型的应用层。与OSI的层级对照如下:
- 应用层:浏览器本身就是一个应用程序,会为用户展示数据,其中的网络模块提供了网络接口确保联网的能力
- 表示层:网络模块在传输时也会对数据进行加工
- 会话层:浏览器也负责与Web服务器建立连接,并在连接上进行数据传输和交互
传输层
功能与OSI的传输层一致,TCP/IP主要是两个协议:传输控制协议(TCP)和用户数据报协议(UDP),这一层负责让应用程序之间实现通信。在一台电脑中,可能同时存在多个需要通信的程序,这里会使用端口来识别程序。
网络层
功能与OSI的网络层一致,TCP/IP模型这里使用的是IP协议,IP协议本质就是基于IP地址转发分包数据。基于IP协议,在网络中的每个主机都会有一个唯一的IP作为主机的标识,通过IP相互通信的双方就可以实现可靠的通信。路由的逻辑前面说了就不再赘述了。
网络访问层
网络访问层是TCP/IP模型的底层,这里大致可以分为两部分,一部分是最底层硬件,另一部分则是网络的接口,主要负责与硬件交互(例如网卡的驱动程序)。这一层的协议主要是ARP和RARP,但这两个协议其实作用于网络层和网络访问层之间,因为这两个协议的作用就是允许IP和MAC地址能够互相转换。所以准确的说TCP/IP并没有规范这一层的实现,由参与互联的各个主机(设备)按照自己的协议自行实现,然后再与TCP/IP的网络层对接。
我看到有一些说法会把这一层分成:数据链路层和物理层,这样分也没问题,因为模型确实没有对这层做特别明确的规范,所以在这里将其放在一起。
示例
还是用浏览器举例子,加入现在浏览器要从服务器加载一个html文件:a.html。大概会经过以下过程:
- 应用层:B/S两端的都是使用HTTP协议,明确传输的数据类型、格式,在通讯过程中服务端会将html文件内容进行转码(例如utf-8编码),浏览器则会将接收到html文件数据转成展示用的数据。此外,浏览器还会请求系统的DNS服务获取目标服务器的IP地址,在通讯时会通过Socket API中的方法将目标地址的IP传给网络层
- 传输层:正常是使用TCP协议,TCP模块会尝试建立链接,以端口号作为应用进程的标识,同时会对从应用层接收到的数据进行加工,添加TCP首部,生成TCP数据包。
- 网络层:IP协议将传输层传入的数据包加上IP首部,首部中会加上应用层传入的I目标IP地址和发送方的IP地址,然后查找路由表,确认下一跳的地址,将这些信息传递给下一层
- 网络访问层:接收网络层的数据后,通过ARP协议将目标IP地址转为MAC地址(如果不确认目标IP地址的MAC地址),然后加工数据添加以太网首部,首部会包含目标MAC地址和发送到MAC地址,最后将数据包传递给物理层传输
包加工过程
以服务端返回的HTML文件为例,包的加工过程如下:
交互过程
从服务端传输HTML文件到浏览器展示,会有一系列的包装转码过程:
协议模型与实现
模型指导协议的设计,协议规范实现的内容。在最终的实现中,实现的核心肯定是按照协议实现对应的接口,同时也会根据真实的情况做很多优化的,例如Chrome增加了TCP链接池来管理TCP通道,在建立TCP链接的时候会尝试复用链接避免重新建立链接的消耗,另外也会对同一目标地址的TCP通道数量做限制,达到额外的流量控制的目的。
OSI VS TCP/IP
从上面的描述已经可以看出这两个模型是有区别的,做个简单的对比:
- OSI是现有模型再设计协议,TCP/IP是先有协议再制定模型
- 两个模型中对于上下层之间的数据处理基本一致
- OSI模型更加抽象更加理论化,划分更加细致,更适合指导协议的设计
- TCP/IP模型更贴近实际的网络通信需求,适合指导对应的应用开发
总结
本文总结了下OSI模型和TCP/IP模型的基础内容,这两个模型描述了网络通信的协议的基础逻辑,了解模型可以帮助我们更好的理解网络协议。