数据链路层属于计算机网络的低层。数据链路层使用的通道主要由两种类型:
点对点信道:这种信道使用一对一的点对点通信方式。
广播信道:这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议来协调这些主机的数据发送。
本章中我们研究的是在同一个局域网中, 分组怎样从一台主机传送到另一台主机, 但并不经过路由器转发。从整个互联网范围来看的话,互联网仍然属于数据链路层的范围。
1.数据链路层的点对点信道和广播信道的特点,以及这两种信道所使用的协议(PPP,以及CSMA、CD协议)特点。
2.数据链路层的三个基本作用:封装成帧、透明传输和差错检测。
3.以太网MAC层的硬件地址。
4.适配器、转发器、集线器、网桥、以太网交换机的作用场合。
两台主机通过互联网进行通信时数据链路层所处的地位:
然而当我们专门研究数据链路层的问题时, 在许多情况下我们可以只关心在协议栈中水平方向的各数据链路层。
当H1到H2发送数据时,我们可以想想数据就是在数据链路层从左向右沿水平方向传动。
从数据链路层来看, H1到H2的通信可以看成由四段不同的链路层通信组成, 即:
H1→R1, R1→R2, R2→R3和R3→H2。 这四段不同的链路层可能采用不同的数据链路层协议。
1. 数据链路和帧
链路和数据链路不是一回事。
所谓链路就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换接点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路是路径的组成部分。
数据链路是另一个概念、这是因为当需要在一条线路上传输数据时,除了必须有一条物理线路外,还必须有一些必要的协议来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器(既有硬件,也有软件)来实现这些协议。一般设配器都拥有物理层和数据链路层。
数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并交给网络层。在互联网中,网络层协议数据单元就是IP数据报(或简称为数据报、分组或包)。
点对点信道的数据链路层在进行通信时主要步骤如下:
1.结点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧。
2.结点A把封装好的帧发送给结点B的数据链路层。
3.若接点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据报交给网络层;否则丢掉这个帧。
数据链路层不必考虑物理层如何实现比特传输的细节。我们甚至还可以简单的设想好像是沿着两个数据链路层的水平方向把帧直接发送到对方。
基本问题:封装成帧、透明传输和差错校验。
封装成帧
就是在数据部分的前面和后面添加上首部和尾部,构成一个完整的帧。首部和尾部可以确定帧的界限、此外还有很多控制信息。
在发送帧时,是从帧首部进行发送的,各种数据链路层协议都对帧首部和帧尾部的格式由明确的要求。
当数据是由可打印额ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。我们知道,ASCII码时7位编码,一共可组合成128个不同的ASCII码,可打印的由95个,不可打印的控制字符有33个。
控制字符SOH(start of header)放在一帧的最前面,EOT(end of transmission)表示帧的结束。SOH和EOT都是控制字符的名称。他们的十六进制编码分别是01和04。
当数据出现差错时,帧定界的作用更加的明显。假定一个帧发送到一半突然出了故障,中断了发送。但随后很快又恢复了正常,于是从头发送这个帧,由于使用了帧定界符,那么前面收到的帧是不完整的帧(只有首部SOH而没有尾部EOT),必须丢弃。而后面收到的数据有明确的定界符,因此得到的是一个完整的帧,应当收下。
透明传输
由于帧的开始和结束的标记使用专门指明的控制字符,因此,所传输的数据中的任何8bit的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。
当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据显然不会出现SOH和EOT这样的界定符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。
但当传输的是ASCII码时(如二进制代码的程序或图像时),情况则不同,如果数据中某个字节的二进制恰好和SOH或EOT这种控制字符一样,数据链路层就会错误地找到帧的边界,部分帧收下(误认为是完整的帧),把剩下的丢弃(找不到SOH)。
透明表示一个实际存在却好像不存在的一样。
在数据链路层传输数据表示无论什么样的比特组合的数据,都能够按照原来没有差错的通过这个数据链路层。因此,对所传输的数据来说,这些数据就看不见数据链路层有什么妨碍数据传输的东西。或者说,数据链路层对这些数据来说是透明的。
为了解决透明传输的问题,在SOH或EOT前面加一个转义字符ESC。而在接收端的数据链路层把数据在数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充或字符填充。如果转移字符也出现在数据当中,那么解决的方法仍然是在转义字符前面加入一个转义字符。因此,当接收端到连续的两个转义字符时,就删除其中前面一个。
差错检验
现实的通信链路可能会出现差错:1可能会变成0,0也可能会变成1。这就是比特差错。比特差错就是传输差错中的一种。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。实际的通信链路并不理想,它不可能式误码率下降到零。因此,为了保证数据传输的可靠性,在计算机传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验CRC检错技术。
CRC检错就是在数据M后面添加供差错检测用到的n位冗余码,构成一个完整的帧发送出去,虽然增大了数据传输的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价很值得。使用时,通过计算冗余码是否由余数判断是否出错,没有差错就接受,有差错就丢弃。
在数据链路层, 发送端帧检验序列FCS的生成和接收端的CRC检验都是用硬件完成的, 处理很迅速, 因此并不会延误数据的传输。
如果出现了帧的错误,就重新传输,直到对方确认为止。这种方法在历史上曾经起到了很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起的差错的概率已经大大的降低。
对于通信质量良好的有线传输链路, 数据链路层协议不使用确认和重传机制, 即不要求数据链路层向上提供可靠传输的服务。 如果在数据链路层传输数据时出现了差错并且需要进行改正, 那么改正差错的任务就由上层协议(例如, 运输层的TCP协议) 来完成。
对于通信质量较差的无线传输链路, 数据链路层协议使用确认和重传机制, 数据链路层向上提供可靠传输的服务(见第9章) 。实践证明, 这样做可以提高通信效率。
2.点对点协议PPP
点对点协议PPP(Point-to-Point Protocol) 则是目前使用得最广泛的数据链路层协议。
PPP就是用户计算机和ISP进行通信时所使用的数据链路层协议。
PPP工作状态:当用户接入ISP后,就建立了一条从用户个人电脑到ISP的物理连接。这是,用户个人电脑向ISP发送一系列的链路控制协议LCP分组(封装成多个PPP帧),以便建立起LCP连接。这些分组及响应选择了将要使用的一些PPP参数。接着还要进行网络层的配置,网络控制协议NCP给新接入的用户个人电脑分配一个临时的IP地址,这样,用户个人电脑就成为互联网上一个有IP的主机了。
当用户通信完毕,NCP释放网络层连接,收回原来分配出去的IP地址。接着,LCP释放数据链路层连接。最后释放的是物理层的连接。
PPPoE是宽带上网的主机使用的链路层协议,这个协议把PPP再封装在以太网帧中(加入一些识别各用户的功能)。宽带上网时由于数据传输速率较高,因此可让多个连接在以太网上的用户共享一条到ISP的宽带链路。现在,即使是只有一个用户利用ADSL进行网络连接,(并不和他人共享到ISP的宽带链路),那就是PPPoE协议。
在TCP/IP协议族中,可靠运输由运输层的TCP协议负责,因此数据链路层的PPP协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP协议不支持多点线路,而只支持点对点的链路通信,此外,PPP协议只支持全双工通信。
3.PPP协议的组成:
三个部分:
(1)、一个将IP数据报封装到穿行链路的方法。PPP即支持异步链路(无奇偶校验的8比特数据),也支持面向比特的同步链路。IP数据报在PPP帧中就是其信息部分。
(2)、一个用来建立、配置和测试数据链路连接的链路控制协议LCP。通信的双方可协商一些选项。
(3)、一套网络控制协议NCP,其中每一个协议都支持不同的网络层协议。
PPP的帧格式
首部的第一个字段和尾部的第二个字段都是标志字符F,两个连续的帧中间只需要一个标志字符。如果出现了两个,就表示是一个空帧,应当丢弃。
首部的地址字段A规定为0xFF,控制字段C规定为0x03。这两个字段并没有携带PPP的帧信息。
PPP首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP的信息字段就是IP数据报,若为0xC021,则信息字段PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。
尾部第一个字段是使用CRC的帧检测序列FCS。
4.字节填充(异步传输)
当信息中出现和标志字段一样的比特时,就必须采取一些措施使得这种形式上的标志字段一样的比特组合不出现在信息字段中。
当PPP使用异步传输时,它把转移符定义为0x7D,并使用字节填充,RFC规定了填充方法:
1.信息字段中出现的每一个0x7E字节转换为2字节的序列(0x7D,0x5E)。
2.若信息字段中出现一个0x7D的字节,则把0x7D变成2字节序列(0x7D,0x5D)。
3.若信息字段中出现了ASCII码的控制字符,则在前面加一个0x7D,同时该字符的编码加以改变。如出现0x03(在控制字符中是“传输结束”ETX)就把它转化为2字符序列(0x7D,0x23)。
5.零比特传输(同步传输)
在发射端,先扫描整个信息字段(通常用硬件,但也可用软件)。只要发现5个连续的1,则立刻填入一个0.因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现6个连续的1.接收端在接受到一个帧时,先找到标志字符F以确定一个帧的边界,接着再用硬件对比特流进行扫描。当发现5个连续的1时,就把这5个1后面的那个0删除。还原成原来的比特流。
6.PPP协议的工作状态
初始化:当用户拨号连入ISP后,就建立了一条从用户个人电脑到ISP的物理连接。这时,用户个人电脑向ISP发送一系列的链路控制协议LCP分组(封装成多个PPP帧),以便建立LCP连接。(链路层的连接)。这些分组及其相应选择了将要使用的一些PPP参数。接着还要进行网络层的配置,网络控制协议NCP给新手的用户个人电脑分配临时的IP地址,这样,用户电脑就是IP主机了。当用户通信完毕,NCP释放网络层连接,收回原来的IP,接着LCP释放数据链路层连接。最后释放物理层的连接。
PPP链路的起始和终止状态永远是上图中的链路静止,这时在用户个人电脑和ISP的路由器之间并不存在物理层的连接。
当用户个人电脑通过调制解调器呼叫路由器时(通畅是在屏幕上点击连接按钮),路由器就能检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP就进入了链路建立状态,其目的是建立链路层LCP连接。
这时LCP开始协商一些配置选项,即发送LCP的配置请求帧。这个是PPP帧,其协议字段置为LCP对应的代码,而信息字段包换特定的配置要求,链路另一端可以发送下面的几种响应中的一种:
(1)、配置确认帧 所有选项都接受
(2)、配置否定帧 所有选项都接受但不能接受
(3)、配置拒绝帧 选项由的无法识别或不能接受,需要协商。
协商结束后,建立LCP链路,然后进入鉴别状态,在这一状态,只允许LCP协议的分组、鉴别协议的分组以及检测链路质量的分组。若使用PAP口令鉴别协议,则需要发起通信的一方发送身份标识符和口令。系统允许多次尝试。还可以使用更复杂的口令握手鉴别协议CHAP。若鉴别身份失败,则转到“链路终止”状态,若成功进入网络层协议状态。
在“网络层协议”状态, PPP链路的两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组。 这个步骤是很重要的, 因为现在的路由器都能够同时支持多种网络层协议。 总之, PPP协议两端的网络层可以运行不同的网络层协议, 但仍然可使用同一个PPP协议进行通信。
如果在PPP链路上运行的是IP协议, 则对PPP链路的每一端配置IP协议模块(如分配IP地址) 时就要使用NCP中支持IP的协议——IP控制协议IPCP(IP Control Protocol) 。 IPCP分组也封装成PPP帧(其中的协议字段为0x8021) 在PPP链路上传送。 在低速链路上运行时, 双方还可以协商使用压缩的TCP和IP首部, 以减少在链路上发送的比特数。
当网络层配置完毕后, 链路就进入可进行数据通信的“链路打开”(Link Open) 状态。 链路的两个PPP端点可以彼此向对方发送分组。 两个PPP端点还可发送回送请求LCP分组(Echo-Request) 和回送回答LCP分组(Echo-Reply) , 以检查链路的状态。
数据传输结束后, 可以由链路的一端发出终止请求LCP分组(Terminate-Request) 请求终止链路连接, 在收到对方发来的终止确认LCP分组(Terminate-Ack) 后, 转到“链路终止”状态。 如果链路出现故障, 也会从“链路打开”状态转到“链路终止”状态。 当调制解调器的载波停止后, 则回到“链路静止”状态。
由此可见, PPP协议已不是纯粹的数据链路层的协议, 它还包含了物理层和网络层的内容。
7.使用网络信道的数据链路层
广播信道可以进行一对多的通信。最常用的广播传输就是局域网技术。
局域网的链路层
主要的特点是:网络作为一个单位所拥有,且地理范围和站点数目有限。在局域网刚刚出现时。局域网比广域网具有较高的数据率、较低的时延和较小的误码率。但随着光纤技术在广域网中普遍使用,现在广域网也具有很高的数据率和很低的误码率。
局域网的优点是:
1.具有广播功能,从一个站点可很方便的访问全网,局域网上的主机可共享连接在局域网上的各种硬件和软件资源。
2.便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变。
3.提高了系统的可靠性、可用性和生存性
局域网可按网络拓扑进行分类。由于集线器的出现和双绞线大量用于局域网,星型以太网以及多级星型结构的以太网获得了非常广泛的应用。还有环形网和总线网,总线网以传统的以太网最为著名,因为以太网占据了局域网的绝对份额,因此以太网几乎成为了局域网的同义词。
局域网可使用多种媒体传输,其中双绞线最便宜。原来只用于低速(1~2Mbit/s) 基带局域网。 现在从10Mbit/s至10Gbit/s的局域网都可使用双绞线。 双绞线已成为局域网中的主流传输媒体。 当数据率很高时, 往往需要使用光纤作为传输媒体。
局域网的工作跨越了数据链路层和物理层。这里只说链路层的内容。
共享信道就要着重考虑一个问题就是如何使众多用户能够合理而方便地共享通信媒体资源。在这技术上有两种方法:
1、静态划分信道,但这种代价太高不适合。
2、动态媒体接入控制,又称为多点接入,特点是信道并非在用户通信时固定分配给用户。而是以下两种:
随机接入:特点是所有的用户可随时的发送信息。可随时发送信息,但恰巧两个或更多用户同一时刻发送信息,那么共享媒体上就会碰撞,使得这些用户的发送都失败。因此,必须由解决碰撞的网络协议。
受控接入:受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。称为轮询。
大部分使用的是随机接入,受控接入不多。
那时, 以太网是一种基带总线局域网,当时的数据率为2.94Mbit/s。 以太网用无源电缆作为总线来传送数据帧, 并以曾经在历史上表示传播电磁波的以太(Ether) 来命名。 1976年7月, Metcalfe和Boggs发表他们的以太网里程碑论文[METC76] 。1980年9月, DEC公司、 英特尔(Intel) 公司和施乐公司联合提出了10Mbit/s以太网规约的第一个版本DIX V1(DIX是这三个公司名称的缩写) 。 1982年又修改为第二版规约(实际上也就是最后的版本) , 即DIX Ethernet V2, 成为世界上第一个局域网产品的规约。
在此基础上, IEEE 802委员会(7)的802.3工作组于1983年制定了第一个IEEE的以太网标准IEEE 802.3[W-IEEE802.3] , 数据率为10Mbit/s。802.3局域网对以太网标准中的帧格式做了很小的一点更动, 但允许基于这两种标准的硬件实现可以在同一个局域网上互操作。 以太网的两个标准DIX Ethernet V2与IEEE的802.3标准只有很小的差别, 因此很多人也常把802.3局域网简称为“以太网”(本书也经常不严格区分它们, 虽然严格说来, “以太网”应当是指符合DIX Ethernet V2标准的局域网) 。
为了使数据链路层能更好地适应多种局域网标准, IEEE 802委员会就把局域网的数据链路层拆成两个子层, 即逻辑链路控制LLC(Logical Link Control) 子层和媒体接入控制MAC(Medium Access Control) 子层。与接入到传输媒体有关的内容都放在MAC子层, 而LLC子层则与传输媒体无关, 不管采用何种传输媒体和MAC子层的局域网对LLC子层来说都是透明的。
以太网在局域网市场中已取得了垄断地位, 并且几乎成为了局域网的代名词。 由于互联网发展很快而TCP/IP体系经常使用的局域网只剩下DIX Ethernet V2而不是IEEE 802.3标准中的局域网, 因此现在IEEE 802委员会制定的逻辑链路控制子层LLC(即IEEE 802.2标准) 的作用已经消失了, 很多厂商生产的适配器上就仅装有MAC协议而没有LLC协议。
适配器的作用:
计算机与外界局域网的连接是通过通信适配器(adapter) 进行的。适配器本来是在主机箱内插入的一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡——个人计算机存储器卡接口适配器) 。 这种接口板又称为网络接口卡NIC(Network Interface Card) 或简称为“网卡”。 由于现在计算机主板上都已经嵌入了这种适配器, 不再使用单独的网卡了, 因此本书使用适配器这个更准确的术语。 在这种通信适配器上面装有处理器和存储器(包括RAM和ROM) 。 适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的, 而适配器和计算机之间的通信则是通过计算机主板上的I/O总线以并行传输方式进行的。
由于网络上的数据率和计算机总线上的数据率并不相同, 因此在适配器中必须装有对数据进行缓存的存储芯片。 在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。 这个驱动程序以后就会告诉适配器, 应当从存储器的什么位置上把多长的数据块发送到局域网, 或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来。 适配器还要能够实现以太网协议。
然我们把适配器的内容放在数据链路层中讲授, 但适配器所实现的功能却包含了数据链路层及物理层这两个层次的功能。
适配器在接收和发送各种帧时, 不使用计算机的CPU。 这时计算机中的CPU可以处理其他任务。 当适配器收到有差错的帧时, 就把这个帧直接丢弃而不必通知计算机。 当适配器收到正确的帧时, 它就使用中断来通知该计算机, 并交付协议栈中的网络层。 当计算机要发送IP数据报时, 就由协议栈把IP数据报向下交给适配器, 组装成帧后发送到局域网。
我们特别要注意, 计算机的硬件地址就在适配器的ROM中, 而计算机的软件地址——IP地址(在第4章4.2.3节讨论) , 则在计算机的存储器中。
总线的特点是: 当一台计算机发送数据时, 总线上的所有计算机都能检测到这个数据。 这种就是广播通信方式。 但我们并不总是要在局域网上进行一对多的广播通信。 为了在总线上实现一对一的通信, 可以使每一台计算机的适配器拥有一个与其他适配器都不同的地址。
在发送数据帧时, 在帧的首部写明接收站的地址。 现在的电子技术可以很容易做到: 仅当数据帧中的目的地址与适配器ROM中存放的硬件地址一致时, 该适配器才能接收这个数据帧。 适配器对不是发送给自己的数据帧就丢弃。 这样, 具有广播特性的总线上就实现了一对一的通信。
为了通信的方便,以太网采取了以下两种措施:
第一, 采用较为灵活的无连接的工作方式, 即不必先建立连接就可以直接发送数据。 适配器对发送的数据帧不进行编号, 也不要求对方发回确认。 这样做可以使以太网工作起来非常简单, 而局域网信道的质量很好, 因通信质量不好产生差错的概率是很小的。 因此, 以太网提供的服务是尽最大努力的交付, 即不可靠的交付。 当目的站收到有差错的数据帧时(例如, 用CRC查出有差错) , 就把帧丢弃, 其他什么也不做。 对有差错帧是否需要重传则由高层来决定。 例如, 如果高层使用TCP协议, 那么TCP就会发现丢失了一些数据。 于是经过一定的时间后, TCP就把这些数据重新传递给以太网进行重传。 但以太网并不知道这是重传帧, 而是当作新的数据帧来发送.
以太网采用最简单的随机接入, 但有很好的协议用来减少冲突发生的概率。以太网采用的协调方法和上面的办法非常像, 它使用的协议是CSMA/CD, 意思是载波监听多点接入/碰撞检测(Carrier Sense MultipleAccess with Collision Detection)。
第二, 以太网发送的数据都使用曼彻斯特(Manchester) 编码的信号。我们知道, 二进制基带数字信号通常就是高、 低电压交替出现的信号。 使用这种信号的最大问题就是当出现一长串的连1或连0时, 接收端就无法从收到的比特流中提取位同步(即比特同步) 信号。
CSMA/CD协议的要点:
“多点接入”就是说明这是总线型网络, 许多计算机以多点接入的方式连接在一根总线上。 协议的实质是“载波监听”和“碰撞检测”。“载波监听”就是用电子技术检测总线上有没有其他计算机也在发送。其实总线上并没有什么“载波”, 这里只不过借用一下“载波”这个名词而已。 因此载波监听就是检测信道, 这是个很重要的措施。不管在发送前, 还是在发送中, 每个站都必须不停地检测信道。 在发送前检测信道, 是为了获得发送权。 如果检测出已经有其他站在发送, 则自己就暂时不许发送数据, 必须要等到信道变为空闲时才能发送。 在发送中检测信道, 是为了及时发现有没有其他站的发送和本站发送的碰撞。 这就称为碰撞检测。
“碰撞检测”也就是“边发送边监听”, 即适配器边发送数据边检测信道上的信号电压的变化情况, 以便判断自己在发送数据时其他站是否也在发送数据。当几个站同时在总线上发送数据时, 总线上的信号电压变化幅度将会增大(互相叠加) 。 当适配器检测到的信号电压变化幅度超过一定的门限值时, 就认为总线上至少有两个站同时在发送数据, 表明产生了碰撞。 这时, 总线上传输的信号产生了严重的失真, 无法从中恢复出有用的信息来。
因此, 任何一个正在发送数据的站, 一旦发现总线上出现了碰撞, 其适配器就要立即停止发送, 免得继续进行无效的发送,白白浪费网络资源, 然后等待一段随机时间后再次发送。
既然每一个站在发送数据之前已经监听到信道为“空闲”, 那么为什么还会出现数据在总线上的碰撞呢? 这是因为电磁波在总线上总是以有限的速率传播的,几个站以不同的速度传播就会碰撞。
显然, 在使用CSMA/CD协议时, 一个站不可能同时进行发送和接收(但必须边发送边监听信道) 。 因此使用CSMA/CD协议的以太网不可能进行全双工通信而只能进行双向交替通信(半双工通信) 。
以太网使用截断二进制指数退避(truncated binary exponentialbackoff) 算法来确定碰撞后重传的时机。 截断二进制指数退避算法并不复杂。 这种算法让发生碰撞的站在停止发送数据后, 不是等待信道变为空闲后就立即再发送数据, 而是推迟(这叫做退避) 一个随机的时间。
我们还应注意到, 适配器每发送一个新的帧, 就要执行一次CSMA/CD算法。 适配器对过去发生过的碰撞并无记忆功能。 因此, 当好几个适配器正在执行指数退避算法时, 很可能有某一个适配器发送的新帧能够碰巧立即成功地插入到信道中, 得到了发送权, 而已经推迟好几次发送的站, 有可能很不巧, 还要继续执行退避算法, 继续等待。
CSMA/CD协议的要点归纳如下:
1) 准备发送: 适配器从网络层获得一个分组, 加上以太网的首部和尾部(见后面的3.4.3节) , 组成以太网帧, 放入适配器的缓存中。但在发送之前, 必须先检测信道。
2) 检测信道: 若检测到信道忙, 则应不停地检测, 一直等待信道转为空闲。 若检测到信道空闲, 并在96比特时间内信道保持空闲(保证了帧间最小间隔) , 就发送这个帧。
3) 在发送过程中仍不停地检测信道, 即网络适配器要边发送边监听。 这里只有两种可能性:
①发送成功: 在争用期内一直未检测到碰撞。 这个帧肯定能够发送成功。 发送完毕后, 其他什么也不做。 然后回到(1) 。
②发送失败: 在争用期内检测到碰撞。 这时立即停止发送数据, 并按规定发送人为干扰信号。 适配器接着就执行指数退避算法, 等待r倍512比特时间后, 返回到步骤(2) , 继续检测信道。 但若重传达16次仍不能成功, 则停止重传而向上报错。以太网每发送完一帧, 一定要把已发送的帧暂时保留一下。 如果在争用期内检测出发生了碰撞, 那么还要在推迟一段时间后再把这个暂时保留的帧重传一次。
8.集线器的星型拓扑
传统以太网最初是使用粗同轴电缆, 后来演进到使用比较便宜的细同轴电缆, 最后发展为使用更便宜和更灵活的双绞线。 这种以太网采用星形拓扑, 在星形的中心则增加了一种可靠性非常高的设备, 叫做集线器(hub) , 如图3-19所示。 双绞线以太网总是和集线器配合使用的。每个站需要用两对无屏蔽双绞线(放在一根电缆内) , 分别用于发送和接收。
集线器的一些特点如下:
使用集线器的以太网在逻辑上仍是一个总线网, 各站共享逻辑上的总线, 使用的还是CSMA/CD协议(更具体些说, 是各站中的适配器执行CSMA/CD协议) 。 网络中的各站必须竞争对传输媒体的控制, 并且在同一时刻至多只允许一个站发送数据。
(2) 一个集线器有许多接口(8), 例如8至16个, 每个接口通过RJ-45插头(与电话机使用的插头RJ-11相似, 但略大一些) 用两对双绞线与一台计算机上的适配器相连(这种插座可连接4对双绞线, 实际上只用2对, 即发送和接收各使用一对双绞线) 。 因此, 一个集线器很像一个多接口的转发器。
(3) 集线器工作在物理层, 它的每个接口仅仅简单地转发比特——收到1就转发1, 收到0就转发0, 不进行碰撞检测。 若两个接口同时有信号输入(即发生碰撞) , 那么所有的接口都将收不到正确的帧。 图3-20是具有三个接口的集线器的示意图。
(4) 集线器采用了专门的芯片, 进行自适应串音回波抵消。
集线器一般都有少量的容错能力和网络管理功能。 例如, 假定在以太网中有一个适配器出了故障, 不停地发送以太网帧。 这时, 集线器可以检测到这个问题, 在内部断开与出故障的适配器的连线, 使整个以太网仍然能够正常工作。
8.以太网利用率
假定一个10Mbit/s以太网同时有10个站在工作, 那么每一个站所能发送数据的平均速率似乎应当是总数据率的1/10(即1Mbit/s) 。 其实不然, 因为多个站在以太网上同时工作就可能会发生碰撞。 当发生碰撞时, 信道资源实际上是被浪费了。 因此, 当扣除碰撞所造成的信道损失后, 以太网总的信道利用率并不能达到100%。
9.以太网的MAC层
在局域网中,硬件地址又称为网络地址或MAC地址(这种地址用在MAC帧中)。
地址:名字支出我们要寻找的那个资源,地址指出这个资源在何处,路由会告诉我们要到达何处。
IEEE 802标准为局域网规定了一种48位的全球地址(一般都简称为“地址”) , 是指局域网上的每一台计算机中固化在适配器的ROM中的地址。 因此
1) 假定连接在局域网上的一台计算机的适配器坏了而我们更换了一个新的适配器, 那么这台计算机的局域网的“地址”也就改变了, 虽然这台计算机的地理位置一点也没有变化, 所接入的局域网也没有任何改变。
2) 假定我们把位于南京的某局域网上的一台笔记本电脑携带到北京, 并连接在北京的某局域网上。 虽然这台电脑的地理位置改变了,但只要电脑中的适配器不变, 那么该电脑在北京的局域网中的“地址”仍然和它在南京的局域网中的“地址”一样。
由此可见, 局域网上的某台主机的“地址”根本不能告诉我们这台主机位于什么地方。 因此, 严格地讲, 局域网的“地址”应当是每一个站的“名字”或标识符[PERL00] 。 不过计算机的名字通常都是比较适合人记忆的不太长的字符串, 而这种48位二进制的“地址”却很不像一般计算机的名字。 现在人们还是习惯于把这种48位的“名字”称为“地址”。 本书也采用这种习惯用法, 尽管这种说法并不太严格。
如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个“地址”。 更准确些说, 这种48位“地址”应当是某个接口的标识符。
由于局域网的迅速发展,
而处在不同地点的局域网之间又经常需要交换信息, 这就希望在各地的局域网中的站具有互不相同的物理地址。 为了使用户在买到适配器并把机器连到局域网后马上就能工作, 而不需要等待网络管理员给他先分配一个地址, IEEE 802标准规定MAC地址字段可采用6字节(48位) 或2字节(16位) 这两种中的一种。 6字节地址字段对局部范围内使用的局域网的确是太长了, 但是由于6字节的地址字段可使全世界所有的局域网适配器都具有不相同的地址, 因此现在的局域网适配器实际上使用的都是6字节MAC地址。
现在IEEE的注册管理机构RA(Registration Authority) 是局域网全球地址的法定管理机构[W-IEEERA] , 它负责分配地址字段的6个字节中的前三个字节(即高位24位) 。 世界上凡要生产局域网适配器的厂家都必须向IEEE购买由这三个字节构成的这个号(即地址块) , 这个号的正式名称是组织唯一标识符OUI(Organizationally UniqueIdentifier) , 通常也叫做公司标识符(company_id) [RFC 7042] 。地址字段中的后三个字节(即低位24位) 则由厂家自行指派, 称为扩展标识符(extended id entifier) , 只要保证生产出的适配器没有重复地址即可。 可见用一个地址块可以生成2^24个不同的地址。
用这种方式得到的48位地址称为EUI-48, 这里EUI表示扩展的唯一标识符(Extended Unique Identifier) 。 EUI-48的使用范围并不局限于局域网的硬件地址,而是可以用于软件接口。 但应注意, 24位的OUI不能够单独用来标志一个公司, 因为一个公司可能有几个OUI, 也可能有几个小公司合起来购买一个OUI。 在生产适配器时, 这种6字节的MAC地址已被固化在适配器的ROM中。
因此, MAC地址也叫做硬件地址(hardware address) 或物理地址。 可见“MAC地址”实际上就是适配器地址或适配器标识符EUI-48。 当这块适配器插入(或嵌入) 到某台计算机后, 适配器上的标识符EUI-48就成为这台计算机的MAC地址了。
IEEE规定地址字段的第一字节的最低位为I/G位。 I/G表示Individual/Group。 当I/G位为0时, 地址字段表示一个单个站地址。 当I/G位为1时表示组地址, 用来进行多播(以前曾译为组播) 。 因此,IEEE只分配地址字段前三个字节中的23位。 当I/G位分别为0和1时, 一个地址块可分别生成224个单个站地址和224个组地址。
IEEE还考虑到可能有人并不愿意向IEEE的RA购买OUI。 为此,IEEE把地址字段第1字节的最低第二位规定为G/L位, 表示Global/Local。 当G/L位为0时是全球管理(保证在全球没有相同的地址) , 厂商向IEEE购买的OUI都属于全球管理。 当地址字段的G/L位为1时是本地管理, 这时用户可任意分配网络上的地址。 采用2字节地址字段时全都是本地管理。 但应当指出, 以太网几乎不理会这个G/L位。
这样, 在全球管理时, 对每一个站的地址可用46位的二进制数字来表示(最低位和最低第2位均为0时) 。 剩下的46位组成的地址空间可以有246个地址, 已经超过70万亿个, 可保证世界上的每一个适配器都可有一个唯一的地址。 当然, 非无限大的地址空间总有用完的时候。 但据测算, 到2020年以前还不需要考虑MAC地址耗尽的问题。
当路由器通过适配器连接到局域网时, 适配器上的硬件地址就用来标志路由器的某个接口。 路由器如果同时连接到两个网络上, 那么它就需要两个适配器和两个硬件地址。
我们知道适配器有过滤功能。 但适配器从网络上每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。 如果是发往本站的帧则收下, 然后再进行其他的处理。 否则就将此帧丢弃, 不再进行其他的处理。 这样做就不浪费主机的处理机和内存资源。
这里“发往本站的帧”包括以下三种帧:
(1) 单播(unicast) 帧(一对一) , 即收到的帧的MAC地址与本站的硬件地址相同。
(2) 广播(broadcast) 帧(一对全体) , 即发送给本局域网上所有站点的帧(全1地址)。
(3) 多播(multicast) 帧(一对多) , 即发送给本局域网上一部分站点的帧。
以太网适配器还可设置为一种特殊的工作方式, 即混杂方式( promiscuousm ode) 。 工作在混杂方式的适配器只要“听到”有帧在以太网上传输就都悄悄地接收下来, 而不管这些帧是发往哪个站。 请注意, 这样做实际上是“窃听”其他站点的通信而并不中断其他站点的通信。 网络上的黑客( hacker或cracker) 常利用这种方法非法获取网上用户的口令。 因此, 以太网上的用户不愿意网络上有工作在混杂方式的适配器。
但混杂方式有时却非常有用。 例如, 网络维护和管理人员需要用这种方式来监视和分析以太网上的流量, 以便找出提高网络性能的具体措施。 有一种很有用的网络工具叫做嗅探器( Sniffer) 就使用了设置为混杂方式的网络适配器。 此外, 这种嗅探器还可帮助学习网络的人员更好地理解各种网络协议的工作原理。 因此, 混杂方式就像一把双刃剑, 是利是弊要看你怎样使用它。
9.MAC帧格式:
V2的MAC帧较为简单,由五个字段组成。前两个字段分别为6字节长的目的地址和源地址字段。第三个字段是2字节的类型字段,用来标识上一层使用的是什么协议,以便把MAC帧数据交给上一层的这个协议。当类型字段的值是0x0800时, 就表示上层使用的是IP数据报。 若类型字段的值为0x8137, 则表示该帧是由Novell IPX发过来的。四个字段是数据字段, 其长度在46到1500字节之间(46字节是这样得出的: 最小长度64字节减去18字节的首部和尾部就得出数据字段的最小长度)。最后一个字段是4字节的帧检验序列FCS(使用CRC检验) 。
这里我们要指出, 在以太网V2的MAC帧格式中, 其首部并没有一个帧长度(或数据长度) 字段。 那么, MAC子层又怎样知道从接收到的以太网帧中取出多少字节的数据交付上一层协议呢? 我们在前面讲述图3-16的曼彻斯特编码时已经讲过, 这种曼彻斯特编码的一个重要特点就是: 在曼彻斯特编码的每一个码元(不管码元是1或0) 的正中间一定有一次电压的转换(从高到低或从低到高) 。 当发送方把一个以太网帧发送完毕后, 就不再发送其他码元了(既不发送1, 也不发送0) 。 因此, 发送方网络适配器的接口上的电压也就不再变化了。 这样, 接收方就可以很容易地找到以太网帧的结束位置。 在这个位置往前数4字节(FCS字段长度是4字节) , 就能确定数据字段的结束位置。
在传输媒体上实际传送的要比MAC帧还多8个字节。 这是因为当一个站在刚开始接收MAC帧时, 由于适配器的时钟尚未与到达的比特流达成同步, 因此MAC帧的最前面的若干位就无法接收, 结果使整个的MAC成为无用的帧。 为了接收端迅速实现位同步,从MAC子层向下传到物理层时还要在帧的前面插入8字节(由硬件生成) , 它由两个字段构成。 第一个字段是7个字节的前同步码(1和0交替码) , 它的作用是使接收端的适配器在接收MAC帧时能够迅速调整其时钟频率, 使它和发送端的时钟同步, 也就是“实现位同步”(位同步就是比特同步的意思) 。 第二个字段是帧开始定界符, 定义为10101011。 它的前六位的作用和前同步码一样, 最后的两个连续的1就是告诉接收端适配器: “MAC帧的信息马上就要来了, 请适配器注意接收”。 MAC帧的FCS字段的检验范围不包括前同步码和帧开始定界符。顺便指出, 在使用SONET/SDH进行同步传输时则不需要用前同步码,因为在同步传输时收发双方的位同步总是一直保持着的。
在以太网上传送数据时是以帧为单位传送的。 以太网在传送帧时, 各帧之间还必须有一定的间隙。 因此, 接收端只要找到帧开始定界符, 其后面的连续到达的比特流就都属于同一个MAC帧。 可见以太网不需要使用帧结束定界符, 也不需要使用字节插入来保证透明传输。
10.拓展的以太网
很多情况下,希望对以太网的覆盖范围进行扩展。
在物理层拓展以太网
以太网上的主机之间的距离不能太远(例如, 10BASE-T以太网的两台主机之间的距离不超过200米) , 否则主机发送的信号经过铜线的传输就会衰减到使CSMA/CD协议无法正常工作。
现在, 扩展主机和集线器之间的距离的一种简单方法就是使用光纤(通常是一对光纤) 和一对光纤调制解调器。
光纤调制解调器的作用就是进行电信号和光信号的转换。 由于光纤带来的时延很小, 并且带宽很宽, 因此使用这种方法可以很容易地使主机和几公里以外的集线器相连接。如果使用多个集线器, 就可以连接成覆盖更大范围的多级星形结构的以太网。
这样做可以有以下两个好处。 第一, 使这个学院不同系的以太网上的计算机能够进行跨系的通信。 第二, 扩大了以太网覆盖的地理范围。例如, 在一个系的10BASE-T以太网中, 主机与集线器的最大距离是100m, 因而两台主机之间的最大距离是200m。 但在通过主干集线器相连接后, 不同系的主机之间的距离就可扩展了, 因为集线器之间的距离可以是100m(使用双绞线) 或甚至更远(如使用光纤) 。
缺点:1、容易碰撞 2、不同的技术不能使用集线器连接。
11.数据链路层扩展以太网
扩展以太网更常用的方法是在数据链路层进行。最初人们使用的时网桥,网桥对收到的帧根据其MAC帧的目的地址进行转发和过滤。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是根据此帧的MAC地址,查找网桥中的地址表,然后确定讲该帧转发到那个接口或把它丢弃(过滤)。
12.以太网交换机的特点
以太网交换机的每个接口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工状态。以太网交换机换具有并行性,技能同时连同多对接口,使得多对主机能够同时通信(而网桥只能一次分析和转发一个帧)。相互通信的主机都是独占传播媒体,无碰撞的传播数据。
以太网交换机的接口还有存储器,能在输出端口繁忙时把到来的帧进行缓存。因此,如果连接在以太交换机上的两台主机,同时向另一台主机发送帧,那么当这台主机繁忙时,发送帧的这两台主机的接口会吧收到的帧缓存一下,然后再发送出去。
以太网交换机是一种即插即用设备,其内部的帧交换表(地址表)是通过自学习算法主动地逐渐建立起来的。以太网交换机由于使用了专用的交换数据的芯片,用硬件转发,其转发速率要比使用软件转发的网桥快很多。
以太网的交换机性能远远超过普通的集线器,而且价格不贵,这就使得工作在物理层的集线器逐渐退出了市场。
对于传统的10Mbit/s的共享式以太网, 若共有10个用户, 则每个用户占有的平均带宽只有1Mbit/s。 若使用以太网交换机来连接这些主机,虽然在每个接口到主机的带宽还是10Mbit/s, 但由于一个用户在通信时是独占而不是和其他网络用户共享传输媒体的带宽, 因此对于拥有10个接口的交换机的总容量则为100Mbit/s。 这正是交换机的最大优点。
以太网交换机一般都具有多种速率的接口, 例如, 可以具有10Mbit/s、 100Mbit/s和1Gbit/s的接口的各种组合, 这就大大方便了各种不同情况的用户。
虽然许多以太网交换机对收到的帧采用存储转发方式进行转发, 但也有一些交换机采用直通(cut-through) 的交换方式。直通交换不必把整个数据帧先缓存后再进行处理, 而是在接收数据帧的同时就立即按数据帧的目的MAC地址决定该帧的转发接口, 因而提高了帧的转发速度。直通交换的一个缺点是它不检查差错就直接将帧转发出去, 因此有可能也将一些无效帧转发给其他的站。 在某些情况下, 仍需要采用基于软件的存储转发方式进行交换。
13.以太网的自学习功能
假定以太网交换机由4个接口,各连接一台计算机,MAC地址分别为ABCD、在一开始,以太网交换表是空的。
A向B发送一帧,从接口1进入到交换机,交换机收到帧以后,先检查交换表,没有查到应从哪个接口转发这个帧(MAC中没有目的地址B)。接着,交换机把这个帧的源地址A和接口1写入交换表中,并向接口1以外的所有接口广播这个帧。C和D讲丢弃这个帧,因为目的地址不对,而B手下,这就称为过滤。从写入交换表的项目(A,1)可以看出,以后不管从哪一个接口收到帧,只要其目的地址是A,就把收到的帧从接口1转发出去。这样做的依据是:既然A发出的帧是从接口1进入到交换机的,那么从交换机的接口1转发出的帧也应当可以到达A。
假定接下来B通过3接口向A发送一帧数据。交换机检查交换表,发现交换表中的MAC地址有A,表明要发送给A的帧(即目的地址是A的帧)应从接口1转发。于是就把这个帧传送到接口1转发给A。显然,现在已经没必要在广播收到的帧。交换表这是新增的项目(B,3)表明今后如果由发给B的帧,应当从接口3转发出去。经过一段时间后, 只要主机C和D也向其他主机发送帧, 以太网交换机中的交换表就会把转发到C或D应当经过的接口号(2或4) 写入到交换表中。 这样, 交换表中的项目就齐全了。 要转发给任何一台主机的帧, 都能够很快地在交换表中找到相应的转发接口。
考虑到有时可能要在交换机的接口更换主机, 或者主机要更换其网络适配器, 这就需要更改交换表中的项目。 为此, 在交换表中每个项目都设有一定的有效时间。 过期的项目就自动被删除。 用这样的方法保证交换表中的数据都符合当前网络的实际状况。
总线以太网使用CSMA/CD协议, 以半双工方式工作。 但以太网交换机不使用共享总线, 没有碰撞问题, 因此不使用CSMA/CD协议, 而是以全双工方式工作。 既然连以太网的重要协议CSMA/CD都不使用了(相关的“争用期”也没有了) , 为什么还叫做以太网呢? 原因就是它的帧结构未改变, 仍然采用以太网的帧结构。
14.以太网接入宽带
以以太网接入的一个重要特点是它可以提供双向的宽带通信,并且可以根据用户对宽带的需求灵活地进行宽带升级。
当城域网和广域网都采用吉比特以太网或10吉比特以太网时, 采用以太网接入可以实现端到端的以太网传输, 中间不需要再进行帧格式的转换。 这就提高了数据的传输效率且降低了传输的成本。
然而以太网的帧格式标准中, 在地址字段部分并没有用户名字段,也没有让用户键入密码来鉴别用户身份的过程。 如果网络运营商要利用以太网接入到互联网, 就必须解决这个问题。
PPP协议中的PPP帧再封装到以太网中来传输。 这就是1999年公布的PPPoE(PPP over Ethernet) , 意思是“在以太网上运行PPP”[RFC2516] 。 现在的光纤宽带接入FTTx都要使用PPPoE的方式进行接入。
例如, 如果使用光纤到大楼FTTB的方案, 就在每个大楼的楼口安装一个光网络单元ONU(实际上就是一个以太网交换机) , 然后根据用户所申请的带宽, 用5类线(请注意, 到这个地方, 传输媒体已经变为铜线了) 接到用户家中。 如果大楼里上网的用户很多, 那么还可以在每一个楼层再安装一个100Mbit/s的以太网交换机。 各大楼的以太网交换机通过光缆汇接到光结点汇接点(光汇接点一般通过城域网连接到互联网的主干网) 。
使用这种方式接入到互联网时, 在用户家中不再需要使用任何调制解调器。
用户把自己的个人电脑通过5类网线连接到墙上的RJ-45插口中, 然后在PPPoE弹出的窗口中键入在网络运营商处购买的用户名(就是一串数字) 和密码, 就可以进行宽带上网了。 请注意, 使用这种以太网宽带接入时, 从用户家中的个人电脑到户外的第一个以太网交换机的带宽是能够得到保证的。
因为这个带宽是用户独占的, 没有和其他用户共享。 但这个以太网交换机到上一级的交换机的带宽, 是许多用户共享的。 因此, 如果过多的用户同时上网, 则有可能使每一个用户实际上享受到的带宽减少。 这时, 网络运营商就应当及时进行扩容, 以保证用户的利益不受损伤。
当用户利用ADSL(非对称数字用户线) 进行宽带上网时, 从用户个人电脑到家中的ADSL调制解调器之间, 也是使用RJ-45和5类线(即以太网使用的网线) 进行连接的, 并且也是使用PPPoE弹出的窗口进行拨号连接的。 但是用户个人电脑发送的以太网帧到了家里的ADSL调制解调器后, 就转换成为ADSL使用的PPP帧。 需要注意的是,在用户家中墙上是通过电话使用的RJ-11插口, 用普通的电话线传送PPP帧。 这已经和以太网没有关系了。 所以这种上网方式不能称为以太网上网, 而是利用电话线宽带接入到互联网