协议分层
对于网络协议来说,往往分成几个层次进行定义.
网络通信的过程中,需要涉及到的细节,其实非常多.如果要有一个协议来完成网络通信,就需要约定好方方面面的内容,导致非常复杂. 而如果拆分的话,就十分复杂,庞大,因此需要分层.
什么是协议分层
即只有相邻的层次可以沟通,不能跨层次调用.
协议分层类似于打电话时,定义不同层次的协议:
某一层的协议替换之后,对于其它层没有影响
在这个例子中,我们的协议只有两层;但实际的网络通信会更加复杂,需要分更多的层次.
分层的作用
为什么需要网络协议的分层?
分层最大的好处,类似于面向接口编程:定义好两层间的接口规范,让双方遵循这个规范来对接
在代码中,类似定义好一个接口,一方为接口的实现类(提供方,提供服务),一方为接口的使用类(使用方,使用服务):
对于使用方来说,并不关心提供方是如何实现的,只需要使用接口即可.
对于提供方来说,利用封装的特性,隐藏实现的细节,只需要开放接口即可.
上层协议直接使用下层协议即可,不需要了解下层协议的细节.(相当于下层协议把细节封装好了).
这样就能很好的扩展和维护,如下图:
OSI七层模型
OSI:即Open System Interconnection,开放系统互连.
OSI七层网络模型是一个逻辑上的定义和规范:把网络从逻辑上分为了七层.
OSI七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;
OSI:七层模型划分为以下七层:
OSI七层模型既复杂又不实用:所以OSI七层模型没有落地,实现.
实际组件网络时,只是以OSI七层模型设计中的部分分层,也即是以下TCP/IP五层(或四层)模型来实现.
TCP/IP五层(或四层)模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
应用层:负责应用程序间的沟通,如简单电子邮件传输,文件传输协议,网络远程访问协议等.我们的网络编程主要就是针对应用层.(程序拿到数据之后,要用来干啥,解决什么问题)
传输层:负责两台主机之间的数据传输.如传输控制协议,能够确保数据可靠的从源主机发送到目的主机.(负责关注网络数据的起点和终点(从哪里来到哪里去),端与端的运输).
网络层:负责地址管理和路由选择.例如在IP协议中,通过IP地址来标识一台主机,并通过路由表的方式规划出两台主机之间的数据传输的线路(路由).路由器工作在网络层.
数据链路层:负责设备之间的数据帧的传送和识别.例如网卡设备的驱动,帧同步(就是说从网线上检测到什么作为新的帧的开始),冲突检测(如果检测到冲突就自动重发),数据差错校验等工作.有以太网,令牌环网,无线LAN等标准.交换机工作在数据链路层.(负责两个相邻结点的运输)
物理层:负责光/电信号的传递方式.比如现在的以太网通用的网线,早期以太网采用的同轴线缆(现在主要用于有线电视),光纤,现在的wifi无线网使用电磁波都属于物理层的概念.物理层的能力决定了最大传输速率,传输距离,抗干扰性.集线器工作在物理层.(通信过程之间的物理措施)
说是五层,实际上下面都是在操作系统内核,硬件,驱动程序中已经实现了的(计算机内置的).作为程序员,在网络编程中影响到的只有应用层.
网络设备所在分层
对于一台主机,它的操作系统内核实现了从传输层到物理层的内容,也即是TCP/IP五层模型中的下四层.
对于一台路由器,它实现了从网络层到物理层,也即是TCP/IP五层模型的下三层;
对于一台交换机,它实现了从数据链路层到物理层,也即是TCP/IP模型的下两层;
对于集线器,它只实现了物理层.
注意这里说的是传统意义上的交换机和路由器,也称为二层交换机(工作在TCP/IP五层模型的下两层),三层路由器(工作在TCP/IP五层模型的下三层).
随着现在网络技术的不断发展,也出现了很多3层或者4层交换机,4层路由器.
网络分层对应
网络数据传输时,经过不同的网络结点(主机,路由器)时,网络分层需要对应.
以下为同一个网段中两台主机进行文件传输:
两台计算机通过TCP/IP协议通讯的过程如下图所示:
TCP/IP通讯过程:
以下为跨网段的主机文件传输:数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.
封装和分用
网络传输数据的过程中,最核心的流程.
1.不同协议层对数据包有不同的称谓:包(packet)->IP数据包, 段(segment)->TCP数据段,
报(datagram)->UDP数据报,帧(frame)->以太网数据帧.
2.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装
3.首部信息中包含了一些类似于首部有多长,载荷有多长,上层协议是什么等信息.
4.数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥离出相应的首部,根据首部中的"上层协议字段"将数据交给对应的上层协议处理
下面以A给B通过QQ发送一条"hello"信息来讲解以下具体过程.
封装
1.应用层(应用程序)QQ
QQ从消息输入框中获取到用户输入的hello.就要把这个字符串构造成一个应用层的数据包.QQ这样的程序内部就设置了一个应用层协议,应用层数据包就是按照这个应用层协议约定的格式(字符串拼接)来构造的.
eg:约定格式如下:
应用程序就会调用操作系统的api,把这个数据包交给传输层.
2.传输层
传输层就会把上述数据作为一个整体,再构成一个传输层的数据包.传输层涉及到的协议,最主要的就是TCP/UDP.此时假定使用UDP来通信,就会构成一个UDP的数据包
形如上述,添加报头的过程,就叫做封装,其实就是字符串拼接,不过拼的报头,具有一定结构
拼好传输层数据包之后,就要把这个数据包进一步交给下层,网络层就继续封装了.
交给下层:指的是下层协议提供一组api(函数),上层调用这个api,并且把刚才构造好的数据通过参数传递下去,下层协议就可以处理这个数据了.
UDP报头,虽然不能保护数据,但可以起到贴标签的类似效果.就能承载一些的关键的用来发数据信息.
对于UDP系统,承载的最重要的信息就是源端口和目的端口.
3.网络层(这里涉及到最核心的IP协议)
网络层IP协议就是把刚才的传输层UDP数据包作为一个整体,再拼上IP协议的报头,构成一个IP数据包.
IP协议,相当于整个UDP数据包视为一个整体了.
构造成完整的IP数据包之后,IP协议继续调用链路层的api,把数据再交给链路层这里的协议进行处理.
4.数据链路层(这里涉及到的核心协议-以太网(以太指的是网络传输的介质))
以太网就是目前最常见到的"有线网络",以太网数据帧:也是以一个数据包作为整体,在此基础上加上帧头,帧尾.
5.物理层(硬件设备)
把上述这样的以太网数据帧,二进制结构(一串010101这样的数据),转换成电信号(网线)/光信号(光纤)/电磁波(无线wifi)进行发送.
分用
暂时不考虑中间过程,假定数据包已经到达B的网卡了,B如何处理,B的处理过程,就称为分网
1.B的物理层收到了光信号/电信号/电磁波,就会把这些物理信号转换为数字信号(二进制0101)
得到一个以太网数据帧,进一步将数据帧交给数字链路层处理.
2.数据链路层,以太网(发送方和接收方一样的协议才行).按照以太网数据帧的格式来解析,取出其中的载荷,再交给上层协议.
3.网络层IP协议:按照IP协议的格式进行解析,取出其中的载荷,再交给上层协议.
4.传输层UDP协议:按照UDP协议的格式进行解析,取出其中的载荷,再交给上层协议.
5.应用层QQ程序:按照QQ应用程序的应用层协议格式解析数据.
分用过程,就是逆向的封装过程.
中间传输
真实情况下,两个主机一般不太会通过网线直连的.而是通过一系列的交换机或者路由器进行数据转发的.
但是实际上,即使是经过交换机或者路由器,上述封装分用的过程,也是同样适用的.只不过,分装分用的程度不一定是要到应用层(5层都有)
经典交换机来说,就需要封装分用到链路层即可
经典路由器来说,只需要封装分用到网络层即可.
取上图一个节点来说,
假设是交换机:
交换机就会把上述广电信号转换为以太网数据帧二进制数据,交给数据链路.
交换机的数据链路层就会对上述数据进行解析.
这个解析过程,一方面要取出载荷部分,另一方面,就要解析到帧头中的关键信息.
根据帧头中的信息,决定下一步把数据往哪里发送.根据这个情况进一步构造出新的以太网数据帧.
把这个数据通过物理层发送出去.
如果是路由器的话:
情况就要更加复杂.封装分用到网络层,先是物理层拿到光电信号,转换成二进制数据交给数据链路层.
数据链路层对上述数据进行解析,拿到载荷,交给网络层-IP协议.IP协议又会进一步对这个数据进行解析,取出载荷,当然也要解析这里的报头.
路由器需要通过IP报头中的目的IP来知道具体接下来应该如何转发.
取出的数据,IP协议重新进行封装.
继续交给数据链路层,继续加上帧头和帧尾.再交给物理层,转成光电信号,继续传输.