今天,我们详解OSI(Open System Inter-connection Reference Model)模型,来看看工业物联网的网络互联和数据互通。
1984年,国际标准化组织(International Organization for Standardization,ISO)发布了著名的ISO/IEC 7498标准,它定义了网络互联的7层框架,即开放式系统互联参考模型。OSI参考模型将整个网络分为7层,从底层往上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
想理解网络层次,可以看“詹姆斯·F·库罗斯”与“基思·W·罗斯”合著的《计算机网络:自顶向下方法》。
物理层是OSI参考模型的底层,主要作用是利用物理传输介质为数据链路层提供物理连接,以便传输比特流,它规定了网络连接的一些电气特性,负责传送0和1信号,物理介质可以是双绞铜线、同轴电缆、多模光纤、无线信道如Wi-Fi、蜂窝等。
数据链路层负责传输电路的0和1信号,由于单纯的数字0和1缺乏实际含义,因此要定义解读方式:多少个0和1为一组,每个信号代表什么含义。这就是链路层的作用,它在物理层之上,将比特组合成字节,进而拼接成帧,确定0和1的分组方式,一个报文帧由若干首部字段和数据字段构成。
成帧功能之外,链路层的作用还包括链路接入、差错检测和纠正、可靠交付。链路接入规定介质访问控制机制,例如采用总线拓扑时,确保同一时刻只能有一个节点向总线发送数据,避免发生冲突。
以太网802.3、无线局域网802.11都属于数据链路层协议,其链路接入机制为大家所熟知的介质访问控制(Media Access Control,MAC)协议。以太网规定接入网络的所有设备须具有“网卡”接口,网卡的身份信息由MAC地址标识,全球唯一,MAC地址长度为6个字节,例如C1:63:9C:1D:6A:D1。
差错检测和纠正指链路层基于硬件电路对传输数据进行校验,信号衰减和电磁噪声干扰导致数据帧中某个值为1的比特在接收方被错误地识别为0,而链路层具有发现错误的能力,必要时还能够纠正错误。可靠交付指链路层通过确认和重传机制保证数据无差错地移动,可靠交付服务通常应用于高差错率的链路,例如无线链路,而对于低比特差错率的链路如有线连接,可靠交付被认为是非必要的,为了减少开销,有些链路层将不提供可靠交付服务。
网络层和传输层以TCP/IP为例进行说明。在以太网构建的网络中,不同的计算机直接通过MAC地址相互识别并交换数据,这在一个小局域网内完全没有问题。假如世界上所有计算机都基于MAC地址识别和交换数据,此时就变得非常困难了,因为MAC地址没有分组的概念,通过MAC地址无法知道计算机是否属于同一个子网络。所有的计算机如果连接在一起,彼此之间要相互通信,不可能采用点对点的方式进行,需要引入网络拓扑,例如树形拓扑。相距较远的两台计算机之间通信时,须在整个网络拓扑中为它们规划一条路径,在树形拓扑中则涉及一级一级向上追溯,最后规划出最优路径。
网络层代表协议——IP引进了一套新的地址体系,使得计算机及网络设备能够快速区分计算机是否属于同一个子网。例如192.168.43.193和192.168.43.22属于同一个子网,192.168.43.193和192.168.22.17则不在同一个子网(如果子网掩码为255.255.255.0),通过IP地址很好识别。网络设备将根据IP地址快速规划出路径,同一个子网内的对话只需基于MAC地址转发,使用交换机网络设备。不在同一个子网的计算机,须通过路由器网络设备将数据转发出去,路由器具备跨网段的数据转发能力。网络层基于逻辑地址寻址,实现网络路径规划,而数据链路层基于硬件地址寻址。
传输层定义传输数据的协议端口号以及流控和差错校验。有了MAC地址和IP地址,互联网上的任意两台主机之间就能够建立通信了。接下来的问题是,同一台主机上多个应用程序(不同进程)都需要网络访问时,该如何区分数据包是发送给了哪个应用程序呢?传输层建立了端口到端口之间的通信,它通过端口号区分不同的应用程序,例如访问地址http://10.207.228.51:9093,其中9093表示端口号。作为比对,网络层则是建立主机到主机的通信。TCP和UDP是应用最广泛的传输层协议,TCP基于握手连接,发出的数据包要求收方回复确认,UDP则类似于广播,无须建立连接,也无须收方应答,UDP效率高,TCP则更可靠。传输层协议发送数据包时会添加校验信息,接收方使用校验信息检查该报文是否出现差错。
会话层和表示层中的“会话”是两个应用程序进程之间的逻辑连接,两个应用程序之间基于此逻辑连接在一定的时间内交换数据,会话层用于建立、管理和终止会话。表示层用于处理交换信息的表示方式,包括数据格式交换、加密与解密、压缩。会话层的功能可能在传输层就实现了,例如TCP可以管理连接。由于表示层可以合并到应用层中,由应用层负责数据的解析,因此对会话层和表示层的讨论并不多。
应用层收到传输层的数据,接下来要进行解析。由于网络数据来源五花八门,须事先约定好格式,因此应用层规定了应用程序的数据格式。举个例子,TCP为各种应用层传输数据,比如HTTP、SMTP、FTP等,它们都有各自的一套协议规则,分别定义了网页、电子邮件、文件传输时的数据格式,这些均属于应用层范畴,应用层是OSI参考模型的最高一层,直接面向用户。
接下来通过以太网加TCP/IP,将数据在网络各层的流动串联起来。如下图,主机A打算发一段文本消息给主机B,此文本为网络传输的有效数据载荷。
通过数据链路层完成最后封装的报文帧格式如图:
假如主机A和主机B不在同一个子网内,主机A通过交换机连接它所在的局域网,交换机工作在OSI参考模型的第二层——基于MAC地址转发消息,它在数据链路层将报文帧的以太网帧头部分解析出来,获得目标机的MAC地址。由于交换机发现目标机和主机A不在同一个子网内,因此交换机将此报文帧重新封好并转发到它的一个输出端口,所有跨网段的报文帧都将转发到这个输出端口,这个输出端口与路由器相连,路由器工作在OSI参考模型的第三层——基于IP地址转发消息,它在网络层将报文帧的IP头部解析出来,获得目标机的IP地址,路由器通过IP地址判断此报文帧应通过某个端口转发给主机B,报文到达主机B时,主机B的接收过程是从物理层开始,通过一层层解析,最后在应用层收到主机A发送的文本消息。
网络为什么要分层呢?分层的目的在于利用层次结构把开放系统的信息交换问题分解到一系列可以控制的软硬件模块中,把大问题分割成多个小问题,每一层可根据需要独立修改或者进行功能扩充,易于实现标准化。如果某一层发生了变化,只要其接口不变,就不会对其他层造成影响,这有利于不同制造厂家的设备互连。
最终用户只关心应用层,其他层如何实现对用户而言并不重要。由于各层之间相互独立,因此高层无须知道底层功能的具体实现,定义好接口,高层即可复用底层提供的服务。