按照TCP/IP协议由下往上的顺序,今天我们来学习一下数据链路层,数据链路层位于物理层和网络层之间,其设计的初衷就是顺利为网络层提供数据服务,不考虑可靠性,可靠性的部分由传输层的TCP协议实现。我们可以从下面的图中简单地了解一下数据链路层在网络传递中的地位,假设在通信的过程中需要通过路由器的话,那么数据的具体流动过程就像下面图中箭头的示意:
其中路由器负责路由转发,因此需要最高到网络层进行IP协议的分析;我们也可以在逻辑上将整个通信过程看成是两端数据链路层之间点对点的通信:
数据链路的信道主要有两种模式:
1. 点对点信道:这种信道使用一对一的点对点通信方式;
2. 广播信道:这种信道使用一对多的广播通信方式,因此过程比较复杂。
一、点对点的数据链路层
1. 区分“链路”与“数据链路”
之前自己常常说“链路层”,其实链路的真正意思是从一个结点到相邻结点的一段物理线路,其中没有任何其他的交换结点。数据链路则是指在物理线路上添加上控制数据传输的协议的硬件和软件。因此数据链路是比链路更为深刻的内涵。
2. 数据链路层的数据传输单元我们一般称之为帧,数据链路层的任务就是将上层的数据封装成帧交给物理层传输,以及分析物理层提交的数据帧,提取出上层数据交给网络层。具体来说就是:
a. 信源的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧;
b. 信源把封装好的数据帧发送给信宿的数据链路层;
c. 若新宿的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报上交给网络层,否则丢弃这个帧;
3. 数据链路层的三个基本问题
数据链路层的协议有很多种,但有三个基本的问题是共同的,那就是:
封装成帧、透明传输和差错控制。
a. 封装成帧 数据链路层的主要工作是添加一个帧头部和帧尾部,不同的数据链路层协议可能格式不同,但是基本的格式都试类似的:
这里的数据部分,一般有一个最大程度,我们称为MTU,在MAC里一般是1500个字节,后面会详细介绍。这里要说的是,当数据是由可打印的ASC2码组成的文件时,可以使用特殊的帧定字符来标明一个帧的开始和结束。比如使用SOH(Start Of Header)--0x01和EOT(End Of Transmission)--0x04来表示,这样数据链路层就可以识别出帧的开始和结束。
b. 透明传输 如果我们提供任何数据输入,数据链路层都可以成功传递,那么我们称之为透明传输,即数据链路层的功能对于网络层和上层是透明的。比如上例的文本字符数据输入,SOH和EOT都可以很好的工作,因为二者没有交集。但是对于二进制数据输入来说,就有可能在数据中出现0x01和0x04,导致帧意外地中断和丢弃。因此,我们需要一种机制来处理这种情况,最经典、最常用的就是
字节填充的方式,比如在SOH和EOT的前面分别插入一个转义字符ESC-0x1B,在接收端的数据链路层在将数据送往网络层之前删除这个插入的转义字符,这就叫做字符填充。
c. 错误检测
现实的通信链路都不会是理想的,这就是说,传输过程中有可能1变成0,0变成1,这种情况就叫做比特差错。数据链路层提供了循环冗余检验CRC方法来检测比特差错,其主要使用了帧检验序列FCS来检测比特错误。发送数据前先计算帧的数据部分得出FCS添加在数据部分后,接收端收到数据后添加上FCS后计算验证。
需要注意的是数据链路层并没有向网络层提供可靠传输服务,传输差错一类是比特差错,还有一类是帧丢失、帧重复或帧失序。完整的传输错误控制是在TCP中实现的。
4. 点对点协议PPP
现在使用最为广泛的就是PPP(Point-to-Point Protocol)协议,其主要负责用户计算机到ISP进行通信时所使用的数据链路层协议:
a. PPP协议的特点
-1. 简单:PPP的首要需求就是“简单”,不需要考虑纠错、序号,这提供了很好的互操作性;
-2. 封装成帧:PPP协议必须定义帧界定字符
-3. 透明传输
-4. 多种网络层协议:PPP协议必须能够支持多种网络层协议,如IP、IPX等;
-5. 多种类型链路:支持串行/并行、同步/异步等;
***4/5其实是说PPP要对上对下都有很好的支持兼容性***
-6. 差错控制
-7 检测连接状态:PPP协议要具有一种机制能够及时(不超过几分钟)自动检测链路是否处于正常工作状态,当出现故障的链路隔了一段时间后重新恢复正常工作时,就特别需要有这种及时检测功能。
-8 最大传送单元MTU
-9 网络层地址协商
-10 数据压缩协商
不需要考虑纠错、流量控制、序号、多点线路和半双工或单工链路,PPP只支持全双工链路。
b. PPP的帧格式
在继续学习PPP之前,先来看看PPP协议的帧格式吧!
其中PPP协议的帧界定字符由F-0x7E表示,A和C作为地址字段和控制字段,现在已经没有实际意义。首部的两个字节的协议字段指明数据中的协议类型,0x0021-IP数据报;0xC021-LCP数据;0x8021-NCP数据等。
为了实现透明传输,我们依然要使用字节填充的方法,只不过对于同步和异步传输方式不同。对于异步传输来说,我们还是使用一个转义字符0x7D来进行;对于异步传输,由于是连续的比特流,我们使用零比特填充法,即每连续出现6个比特-1则添入一个比特-0,避免出现‘F‘,即
c. PPP协议的组成
PPP协议主要分为三个部分:
-1. 将IP数据报封装到串行链路的办法,因为计算机内的I/O通信是并行的,而链路传输则是按比特流的串行,因此需要协议的封装转换,一般由网络适配器完成;
-2. 一个用来建立、配置和测试数据链路连接的链路控制协议LCP(Link Control Protocol),通信双方可以协商一些选项;
-3. 一套网络控制协议NCP(Network Control Protocol),用于支持上层的不同的网络协议;
PPP协议的工作状态起止于链路静止状态,这时在用户PC机和ISP的路由器之间并不存在物理层的连接。整个过程如图:
一个正常的工作过程开始于用户通过选择网络连接的选项,然后用户的PC机通过调制解调器呼叫路由器,路由器就能够检测到调制解调器发出的载波信号,在双方建立了物理层的连接之后,PPP协议就进入“链路建立”状态,其目的是建立链路层的LCP连接。
此时LCP开始发送配置请求帧,进行协商一些配置选项,包括链路上的最大帧长、所使用的鉴别协议,以及不适用的PPP帧中的地址和控制字段等。LCP的配置请求帧依旧是一个PPP帧,其协议字段置为LCP对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:
-配置确认帧:所有选项都接受;
-配置否认帧:所有选项都理解但不能接受;
-配置拒绝帧:选项有的无法识别或不能接受,需要协商;
协商结束后双方建立了LCP链路,接着就进入鉴别阶段,在这一状态下,只允许传送LCP协议的分组、鉴别协议的分组以及监测链路质量的分组。若鉴别失败,则转到“链路终止”状态,成功则进入“网络层协议”状态。
在“网络层协议”状态,PPP链路两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组,总之也许PPP协议两端的网络层可能运行不同的网络层协议,但是都可以使用一个PPP协议进行通信。
二、使用广播信道的以太网。
这里我们主要来看看局域网的相关技术。由于以太网已经是事实上的局域网标准,我们就主要介绍以太网。广播网络的一个重要问题时当所有结点共享通信链路时,如何避免冲突,一般有随机接入和受控接入两种。实际中我们更多的使用是随机接入,因此重点来介绍前者。这里的核心只有一个:CSMA/CD。
CSMA/CD,即载波监听多点接入/碰撞检测的缩写,
-多点接入:说明这是个总线网络,许多计算机以多点接入的方式连接在一根总线上,协议的实质是“载波监听”和“碰撞监测”;
-
载波监听:即“发送前先监听”,每个站在发送数据前要先检测一下总线上是否有其他站在发送数据,如果有,暂时不发送数据,等待信道空闲时再发送,总线上没有“载波”,这里只是一个习惯称呼;
-
碰撞检测:即“边发送边监听”,适配器边发送数据边检测信道上的信号电压,以便判断自己在发送数据时其他站是否也在发送数据。
如果考虑上信号在链路上的传播时延,那么过程类似这样;
由上图我们可以看出:
-1. CSMA/CD不可能同时进行发送和接受,因此是半双工协议,即双向交替通信;
-2. 每一个端点在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性,这段时间最长为两个单程最长时间,将这个时间成为“争用期”,只有通过争用期的“考验”,才能肯定这次发送不会发生碰撞。
-3. 以太网把争用期定位51.2微秒,如果是一个标准10M/s的带宽的话,大概是512比特,也就是64字节,因此以太网规定了争用期大小的帧为最小长度,所有比这小的帧都认为是碰撞导致的丢弃帧,因此以太网的帧最小为64字节。
CSMA/CD的要点为:
-1. 适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中,准备发送;
-2. 若适配器检测到信道空闲,即在发送间隙9.6微秒约96个比特时间内没有检测到信道上有信号,就发送这个帧;若检测到信道忙,则继续检测并等待信道转为空闲(加上96比特时间),然后发送这个帧;
-3. 在发送过程中继续检测信道,若一直未检测到碰撞,就顺利把这个帧成功发送完毕;若检测到碰撞,则中止数据发送,并发送人为干扰信号;
-4. 在中止发送后,适配器就执行指数退避算法,等待r被的512比特时间后,返回到步骤(2);