您的位置:首页 > 理论基础 > 计算机网络

第五章 链路层和局域网 计算机网络自顶向下方法(第四版)【读书小结】

2012-10-09 16:49 731 查看
事实说明,我这种人写读书小结是好事情,否则记不住……

第五章,嗯,明显对链路层比较感兴趣,局域网先放一边。什么是链路层?链路层实现的功能是什么?有什么技术?貌似有差错处理,其中包括奇偶校验、检验和、CRC;多路访问协议,有信道划分协议、随机接入协议、轮流协议;然后谈到链路层编址,MAC地址,及地址解析协议;最后,以太网实例,还有交换机。

一、链路层的概述

链路层上面的是网络层,下面的是物理层,一个面向的是网络中的终端和终端的通信,一个提供物理链路节点间的比特流的传输。介于两者之间的就是链路层要干的活了。

首先,什么是链路?书上把沿着通信路径连接相邻节点的通信信道称为链路(link)。为了将一个数据报从源主机传输到目的主机,数据报必须通过沿端到端路径上的每段链路传输。在通过特定的链路时,传输节点将此数据报封装在链路层的帧中,并将该帧发送到链路上;接受节点然后接收该帧并提取出数据报。大概就是这么个流程。解释下节点(node),在本章,书上把主机和路由器都称为节点。

在大概明白了数据在链路层的传输流程后,理解下链路层协议(link-layer protocol)。链路层协议用来在独立的链路上移动数据报,所以定义了在链路两端的节点之间交互的分组格式,以及当发送和接收分组时这些节点采取的动作。链路层协议交互的数据单元称为帧(frame),也就是把网络层传下来的的数据报(datagram)分组成的单元。每个链路层帧通常封装了一个网络层的数据报。

现在大概就可以知道链路层是什么东西了,接着理解下链路层提供的服务。虽然网络层的任务是将运输层报文段从源主机端到端地传送到目的主机,而链路层协议的任务是将网络层的数据报通过路径中的单端链路节点到节点地传送。链路层的一个重要特点是:数据报在路径的不同链路上可能由不同链路层协议所承载。这很明显,我现在在图书馆,博文要发表在CSDN的服务器上面,中间的通信链路包括了无线WLAN、有线以太网、也可能在最后有个PPP的等。经过不同的链路,风别有不同的链路层协议。每个帧在换链路传递的时候,会先拆包再进行封装,嗯,为了适应不同的链路及其协议。

尽管任何链路层的基本服务都是讲数据报通过单一通信链路从一个节点移动到相邻节点,所提供的服务细节将随链路层协议从一种进入下一种而改变。链路层协议能够提供的可能(不是一定有,取决于具体链路)服务包括:

1、成帧(framing),几乎所有的链路层协议都在经过链路传送之前,将每个网络层数据报用链路层帧封装起来。一个帧由一个数据字段和若干个首部字段组成,其中网络层数据报就插在数据字段中。(一个帧也可能包括尾部字段,不过书本把首部字段和尾部字段合称为首部字段。)因此,不同链路层协议,有不同的帧格式。

2、链路接入(link access),媒体访问控制(Medium Access Control,MAC)协议规定了帧在链路上传输的规则。对于在链路的一端有一个发送方、链路的另一端有一个接收方的点对点链路,MAC协议比较简单(或者说不存在),即只要链路空闲,发送方都可以发送帧。主要的情况是多个节点共享单个广播链路,这就是所谓的多路访问问题,需要用MAC协议来协调多个节点的帧传输。

3、可靠交付(reliable delivery),当链路层协议提供可靠交付服务时,它保证无差错地经链路层移动每个网络层数据报。与TCP之类提供的可靠交付服务类似,但是链路层的可靠交付服务通常是通过确认和重传取得的,用于易产生高差错率的链路,比如无线链路,其目的是本地(也就是在差错发生的链路上)纠正一个差错,而不是通过运输层或者应用层协议迫使进行端到端的数据重传。然后,对于低比特差错的链路,比如光纤、同轴电缆等,链路层可靠交付可能会被认为是一种不必要的开销。由于这个原因,许多有线的链路层协议不提供可靠的交付服务。

4、流量控制(flow control),链路每一端的节点都具有有限容量的帧缓存能力。当接收节点以比它能够处理的速更快的速率接收分组时,没有流量控制的话,就会造成接收方缓存区溢出的问题,并使帧丢失。

5、差错检测(error detection),当帧中的一个比特作为1传输时,接收方节点可能错误地判断为0,反之亦然。这种比特差错是由信号衰减和电磁噪声导致的。因为没有必要转发一个有差错的数据报,所以许多链路层协议提供一种机制以检测是否存在一个或多个差错。通过让发送节点在帧中设置差错检测比特,让接收节点进行差错检测,以此来完成差错检测。相对于运输层和网络层的差错检测服务,链路层的通常更复杂,并且用硬件实现。

6、差错纠正(error correction),差错纠正和差错检测类似,区别在于纠正不仅需要判断出是否有错,并且能够准确地判决出差错出现在哪里,并据此纠正这些差错。某些协议(例如ATM)只为分组首部而不是整个分组提供链路层差错纠正。

7、半双工和全双工(half-duplex and full-deplex),采用全双工传输时,链路两端的节点可以同时传输分组。采用半双工传输时,一个节点不能同时进行传输和接收。

(以上链路层提供的许多服务和运输层提供的非常相似,但是各自面向的对象不同,运输层面向的是端到端上的两个进程,而链路层则是链路上两个相邻的节点。)

另外,要提到的是链路层是在哪里实现的呢?看下图。



上图显示一个经典的主机体系结构,链路层的主题部分是在网络适配器(network adapter)中实现的,网络适配器也称为网络接口卡(Network Interface Card,NIC)。网络适配器的内核是链路层控制器,该控制器通常是实现了许多链路层服务的单个特定目的的芯片。(链路层控制器的许多功能都是用硬件实现的。)

二、成帧

书上没有提到成帧的方法,下放到了具体协议上面去叙述,这里继续盗用资源截图。如下五种:





这五种成帧方法,

1、字符填充发,类似于C里面的\转移字符理解;

2、字节计数法,每个分组都添加个计数值。不过为了防止计数值出错,应该要加上校验之类的检测差错;

3、位填充,这个是对任意比特流来说的,现在基本上的通信都是字节流,比特流比较少,类似于字符填充,确定个FLAG,比如还是01111110,那么,可以给初始比特流,每5个1后面添加个0,这样就可以防止内容中间出现FLAG标志,用于区分;

4、物理编码,这个是用特殊的编码来区分表示,原理和上面都一样;

5、时间间隔,这个……

三、差错检测和纠错技术

主要有三个方面介绍,奇偶校验(用来描述差错检测和纠错隐含的基本思想)、校验和(通常更多地应用于应用层)和CRC(通常更多地应用在适配器中的链路层)。首先,再啰嗦下什么是比特级差错检测和纠错(bit-level errordetection and correction),它们通常是链路层提供的两种服务:对从一个节点发送到另一个物理上连接的邻近节点的链路层帧,检测和纠正其中的比特差错。

用下图来大概了解下整个过程。在发送节点,为了避免比特差错,使用差错检测和纠错比特(error-detection and correction,EDC)来增强数据D。通常,要保护的数据不仅包括从网络层传递下来需要通过链路层传输的数据报,而且包括链路级的寻址信息、序列号和在链路帧首部中的其他字段。接收方面临的挑战是,在它只收到D`和EDC`的情况下来判断D`是否和初始D相同。



一般来说,差错检测和纠错技术越复杂(即那些出现“未检测出比特差错”概率较小的技术),导致的开销越大,这就是意味着需要更多的计算量及传输更多的差错检测和纠错比特。

1、奇偶校验



最简单的差错检测方式就是用单个的奇偶校验位(parity bit),是奇校验还是偶校验取决于最后加上奇偶校验位的比特之后,1的个数是奇数还是偶数。

这种方法只能检测出奇数个比特差错。偶数个比特差错将会被忽略……

因此出现了单比特奇偶校验方案的二维一般化方案。



行列分别应用奇偶校验,看上图容易被蒙骗一件事情,二维奇偶校验可以纠正差错?可以检测出所有差错?

首先,构成矩阵的长宽为偶数个差错码的错误无法检测,比如说D[0][0],D[0][1],D[1][1],D[1][0](这是个长宽都为2的矩阵),这个差错是无法检测出来的,因为不管是行还是列,都是偶数位比特差错,无法检测。

另外,纠错仅限于行或列只出现奇数个差错的情况,或者说,只能纠正一些错误。

接收方检测和纠正差错的能力被称为前向纠错(Forward Error Correction,FEC),FEC技术很有价值,因为可以减少所需的发送方重发的次数。更重要的是,允许在接收方立即纠正差错。FEC避免了不得不等待的往返时延,而这些时延是发送方收到NAK分组并向接收方重传分组所需要的,这对于实时网络应用或则具有长传播时延的链路时一个非常重要的优点。

2、检验和

一个简单的检验和方法就是将比特数据加起来,并且用得到的和作为差错检测比特。互联网检验和(Internet checksum)就基于这种方法,即数据的两个字节作为16比特的整数对待并求和。这个和的反码形成了携带在报文段首部的互联网检验和。接收方通过对接受的数据(包括检验和)的和取反码,并且检测器结果是否全为1比特来检测检验和。如果这些比特中有任何比特是0,就可以指示出差错。

检验和方法需要相对小的分组开销。不过与常用语链路层的CRC相比,提供的指示相对弱的差错保护。这,那么为什么运输层用检验和而不用CRC呢?因为运输层常作为主机一部分,并且用软件实现,追求简单和快速。而链路层的再适配器中有专用的硬件,能够快速执行更复杂的CRC操作。

3、循环冗余校验

现今的计算机网络中广泛应用的差错检测技术是基于循环冗余校验(Cyclic Redundancy Check,CRC)编码。也称为多项式编码(polynomial code),因为该编码能够将要发送的比特串看做是系数为0和1的一个多项式,对比特串的操作被解释为多项式算术。

其实维基上面的讲解很棒http://zh.wikipedia.org/wiki/CRC32

校验算法,先设置一个G,假设为4位的1001,那么CRC校验为4-1=3位的R,怎么计算这个R就是算法关键。

假设要校验数据D为101110

那么现在D数据后添加4-1=3位的0,即变D`为101110000,然后G被D`除的余就是R,只是这个除不是一般意思上的除法(把减变为异或操作即可……)看下图大概就能明白了



(……未完待续……)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: