【2021-08-05 修订】【梳理】计算机网络:自顶向下方法 第六章 链路层和LAN(docx)

计算机网络

知 识 梳 理

(第一版)

建议先修课程:数据结构。
配套教材:
Computer Networking - A Top Down Approach, 7th edition James F. Kurose, Keith W. Ross
参考书目:
1、计算机网络(第8版) 谢希仁 编著 高等教育出版社


链接:https://pan.baidu.com/s/1ryAUfV0VCd9R1tJRF9Dbwg
提取码:0000

六 链路层和LAN

6.1 链路层简介
地理上局限在小范围的局域网虽然是个网络,但我们并不把它放在网络层讨论。因为网络层主要解决多个网络互连的问题:分组怎样从一个网络通过路由器转发到另一个网络。在本章,我们研究的是:在同一个局域网中,分组怎样从一台主机传送到另一台主机,但并不经过路由器转发。从整个互联网来看,局域网仍属于数据链路层的范围。

每台运行链路层(二层)协议的设备都可以称为结点(node)。于是,结点可以指主机、路由器、交换机、Wi-Fi访问点(见第7章)等设备。连接邻接结点的通信信道(物理线路,有线或无线)都称为链路(link)。数据报要从源主机传输到目标主机,就必须在端到端路径的每一条通信链路中移动。在通过特定的链路时,传输结点将数据报封装进链路层帧(link-layer frame),并将该帧传送到链路中。
链路和数据链路(data link)并不是一回事。链路只是一条路径的组成部分。当需要在一条线路上传送数据时,除了必须有一条物理线路外,还需要通信协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。不过,为了表达简便一些,将数据链路层简称链路层。
也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。物理链路就是上面所说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。

局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。局域网刚刚出现时,比广域网具有更高的数据率、更低的时延和更小的误码率。但随着光纤在广域网的应用,广域网也具有很高的数据率和很低的误码率。
局域网具有如下一些主要优点:
(1) 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享局域网上的各种硬件和软件资源。
(2) 便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变。
(3) 提高了系统的可靠性(reliability)、可用性(availability)和生存性(survivability)。

链路层提供的基本服务是:将数据报从一个结点通过一条通信链路传输到另一个邻接结点。此外,链路层还可能提供:
·封装成帧(framing)。每种链路层协议的帧都有一个数据字段,这部分填入数据报。至于帧结构的其它部分则与链路层协议有关。
·链路访问(link access)。媒体访问控制(medium access control,MAC)明确了帧如何发送到链路上。对于点到点链路,发送方和接收方都各只有一个,MAC协议很简单(甚至可以不存在):发送方可以在链路空闲的任何时刻发送帧。当一条广播链路连接有多个结点时,MAC协议将协调这些结点之间的帧传输。
·可靠传递(reliable delivery)。当链路层提供可靠传递服务时,它保证每份网络层数据报都能够准确无误地传送。链路层可靠传递服务也能通过确认与重传机制(3.4节)来实现。当使用错误率较高的链路(如无线链路)时,在链路层需要保证可靠传递,及时进行纠错,避免在运输层或应用层触发重传。当然,如果链路错误率很低,这种服务则没有必要。当前,光纤、同轴电缆、许多双绞铜线等介质都是可靠的,因此很多链路层协议都不提供可靠传输。
·错误检测与校正(error detection and correction)。由于信号衰减和电磁噪声等原因,链路层硬件可能接收到错误的帧。通过在帧中添加额外的错误检测位,接收结点可以凭此检错。链路层的错误检测更为复杂,因此由硬件来实现检测。错误校正则要求接收方检测出错误的位置并尝试纠正。

一个帧的帧长,等于帧的数据部分长度,加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(确定帧的界限)。首部和尾部还包括许多必要的控制信息。在发送帧时,是从帧首部开始发送的。
当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。ASCII码是7位编码共128个:可打印的有95个,不可打印的控制字符有33个。控制字符SOH(Start Of Header)放在帧的最前面,表示帧的首部开始。另一个控制字符EOT(End Of Transmission)表示帧的结束。请注意,SOH和EOT都是控制字符的名称,编码分别是01h和04h。SOH(或EOT)并不是S、O、H(或E、O、T)三个字符。

传输出错时,帧定界符的作用更加明显。假定发送端尚未发送完一帧时突然故障,中断了发送;在恢复正常后,从头发送未发送完的帧。接收端发现该帧只有SOH没有EOT,就判定其不完整,必须丢弃。而后面收到的数据有明确的帧定界符(SOH和EOT),代表这是一个完整的帧,应当收下。
当数据是非ASCII码时,如果数据中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样,链路层就会错误识别帧边界,把部分帧收下(误认为是完整的帧),而把剩下的那部分丢弃(假如这部分没有SOH字符)。

透明(transparency),即一个实际存在的事物看起来好像不存在一样(例如,你看不见放在你前面的一块100%透明的玻璃)。链路层要完成透明传送数据的任务:无论什么样的位串组合的数据,都能够无差错地通过链路层。因此,对传送的数据来说,它们“看不见”链路层有什么妨碍数据传输的东西。或者说,链路层对这些数据是透明的。
为了使传输透明,必须设法使数据中可能出现的SOH和EOT在接收端不被解释为控制字符。具体的方法是:发送端的链路层在数据中的SOH或EOT的前面插入一个转义字符ESC(1Bh)。而接收端的链路层把数据送往网络层之前,删除插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stuffing)。若ESC也出现在数据当中,解决方法是在ESC前也插入一个ESC。因此,当接收端收到连续两个ESC时,就删除前面的一个。


链路层在网络适配器(network adapter),即网卡中实现。网络适配器的核心是链路层控制器,通常是一颗专门的芯片,实现了很多链路层服务。链路层控制器的多数功能在硬件中实现,少数运行在主机的CPU上。目前,网卡多集成在主板上。对带宽与网络质量要求较高的场合,可以使用独立网卡。它们通常通过PCI-E总线与CPU相连。
在发送端,控制器取得上层协议生成的数据报,将其封装进链路层帧,并在帧首部填入必要信息,然后通过链路访问协议将帧发送到通信链路中。在接收端,控制器接收整个帧,提取出数据报。如果链路层提供错误检测,那么发送控制器会将校验码填入首部。接收控制器会进行错误检测,与首部中的校验码比对。信号在网卡处完成串行并行转换,网卡也可以对数据进行缓存。

链路层的软件部分主要负责高级链路层功能,比如,组装链路层地址信息和激活控制器硬件。网卡驱动属于软件部分。安装驱动后,驱动程序以后就会告诉适配器,应当从存储器的何处,把多长的数据块发送到局域网;或在存储器的何处,把局域网传来的数据块存储下来。在接收端,链路层软件响应控制器中断(例如,收到若干个帧时产生中断),处理错误,并将数据报上交给网络层。链路层是软件和硬件的组合,是协议栈中软件与硬件交汇的部分。

6.2 错误侦测和校正技术
需要保护的数据不仅仅是数据报,还包括链路层帧的首部。注意,错误检测并不保证检测出所有的错误。当链路层无法侦测到存在的错误时,出错的数据报会被传递给网络层。所以,应尽量压低检错手段无法检测错误的几率。
一般地,很多复杂的检错纠错算法会消耗大量的算力。

下面我们介绍3种检错手段:奇偶校验、校验和和循环冗余检查。

奇偶校验(parity check)是最简单的校验方法之一。奇偶校验可以仅用1个校验位实现:在参与检错的d位数据后附加1位奇偶校验位,总共得到d+1位数据。对于奇校验,当被校验数据分别含有奇数个1和偶数个1时,校验位分别为0和1,使得被校验数据连同校验位总是有奇数个1;对于偶校验,当被校验数据分别含有奇数个1和偶数个1时,校验位分别为1和0,使得被校验数据连同校验位总是有偶数个1。
在接收方,只需要统计数据位与校验位共有多少个1。当校验策略分别为奇校验和偶校验时,统计出来的1的数量分别必须是奇数个和偶数个,否则判定传输出错。
单个奇偶校验位可以检测出奇数个错误(1变0;0变1),但无法检测出偶数个错误。因为同时有偶数个位出错时,奇偶性不变。在可靠的链路中,出现1位错误的概率都很小;一段不太长的数据内出现2位错误的几率,就差不多可以忽略了。但是,如果链路不够可靠,统计表明,错误往往是大量出现的。这时候,单个奇偶校验位无法探测到的错误可以占到50 %。
如果将参与检错的数据分成i行×j列,那么需要i+j+1个校验位。这种二维奇偶校验不但可以定位错误的具体位置,还可以纠错。如果校验位本身出错,自然是可以校正的。二维奇偶校验可以校正任意1位或2位的错误。

接收方探测并纠正错误的能力叫做前向错误校正(forward error correction,FEC)。这种技术在音视频回放设备中很常见。在网络中,FEC可以单独使用,也可以与链路层ARQ(见第3章)配合。FEC是十分有用的,因为可以减少发送端重新传输的次数。它们为接收方提供了立即纠错的手段。此举可以大大提升将数据上交给上层的速率,而无需等待NAK报文或发送方重传的报文在链路中传播。这对实时应用和用到传播延迟较长的链路的情况非常重要。

在校验和(checksum)方法中,d位数据被视作由k位整数组成的数列。一个简单的校验和方法是:把这d位数据按k位分一组,把每组的k位加起来,用这个和作为错误检测位的内容。第3章和第4章已经讲过另一种校验和算法——Internet校验和算法了。除了TCP和UDP对整个报文段校验,IPv4仅对报头校验以外,快速运输协议(Xpress Transport Protocol,XTP)等协议也使用此算法。XTP对报头和整个分组各一个校验和。

校验和带来的额外数据量很小,但其纠错能力比CRC(见下文)要弱。校验和用于运输层,而CRC用于链路层。因为运输层一般是用软件实现的,作为主机操作系统的一部分;而链路层一般有专用的硬件来实现,能够以快得多的速率执行特定算法。因此,虽然CRC比校验和要复杂许多,但适配器中的ASIC足以胜任。当然,更快的软件实现的校验和和CRC等算法早已开发出来了。

今天的计算机网络中,常用循环冗余检查(cyclic redundancy check,CRC)码。下面对其进行讲解。
设有d位数据D参与检测。
首先,收发双方要约定一个生成元(generator)G,具有r+1位。G的最高位(最左侧)为1。
对给定的数据D,发送方会生成r个额外的位(冗余码,记作R)附在D后,得到的d+r位二进制数据D+R能被G整除(使用模2算术)。
使用CRC检错时,接收方只需要用接收到的d+r位除以G。如果余数不是0,则判定出错,否则判定数据正确。
在CRC中,所有的计算都在模2算术下进行,不进行进位和退位。于是,不难发现,加减都等效于异或。
乘除则仍然基于二进制算术的规则,只不过当需要加减的时候也要丢弃全部进位和退位。在一般的二进制算术中,乘以2^k就相当于把数左移k位。所以,给定D和R,算式

D·2rR
产生d+r位的结果。
接下来讲解发送方如何计算R。根据前述要求(得到的d+r位二进制数据D+R能被G整除),就是要给出R,使
D·2rR=nG, n∈N
两边异或R,得
D·2r=nGR
于是,如果用G去除D·2^r,余数就为R。即
R=(D·2^r) % G
到此为止,我们可以归纳出CRC的步骤(所有运算均为模2算术):
【发送方】
输入:二进制数据D,共d位。
步骤:
【1】收发双方协商冗余码位数r,以及一个r+1位的生成元G。
【2】计算冗余码
R=(D·2^r ) % G
【3】将冗余码R连接在D的末尾。
输出:原数据及冗余码D+R
注释:+表示字符串连接运算,且D+R=D·2rR。

【接收方】
输入:发送方发来的数据及冗余码D+R。
步骤:
【1】计算余数
R^’=(D+R) % G
输出:如果余数R^’=0,则数据正确;否则,数据出错。
注释:+表示字符串连接运算,且D+R=D·2rR。
国际标准已经定义好了不同位数的生成元。例如,对CRC-32(它被大量的链路层IEEE协议使用),其冗余码长度为32位,生成元为33位:1 0000 0100 1100 0001 0001 1101 1011 0111b(1 04C1 1D87h)。
每个CRC标准都能探测到不多于r位的错误。在特定的假设下,一段数据内出现超过r位错误的概率可以按1-〖1/2〗^r估计。每个CRC标准也都能探测到奇数位错误。但是,CRC无法定位到具体出错的位。

冗余码也称帧检验序列(frame check sequence,FCS)。CRC和FCS并不是同一个概念。CRC是一种检错方法,而FCS是添加在数据后面的冗余码。在检错方法上,可以选用CRC,也可以不选用CRC。

CRC码也叫多项式码(polynomial codes),这是因为二进制串可以被看作一个每个系数都为0或1的多项式,对二进制位字符串的操作也可以被解释为多项式算术。例如,如果生成元G=1101,则G可用多项式p(x)=x^3+x^2+1表示。这种多项式也称生成多项式。
用生成多项式表示CRC-32的生成元:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x^2+x+1
CRC-64-ECMA的生成多项式:
█(x64+x62+x57+x55+x54+x53+x52+x47+x46+x45+x40+x39+x38+x37+x35+x33+@x32+x31+x29+x27+x24+x23+x22+x21+x19+x17+x13+x12+x10+x9+x7+x4+x+1)
CRC-64-ISO的生成多项式:
x64+x4+x^3+x+1

不难看出,如果传送数据时不以帧为单位来传送,那么就无法加入冗余码以进行差错检验。因此,如果要在数据链路层进行差错检验,就必须把数据划分为帧,每一帧都加上冗余码,再一帧一帧地传送,然后在接收方逐帧检错。
必须强调,若在链路层仅仅使用CRC,则只能做到对帧的无差错接受,即:“凡是接收端数据链路层接受的帧,我们都能以非常接近于1的概率认为:这些帧在传输过程中没有出错”。接收端丢弃的帧虽然曾收到了,但最终还是因为出错而被丢弃。以上所述可近似表述为(通常都是这样认为):“凡是接收端数据链路层接受的帧均无差错”。

请注意,我们现在并没有要求数据链路层向网络层提供可靠传输的服务。所谓可靠传输就是:数据链路层的发送端发送什么,在接收端就收到什么。传输错误可分为两大类:一类就是前面所说的最基本的位错误,而另一类传输差错则更复杂些:收到的帧并没有出现位错误,但却出现了帧丢失、帧重复或帧失序。帧丢失很容易理解。此外,在讲解TCP的时候,大家已经接触过重复和失序的情况了。
过去,OSI的观点是:必须让数据链路层向上提供可靠传输。因此,在CRC检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧,就要向发送端确认。若发送端在一定期限内没有收到确认,就认为出错,就重传,直到收到对方的确认为止。这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,在现在,互联网就采取了区别对待的方法:
对于通信质量良好的有线链路,数据链路层协议不使用确认和重传机制:不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出错并且需要校正,那么校错的任务就由上层协议(例如TCP)来完成。对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,向上提供可靠传输的服务(见第7章)。

6.3 多路访问链路和协议
网络链路分为两种:
点对点链路(point-to-point link)在两端分别仅具有一个发送方或接收方。很多链路层协议都是针对点对点链路设计的。点对点协议(point-to-point protocol,PPP)和高级数据链路控制(high-level data link control,HDLC)便是这样的协议。HDLC是可靠传输协议,随着通信质量的提高,现在已很少使用了。
广播链路(broadcast link)两端可以具有多个发送方与接收方。使用“广播”一词,代表无论哪一台机传输一帧,对面的所有主机都能接收到该帧的一份副本。以太网(见下文)和无线局域网(见第7章)便是广播链路层技术。广播信道常常用于局域网。

PPP较为简单,是用户计算机和ISP进行通信时使用的链路层协议,也是目前使用得最广泛的链路层协议。
IETF认为,在设计PPP时,必须考虑以下多方面的需求[RFC 1547]:
(1)简单。IETF设计互联网时,把最复杂的部分放在TCP中,而IP则相对简单,提供不可靠的数据报服务。这时,数据链路层不必提供比IP更多的功能。因此,对数据链路层的帧,不需要纠错、序号与流量控制。IETF把“简单”作为首要需求。简单的设计还可使协议在实现时不容易出错,从而提高不同厂商在协议的不同实现上的互操作性。协议标准化的一个主要目的,就是提高协议的互操作性。总之,这种协议非常简单:接收方每收到一帧,就进行CRC。如检验正确,就收下这个帧;反之,就丢弃这个帧,其它什么也不做。
(2)封装成帧。必须规定特殊字符作为帧定界符(标志帧的开始和结束),以便使接收端从收到的比特流中,准确找出帧的开始和结束位置。
(3)透明性。PPP必须保证传输透明。如果数据中出现了和帧定界符一样的字符,就要采取有效措施区分。
(4)多种网络层协议。PPP必须在同一条物理链路上支持多种网络层协议(如IP和IPX)的运行。当点对点链路连接局域网或路由器时,PPP必须同时支持连接的局域网或路由器上运行的各种网络层协议。
(5)多种类型链路。除了要支持多种网络层的协议,PPP还必须能在多种类型的链路上运行。例如,串行的或并行的,同步的或异步的,低速的或高速的,电的或光的,交换的(动态的)或非交换的(静态的)点对点链路。
这里特别要提到1999年公布的以太网点对点协议,即PPP over Ethernet,PPPoE[RFC 2516],这是PPP适应多种链路的一个典例。PPPoE是宽带上网的主机使用的链路层协议,解决了以太网没有身份验证功能的问题。这个协议把PPP帧封装在以太网帧中(当然还要增加识别用户的功能)。宽带的速率较高,可以让以太网上的多个用户共享一条到ISP的宽带链路。现在,即使只有一个用户利用ADSL或光纤进行宽带上网(并不和其他人共享宽带),也是使用PPPoE:PC发送的以太网帧到了ADSL MODEM,就转换成ADSL使用的PPP帧。
(6)错误检测。PPP必须对收到的帧进行检测,并立即丢弃出错的帧。若不检错,那么出错的无用帧还要在网络中继续传输,白白浪费许多网络资源。
(7)检测连接状态。PPP必须及时(不超过几分钟)自动检测链路是否正常。故障链路恢复后,极需此功能。
(8)最大传送单元。PPP必须为每种点对点链路设置MTU的标准默认值,以促进各实现之间的互操作性。如果上层递交的分组长于MTU,PPP就要丢帧并报错。MTU是帧的数据段可以承载的最大长度,不是帧的总长度。
(9)网络层地址协商。PPP必须提供一种机制,使通信的两个网络层(例如,两个IP层)的实体能通过协商知道或配置彼此的网络层地址。协商算法应尽可能简单,并能在所有的情况下协商出结果。这对拨号连接的链路特别重要,因为如果仅仅在链路层建立了连接而不知道对方的网络层地址,则不能保证网络层可以传送分组。
(10)数据压缩协商。PPP必须提供协商使用数据压缩算法的机制。但PPP不要求将数据压缩算法进行标准化。

PPP不支持多点线路(一个主站轮流和链路上的多个从站通信)只支持点对点的链路通信。此外,PPP只支持全双工链路。

PPP的三个组成部分是:
(1) 一个将IP数据报封装到串行链路的方法。PPP既支持异步链路(无奇偶检验的8位数据),也支持面向位的同步链路。IP数据报在PPP帧中就是其信息部分。这个信息部分的长度受MTU的限制。
(2) 一个用来建立、配置和测试数据链路连接的链路控制协议(Link Control Protocol,NCP)。通信的双方可协商一些选项。RFC 1661定义了11种类型的LCP分组。
(3) 一套网络控制协议(Network Control Protocol,NCP),其中的每一个协议支持不同的网络层协议,如IP、OSI的网络层、DECnet,以及AppleTalk等。

PPP帧格式如下图。

首部的第一字段和尾部的第二字段都是标志字段F(Flag),固定为7Eh。标志字段表示帧的开始或结束,是PPP帧的定界符。连续2帧之间只需要1个标志字段。如果出现连续2个标志字段,就表示帧为空,应当丢弃。
首部的地址和控制字段分别为FFh和03h。最初曾考虑,以后再对这两个字段的值进行其它定义,但至今也没有给出。可见,这两个字段实际上并没有携带PPP帧的信息。
PPP首部的第四个字段是2字节的协议字段。若为0x0021,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。
信息字段的长度是可变的,不超过1500字节。
尾部中的第一个字段(2字节)是使用CRC的帧检验序列。

当PPP使用
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值