数据链路层是OSI参考模型中的第二层,介于物理层和网络层之间,它使用物理层提供的服务,并向网络层提供服务。
数据链路层的作用是将物理层传输的有可能出错的原始比特流连接改造成逻辑上无差错的数据链路。
数据链路层的基本功能是向网络层提供透明、可靠的数据传输服务。透明是指该层上传输的数据的内容、编码、格式没有限制;可靠是指用户免去对丢失信息、干扰信息、顺序不正确的担心。
数据链路层具备一系列功能,主要是:
为了使传输中发生差错后只将出错的有限数据进行重发,数据链路层将比特流组织成帧以帧为单位传送。
帧的组织结构必须设计成使接收方对从物理层收到的比特流中进行帧识别,也能从比特流中区分出帧的起始与终止,这就是帧同步要解决的问题。
由于网络传输很难保证双方计时的正确和一致,所以不能依靠时间间隔关系来确定帧的起始与终止。常用的帧同步方法如下所述。
该方法用一些特定的字符来定界一个帧的起始与终止。为了不使数据信息位中出现的特定字符被误判为帧的首尾定界符,可以在这种数据字符前填充一个转义控制字符(DLE)以示区别。但是这种方法使用起来比较麻烦,所用的特定字符依赖于所采用的字符编码,兼容性较差。
该方法以一组特定的比特模式(如01111110)来标志一帧的起始与终止,如HDLC协议即采用此方法。为了不使信息位中出现与该比特模式形似的比特串被误判为帧的首尾标志,可以采用比特填充的方法。比如,采用特定模式01111110,则如果信息中连续出现5个“1”,发送方自动在其后插入一个“0”,而接收方则做该过程的逆操作,即每接收到连续5个“1”,则自动删除其跟在后面的“0”,以恢复原始数据。
该方法在物理层采用特定比特编码方法时采用。
例如,曼彻斯特编码方法,是将数据比特“1”编码成“高—低”电平,将数据“0”编码成“低—高”电平。而“高—高”电平和“低—低”电平在数据比特中是违法的。可以借用这些违法编码序列来界定帧的起始与终止。IEEE 802标准就使用这种定界方法。这种编码不需要借助任何填充技术,但它只适用于采用冗余编码的特殊编码环境。
该方法以一个特殊字符表征一帧的起始,并以一个专门字段来标明帧内的字节数。
接收方可通过对该特殊字符的识别从比特流中区分出帧的起始,并从该专门字段中读出该帧中的数据字节数,从而确定帧的终止位置。
面向字节技术的同步协议的典型实例是数字通信报文协议(Digital Data Communication Message Protocol,DDCMP)。
由于字节计数法中计数字段的脆弱性(其值一但出现错误将导致连续帧的传输错误)以及实现上的复杂性和不兼容性,目前,数据链路层采用的帧同步方法是比特填充法和违法编码法。
通信系统必须具备发现(即检测)差错的能力,并采取措施纠正,使差错控制在尽可能小的范围内,这就是差错控制过程,也是数据链路层的主要功能之一。
接收方通过对差错编码(如奇偶校验码或CRC码)的检查,可以判定一个帧在传输过程中是否发生了差错。一旦发现差错,一般可以采用反馈重发的方法来纠正。这要求接收方收完一个帧之后,向发送方反馈一个接收是否正确的信息,使发送方做出是否需要重新发送的决定。发送方必须在收到接收正确的反馈信息后才能认为该帧已经正确发送完毕,否则需要重发直至正确为止。
物理信道的突发噪声可能完全干扰一帧,使整个数据帧或反馈信息帧丢失,这将导致发送方永远接收不到反馈信息,从而使传输过程停滞。为了避免出现这种情况,通常引入计数器(Timer)来限定接收方发回反馈信息的时间间隔。发送方发送一帧数据时同时也启动计时器,若在限定的时间间隔内未能接收到反馈信息,即认为计时器超时,则可认定传输的帧已出错或丢失,就需要重新发送。
由于同一帧可能被重复发送多次,可能导致接收方多次将同一帧递交给网络层。为了防止这种危险,可以采用对发送帧进行编号的方法,即每一个帧一个序号,从而使接收方区分是新的帧还是已经接收又重新发过来的帧,以此确定是否将帧递交给网络层。
数据链路层使用计时器和序号来保证每个帧最终都能被正确地发送给网络层一次。
流量控制不是数据链路层特有的功能,许多高层协议中也提供流量控制功能,只不过控制的对象不同。
对于数据链路层来说,控制的是相邻两个节点之间数据链路上的流量,对于传输层来说,控制的是从源到最终目的之间的端到端的流量。
由于收发双方各自使用设备的工作速率和缓冲存储空间的差异,可能出现发送能力大于接收能力的情况。如果此时不对发送方的发送速率做适当的限制,前面来不及接收的帧将被后面不断发送来的帧“淹没”或“覆盖”,从而造成帧的丢失。由此可见,流量控制实际上是对发送方数据流量的控制,使其发送速率不至于超过接收方所能承受的能力。这个过程需要某种反馈机制,使发送方知道接收方的能力。需要一些规则,使得发送方知道什么情况下才可以接着发送下一帧,什么情况下必须暂停,以等待接收方的某种反馈信息后继续发送。
两种最常用的流量控制方法是:停止等待方案和滑动窗口机制。
增加缓冲存储空间在某种程度上可以缓解收发双方在传输速率上的差异,但这终究是一种有限的方法。
一方面,系统不允许开设过大的缓存空间,成本也较高。另一方面,在速率显著失配且又传送大量数据的场合,仍会出现缓存不够的情况。
停止等待流量控制方案是一种相比之下更主动积极的方法。
其工作原理是:发送方发出一帧,等待应答信号到达后再发送下一帧;接收方每收到一帧后回送一个应答信号,表示愿意接收下一帧;如果接收方不回送应答,则发送方必须一直等待。
为了提高信道的利用率,发送方可以不等待确认信息返回就连续发送若干帧。由于连续发送的多个帧未被确认,需要采用帧号区分这些帧。
这些尚未被确认的帧都可能出错或丢失而要求重发,要求发送方有较大的缓存保留未被确认可能要重发的帧。
但是缓存总是有限的,如果接收方不能以发送方的速率接收处理帧,则发送方还是可能用完缓存而暂时过载的。为此,在收到一个确定帧之前,对发送方可发送的帧的数目加以限制。这是由发送方保留在重发缓存中待确认的帧的数目来实现的。如果接收方来不及对收到的帧进行处理,则接收方就停发确认信息,此时发送方的重发表就会增长,当达到缓存的上限时,发送方就不再发送新的帧,直至再次收到确认信息位置。
此方案中,设置的待确认帧的数目的最大限度称为链路的发送窗口。显然,如果窗口设为1,则发送方仅能缓存一个帧,此时传输效率很低。故窗口应选择是接收双方尽量能处理所有的帧。还要考虑诸如帧的最大长度、可使用的缓存空间以及传输速率等因素。
重发表是一个连续序号的列表,对应发送方已经发送但尚未收到确认的那些帧。这些帧的序号有一个最大值,即为发送窗口的限度。所谓发送窗口就是指发送方已发送但尚未确认的帧序号列表的界,其上、下界分别称为发送窗口的上、下沿,上、下沿的间距称为窗口尺寸。接收方也有类似的接收窗口,它指示允许接收的帧的序号。
发送方每次发送一帧后,等待确认的帧的数目便增1,每收到一个确认信息后,待确认帧的数目便减一。“窗口”随着数据传送过程的发展而向前滑动,因此称为滑动窗口流量控制。当重发表的长度计数值(即待确认帧的数目)等于发送窗口尺寸时,便停止发送新的帧。滑动窗口机制的示意图如图所示。
数据链路层实际上可以拆分为以下两个子层。
下图说明了数据链路层是如何分为LLC和MAC子层的。LLC子层与网络层进行通信,MAC子层支持多种介质访问技术,例如,MAC子层与以太网技术通信,以便通过铜缆或光纤收发帧,MAC子层还与无线技术(如WLAN和蓝牙)通信,以便以无线方式收发帧。
数据链路层的数据单元是帧。虽然有不同的描述数据链路层帧的协议,但每种帧都有以下三个基本组成部分。
由于协议的不同,帧结构及帧头和帧尾中包含的字段会存在差异。数据链路层协议描述了通过不同介质传输数据包所需的功能。协议的此类功能已经集成到帧封装中。当帧到达目的地后,数据链路层协议从介质上取走帧后,就会读取成帧信息并将其丢弃。为适应不同的传输环境,数据链路层协议使用不同的帧。
没有一种帧能够满足通过所有类型介质的全部数据传输需求,根据环境的不同,帧中所需要的控制信息量也相应变化,以匹配介质和逻辑拓扑的介质访问控制需求。
数据链路层协议需要控制信息才能使协议正常工作,通常需要解决以下几个问题。
数据在介质上传输时,将被转换成比特流(即1或0)。根据上述的帧同步方法,接收节点确定帧的起始位置,并要确定表示地址的信息。帧封装技术把比特流分为可读取的分组,并将控制信息作为不同字段值插入帧头和帧尾。这种格式让物理信号具备能被节点接收并且在目的地解码成数据包的结构,如图所示,通用帧格式包括以下几个字段。
帧头包含了数据链路层协议针对特定逻辑拓扑和介质指定的控制信息。
帧控制信息对于每种协议均是唯一的。
第二层协议使用它来提供通信环境所需要的功能。典型帧头字段包括:
数据链路层提供了通过共享本地介质传输数据时要用到的编址方法。这一层的设备地址称为物理地址(注意不是物理层地址)。
数据链路层地址包含在帧头中,它指定了帧在本地网络中的目的节点。帧头还可能包含帧的源地址。
与第三层逻辑地址不同,物理地址不会表示设备位于哪个网络。若将设备移至另一网络或子网,该设备仍使用同一个物理地址。
由于帧仅用于在本地介质的节点间传输数据,因此数据链路层的地址仅用于本地传送。该层地址在本地网络之外没有任何意义。
与第三层地址进行比较,数据包头中的第三层地址在路由过程中,无论经过多少跳,都会从源主机传送到目的主机。
如果帧的数据包必须传送到另一个网络,中间设备(路由器)将解封原始帧,为数据包创建一个新帧并将它发送到新网络中。新的帧必须使用恰当的源地址和目的地址,才能通过新介质传输数据包。
数据链路层中的编址需求取决于逻辑拓扑。仅具有两个互连节点的点对点拓扑不需要编址。对于这种拓扑,帧一旦传送到了介质上,就只有一个去处。
数据链路层协议将帧尾添加到各帧的结尾处。典型的帧尾字段包括:
帧尾的作用是确定帧是否无错到达,此过程称为错误检测。
通过将组成帧的各个位的逻辑或数学摘要放入帧尾中来实现错误检测。
帧校验序列(FCS)字段用于确定帧的传输和接收过程有无发生错误。
之所以在数据链路层添加错误检测,是因为数据是通过该层的介质传输的。
对于数据而言,介质是个存在潜在不安全因素的环境。介质上的信号可能遭受干扰、失真或丢失,从而改变这些信号所代表的各个位的值。通过使用FCS字段提供的错误检测机制,可找出介质上发生的大部分错误。
为确保在目的地接收的帧的内容与离开源节点的帧的内容相匹配,传输节点将针对帧内容创建一个逻辑摘要,称为循环冗余校验(CRC)值,此值将放入帧的校验序列(FCS)字段中以代表帧内容。
如果初始节点产生的CRC与接收数据的远端设备计算的校验值不匹配,即表明帧发生了错误。当帧到达目的节点后,接收节点会计算自身的逻辑摘要值(即CRC值),然后接收节点将比较这两个CRC值。如果两个值相同,则认为帧已按发送的原样到达。如果FCS字段中的CRC值与接收节点计算出的CRC值不同,帧会被丢弃,下图说明了CRC用于进行错误检测的原理。
通过比较CRC,帧的改变会被检查出来,CRC错误通常是由通信噪声或数据链路中的其他错误造成的。在以太网中,错误可能是由于冲突或传输了不该传输的数据。当然,也可能出现CRC比较结果正确,但实际帧已经损坏的情况,不过这种情况发生的概率很小。在计算CRC时,各个位中的错误有可能会相互抵消,这时应要求更上层的协议检测和纠正该数据错误。数据错误的纠正是指从传输的原始比特中恢复被损坏的数据,更复杂,也需要更多开销。数据链路层中使用的协议确定是否执行错误纠正,FCS的作用仅是检测错误,并非每个数据链路层协议都支持错误纠正。
在TCP/IP网络中,所有OSI第二层协议与OSI的第三层网际协议配合使用。然而,实际使用的第二层协议取决于网络的逻辑拓扑以及物理层的实施方式。如果网络拓扑中使用的物理介质非常多,则正在使用的第二层协议数量也相对较多。第二层协议包括:
下演示了一个用不同的数据链路帧将数据包传输通过Internet的例子。
常见的局域网帧是以太网帧和WLAN帧。
以太网是IEEE 802.2和IEEE 802.3标准中定义的一系列互联网技术。
以太网标准定义了第二层协议和第一层技术。以太网是广泛使用的局域网技术,支持10 Mbps、100 Mbps、1 000 Mbps和10 000 Mbps的数据带宽。
OSI第一层和第二层的基本帧格式和IEEE子层在所有以太网形式中是一样的,但用于检测数据和将数据放置到介质上的方法在不同实施中有所不同。
以太网使用CSMA/CD介质访问机制,通过共享介质提供没有确认的无连接服务。共享介质要求以太网数据包头使用数据链路层地址来确定源节点和目的节点。与大部分LAN协议一样,该地址称为节点的MAC地址(也称物理地址)。以太网MAC地址为48位且通常以十六进制格式表示。
以太网帧据有多个字段,具体如下所述。
IEEE 802.11无线局域标准是IEEE 802标准的扩展,它使用与其他IEEE 802 LAN相同的IEEE 802.2 LLC子层和48位编址方案。但是,MAC子层和物理层存在许多差异。在无线环境中,需要考虑一些特殊的因素。由于没有确定的物理连通性,因此外部因素可能干扰数据传输且难以进行访问控制。为了解决这些问题,无线标准定义了额外的控制功能。
IEEE 802.11 标准通常称为Wi-Fi,是一种争用系统,使用的是CSMA/CD介质访问流程。CSMA/CD为等待传输的所有节点指定了一个随机回退的过程。最可能发生介质争用的时间是在介质变为可用后。随机回退一段时间的机制可以大大降低访问冲突。
IEEE 802.11网络还使用数据链路来确认帧已经成功接收。如果发送节点没有检测到确认帧,原因可能是接收方没有收到原始数据帧或确认原始数据帧不完整,就会重传。这样明确的确认就可以克服干扰或其他无线电相关的问题。
IEEE 802.11支持的其他服务有身份验证、关联(到无线设备的连通性)和隐私(加密)。图所示为IEEE 802.11帧包含的字段,图中列出了2字节的帧控制字段的详细组成,如下所述。
为了适应数据通信的需要,ISO、ITU-T以及一些国家和大的计算机制造公司,先后制定了不同类型的数据链路控制规程,根据帧控制的格式,可以分为面向字符型和面向比特型。
在字符型规程中,用字符编码集中的几个特定字符来控制链路的操作,监视链路的工作状态,例如,采用国际5号码中的SOH、STX作为帧的开始,ETX、ETB作为帧的结束。
面向字符型规程有一个很大的缺点,就是它与所用的字符集有密切的关系,使用不同字符集的两个站之间,很难使用该规程进行通信。面向字符型规程主要适用于中低速异步或同步传输,很适合于通过电话网的数据通信。
在面向比特型规程中,采用特定的二进制序列01111110作为帧的开始和结束,以一定的比特组合所表示的命令和响应实现链路的监控功能,命令和响应可以和信息一起传送。所以它可以实现不受编码限制的、高可靠和高效率的透明传输。面向比特型规程主要适用于中高速同步半双工和全双工数据通信,如分组交换方式中的链路层就采用这种规程。随着通信的发展,它的应用日益广泛。ITU-T制定的X.25、ISO制定的高级数据链路控制协议(HDLC)、美国国家标准ADCCP、IBM公司的SDLC等均属于面向比特型的规程。
目前,用于广域网的数据链路层协议主要有HDLC和点对点协议(PPP),广域网的二层封装技术还包X.25、帧中继(Frame Relay)、ATM等,图所示为常见的广域网第二层封装类型和应用场景
作为面向比特的数据链路层协议的典型,HDLC具有以下优点。
HDLC是通用的数据链路层控制协议,在开始建立数据链路时,允许选用特定的操作方式。所谓操作方式,是指某站点以主站方式操作还是以从站方式操作,或者两个方式兼备。
链路上用于控制目的地的站称为主站,其他的受主站控制的站点称为从站。主站负责对数据流进行组织,并且对链路上的差错实施恢复。由主站发往从站的帧称为命令帧,而由从站返回主站的帧称为响应帧。连有多个站点的链路通常使用轮询技术,轮询其他站的站点称为主站。而在点对点的链路中,每个站都可以为主站。主站需要比从站具备更多的逻辑功能,所以当终端和主机相连时,主机一般总是主站。有些站可兼备主站和从站的功能,这种站称为组合站,在这种情况下,在链路上,主、从站具有同样的传输控制功能,这又被称为平衡操作。相对地,有主从之分,各自功能不同的操作,称为非平衡操作。
HDLC中常用的操作方式有以下三种。
在HDLC中,数据和控制报文均以帧的标准格式传送。完整的HDLC的帧由标志字段(F)、地址字段(A)、控制字段(C)、信息字段(I)、帧校验字段(FCS)等组成。
下图所示为使用HDLC的网络拓扑示意图,可以指定链路层使用HDLC封装,并捕获数据帧查看具体格式。
一个HDLC的实际数据帧的示例如下图所示。
点对点(Point to Point,PPP)协议是用于在两个节点之间传送帧的协议。PPP标准由IETF的RFC定义。PPP是一种用于广域网的数据链路层协议,可在多种串行WAN中实施,可用于各种物理介质,包括双绞线、光缆、卫星传输以及虚拟连接。PPP可用于承载多种三层协议,如IPv4、IPv6和IPX。
PPP使用分层体系结构,为满足各种介质的需求,PPP在两个节点间建立会话逻辑连接。
PPP会话对上层PPP协议隐藏底层物理介质,这些会话还为PPP提供了用于封装点对点链路上的多个协议的方法。PPP还让两个节点能够协商PPP会话选项,这包括身份验证、压缩和多链路(使用多条物理连接)。
PPP分为以下三层。
PPP使用LCP来建立、测试数据链路连接,此外还提供协商封装格式的可选选项,具体包括以下内容:
当LCP将链路建立好后,PPP使用NCP根据不同的需求,配置上层协议所需的环境,为上层提供服务接口。针对上层不同的协议类型会使用不同的NCP组件,比如对IP提供IPCP接口。
从开始发起呼叫到最终通信完成后释放链路,PPP工作经历以下4个阶段。
PPP帧的格式包括如下主要字段:
PPPoE(Point-to-Point Protocol over Ethernet)是以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ethernet)框架中的一种网络隧道协议。由于协议中集成了PPP协议,所以实现了传统以太网不能提供的身份验证、加密以及压缩等功能,也可用于缆线调制解调器(Cable Modem)和数字用户线路(DSL)等以以太网协议向用户提供接入服务的协议体系。本质上,它是一个允许在以太广播域中的两个以太网接口间创建点对点隧道的协议。与传统的接入方式相比,PPPoE具有较高的性能价格比,它在包括小区组网建设等一系列应用中被广泛采用,目前流行的宽带接入方式ADSL 就使用了PPPoE协议。
PPPoE协议是利用以太网资源,将以太网中的多台主机连接到AC(访问集中器)上,然后通过在以太网中运行PPP协议来实现用户的认证接入,其工作原理主要分为发现阶段和PPP会话阶段两个阶段。
由于传统的PPP连接是创建在串行链路或拨号时创建的ATM虚电路连接上的,所有的PPP帧都可以确保通过电缆到达对端。但是以太网是多路访问的,每一个节点都可以相互访问。以太帧包含目的节点的物理地址(MAC地址),这使得该帧可以到达预期的目的节点。因此,在以太网上创建连接,交换PPP控制报文之前,两个端点都必须知道对端的MAC地址,这样才可以在控制报文中携带MAC地址。PPPoE发现阶段做的就是这件事。除此之外,在此阶段还将创建一个会话ID,以供后面交换报文使用。
用户主机与接入集中器根据在发现阶段所协商的PPP会话连接参数进行PPP会话。一旦PPPoE会话开始,PPP数据就可以以任何其他的PPP封装形式发送。所有的以太网帧都是单播的。会话阶段主要分为三个步骤,如下所述。