1.轮转
在共享的媒体上,一次只有一个站点能成功地进行传输。必须存在某种在站点间分配带宽的机制,使得:
每个站点都能公平地共享宽带。
每个站点在合理的时间内都能获得访问媒体的权利。
由于仲裁机制而浪费的带宽必须最小化。
LAN上最流行的两种仲裁机制是令牌方案和竞争方式。
在令牌方案中,每个站点按某种循环的方式被准许传输。在令牌环(token ring)中,一个特殊的位序列—--令牌(token)在环上循环,当一个站点得到令牌的时候才被允许进行传输。在令牌总线(token bus)中,令牌是从站点发送到站点的一个特殊的包。每个站点都需要知道它将把令牌传送给哪个站点。
在竞争方式中,站点按照自己的意愿进行发送,如果两个站点同时进行传输,冲突(collision)就发生了,而且他们的传输都不会成功。竞争机制是为了最大可能地减少冲突而建立的。竞方式是“概率上公平的”,就是说理论上有些站点上有些站点将永远也不能进行传输,因为每次它进行传输时都有其他节点同时传输,但竞争方式的LAN是经过小心设计的,使得这种情形不太可能出现。提供保证的方案实际上也是一种可能性。令牌仅仅是位序列,很可能被破坏。在令牌方案中,理论上存在着这种可能性:某个站点永远也无法成功地传输,因为在它能访问前令牌总是丢失了:或者每次站点都成功获得了令牌,但是传输的数据却经常丢失。
2.IEEE 802 LAN
IEEE有一个802委员会,目的就是标准化LAN,它已经标准化了不止一个LAN。
LAN技术覆盖了OSI参考模型的下两层,(物理层和数据链路层)。802委员会将数据链路层划分为两子层:
1)媒体访问控制(MAC)处理与特定类型的LAN相关的问题,例如处理信道管理算法,如令牌传递(802.5和802.4)、冲突检测后的二进制退避(802.3)、优先权(802.5和802.4)、差错检测和成帧。
2)逻辑链路控制(LLC)定义了一些字段,使多个上层协议能共享数据链路层。因为有些人认为数据链路层只能提供简单的数据报服务是不够的,他们要求有更多的功能,于是决定提供一些逻辑链路控制的风格,以下是两种广泛使用的类型。
a.LLC类型1是简单的数据报协议,即包被数据链路层以最大的努力(best-effort)来传递。在数据链路没有一种协议用来通知源站点是否数据已经被成功接收了,而是在需要的时候,认为在更高层来完成了那种差错控制。注意LLC类型1实际上不做任何事情,因为LAN已经提供了最大努力的服务,(这并不是对LLC类型1的批评,协议不起作用总比协议起着你不需要的作用要好,更好的当然是不需要的时候就完全不要那个协议)。
b.LLC2是基本数据报服务上的可靠的面向连接的协议,这意味着除了LLC类型1需要的字段外,还有对包进行编号的字段,即提供一个捎带确认字段,还用来区分数据包和控制包,(如确认和重新同步消息)。LLC类型2本质上是运行面向链接的数据链路协议HDLC的,HDLC用于LAN的面向数据报的协议之上的点到点链路。
3.名字、地址和路由
1)名字:对源和目标而言,名字是与位置无关的,如果目标的名字确定了,即使目标移动了,名字也不会改变,并且不管那个源想到达这个目标。“名字”的一个例子是社会保险号,他不随着号码拥有者的迁移而改变,名字字段有时被称为“标识符”或ID。
2)地址:地址的有效性与源的位置无关,但目标移动时它也可能相应改变。“地址”的一个例子是邮政系统的地址,不管信是从哪儿寄出的,都可使用相同的目的地址。但如果目标移动了,就赋予它一个新的地址。
3)路由:路由同时依赖于源和目标的位置。换言之,如果两个源确定到某个目标的路由,那么两条路由可能是不同的。如果目标移动了,那么所有去往它的路由都可能改变。路径的描述类似于“从这儿到我家,要先往西走三英里,然后在第一个路口向右转。我家就是左面的最后那个房子”。
注意,根据前面的描述, 802系列中的“地址”应归为“名字”而非“地址”。尤其是全球统一分配的48位“LAN地址”,这个LAN地址并不因站点移动到另一个LAN而改变。
4.局域网地址
在很多LAN技术中,每个站点都可以“听”到每一个包传输,所以在每个包中必须包含“目的”字段。为使目的站点能够知道是哪个站点发送了包,“源”字段也是必需的。为防止每个包都产生软件中断, LAN适配器会过滤掉那些不是给该站点的包。
802委员会需要为它的LAN标准化地址。第一个决定就是设置地址字段的长度。委员会显然认为如果标准定在一个固定的长度是好的,标准化为几个长度则会更好。802委员会给出了LAN(除了802.6)使用48位或16位地址的建议。在802.6上给出的建议是使用16、48或60位的地址。幸运的是,16位地址并没有流行起来,所以完全可以忽略。
48位地址观点认为它们可以使设备在出厂时就获得一个全球唯一的标识符。这就使网络是真正即插即用的,因为用户买回设备后,并不需要人为分配地址,直接就可以接入到网络上。
全球唯一的地址之所以可行,是因为有一个全球的机构负责分发地址块。起初是施乐公司,现在是IEEE。每个设备厂商想要制造即插即用的LAN设备时,都要先和该机构联系并获得地址。换言之,厂商得到了固定的3个八位组的值,而其余的3个八位组则由厂商自行分配。地址的固定值部分往往被称为“厂商代号”或OUI(organizationally unique identifier,组织唯一性标识),但这实际是个误称,因为厂商可以购买多于一个的地址块,也可以把地址转赠给其他厂商。
有固定值的3个八位组实际上有另外的结构(见图IEEE地址)。其中有一位表示“组/个体”,如果该位是0,则地址指一个特定的站点;如果该位是1,则地址是指站点的一个逻辑组。因此,全球机构并没有真正给出24位固定值,而只是固定值中的23位,剩下的一位是组/个体位。一个完整的地址是6个八位组长,3个八位组的值是常数,另外3个八位组(24位)由厂商分配。因此,当厂商购得一个地址块时,他得到了224个站点地址和224个组地址。

802委员会并不能肯定每个人都愿意去花费精力(和金钱)从全球机构获取地址块,因此就指定了48位中的另外一位来标识地址是全球还是本地分配的。当厂商是从全球机构购得地址块时,全球/本地标志位将被设为0。如果全球/本地标志位设为1,人们就可以随便使用地址。当使用本地地址时,应由网管人员进行地址分配,并确保没有地址冲突(即两个站点使用了相同的地址)。当两个网络合并时,地址冲突就是一个重要的问题。
组地址有时也称作“组播地址”(multicast address)。组播地址常用来发现适当的邻居(同一链路上的节点),可用下列两种方法中的一种:
1) 请求:假设网络上有一个或几个某种特定类型的站点,例如域名服务器、路由器、文件服务器等等,站点A希望访问到这些服务器。可以给站点A配上所有这些节点的地址,但如果站点A不需要事先知道特定的服务器会更好,它只需要知道单个组地址Z服务器(这里Z指任何一种服务,比如上面提到的那些)。当站点A想要访问一个Z服务器时,它就传送目的地址为Z服务器的包。所有的Z服务器都会接收并回应针对这个地址的包。
2) 广告:另一种使用组地址的方式是为站点侦听服务定义一个地址。Z服务器的客户不需要发送给Z服务器以请求帮助,而由Z服务器定期向Z客户这个地址发送包。Z客户将接收所有地址为Z客户的包,然后根据包的源地址或数据部分中明确包含的其他某些字段,Z客户就能知道一个Z服务器的地址。这种方法和人类社会的商业广告一样。广告商总是希望它所发出的广告仅能被那些感兴趣的人收到,而广告商所能用的最好办法是在其观众对特定产品感兴趣的媒体上做广告。
5.组播地址与单播地址
为什么组播地址和单个的地址看起来不同?如果一个特殊的地址被用来表示“所有的Z服务器”,而所有的Z服务器除侦听它们自己的地址之外,还应侦听这个地址,那为什么不把任何一个地址作为组播地址呢?
问题在于L A N上有很多的包,如果每次有包在网上传输时,站点上的软件就不得不处理中断,站点的性能就会非常低。硬件会收到每一个包,而且很可能还要求它再传递这些包。这称为“混杂侦听(listening promiscuously)”。
有时(比如对于网桥或L A N监测工具),需要硬件来发送每一个收到的包。但是对大多数应用而言,“混杂”都是没有必要的。硬件应该能查看这个包的足够信息,从而判断这个站点是否需要这个包。如果需要,它就把包交给软件进程处理,否则就丢弃(过滤掉)。
理论上,不需要在地址中保留一位来区包播地址和个体地址。理想情况下,软件会告诉硬件处理芯片它所感兴趣的所有地址,而硬件仅把那些数据链路报头中“目的地址”字段与上述某个地址匹配的包传给软件进行处理。但是如果让软件提出它所感兴趣的地址,芯片设计者就需要选取一个可能被要求的最多地址数目。这个值如果取得过大,芯片的造价就会太高;如果过小,则当软件进程要求的地址数超过这个范围时,芯片就会变得无效。
很多芯片按下述规则来设计:
. 地址中用一位来表示是组地址还是个体地址。
. 站点告诉硬件它所感兴趣的个体地址。
. 芯片把一套组地址分为若干个组(技术上称为“散列漏桶( hash bucket)”)。如果站点想要接收一个特定的组地址,它必须选择该组播地址所散列变换到的漏桶。然后。芯片将发送所有目的地址散列变换进那个漏桶的包。这种做法的理论依据是一个站点可能只对单个个体地址(即它自己的地址)和某些组地址感兴趣。硬件应该允许由软件来指定它所感兴趣的组播地址,但这又会出现上面说到的最大地址值的问题。所以芯片用几个散列漏桶对组播地址进行排序来代替确切指出具体的组地址,而软件只把散列漏桶的一个子集告诉给硬件。这样的芯片设计使站点无法避免那些它不感兴趣的组地址引起的软件中断,因为芯片会把这个漏桶所对应的所有组播地址的包都传递给软件处理进程。
另外一种芯片设计提供了
. 一些固定数目的确切地址(包括组地址和个体地址)。
. 几个地址散列漏桶,站点可以请求这些散列漏桶的任何子集。
有了这种设计,如果一个站点希望接收的地址数不超过芯片所允许的地址数目,就可以实现完全的过滤(不会有不感兴趣的地址所引起的软件中断)。当站点需要接收的地址数超过了所限定的数目,就只能依靠散列漏桶的方案,并且希望有很大通信量的不感兴趣的地址不会恰好散列变换到所选取的漏桶。
6.广播地址
一种特殊的组地址称为“广播地址”,用全1表示,表示所有的站点。理论上,所有的站点都应该能接收到发给广播地址的包。如果LAN中有一种协议需要被所有的站点实现,则它应采用广播地址,但实际上,这种协议是不存在的,或许永远也不会有。
7.复用字段
可能在同一个站点上需要实现多种高层协议。当一个发送给该站点的包到达时,需要有方法来判断由哪个协议来接收此包。类似地,多个不同的协议会发送包给广播地址。当一个站点收到包时,它必须决定如何解释这个包(即判断这个包是由什么协议创建的)。
为了解决这个问题,需要定义一个通用的规则,即在发送信息之前,先申明你使用的是何种语言。虽然现在人们还没有为自然语言定义一套这样的规则,但对于LAN来说,这套规则已经制定好了(见图协议类型复用技术)。在LAN报头中有一个字段指出了所使用的协议。在最初的以太网设计中,有一个称为“协议类型”的2字节长的字段,这个字段由施乐公司进行全球化管理,任何想制定协议的人都需要与施乐公司协商以获取一个表示该协议的数字标识。当802委员会制定LAN标准时,他们认为,为源端和目的端分别保留字段的方案是更灵活的(见图SAP复用技术)。这些段被称为“服务访问点”(SAP)。在802协议的报头中包括了SSAP(源端服务访问点)和DSAP(目的端服务访问点)。这种安排使得不同机器中协议的数字表示更为灵活。
SAP字段的长度为8位。和LAN地址一样,其中有2位是保留位。一位用于表示“全球/本地”(Global/Local),和LAN地址字段中的类似位一样,它表明是由802委员会分配了这个SAP数字(确保它的唯一性),还是由本地网络管理员管理这个数字。
另外一个保留位用来表明“组/个体”,它使你可以发送一个被系统中多个高层协议接收的包。在LAN地址中保留一位是为了制造芯片时更方便,但由于基于SAP的过滤不是由硬件完成的,因而这个原因不适用于SAP。这一位在LAN地址中有意义而在SAP中没有太大意义的另一个原因,是因为同一LAN中的多个不同站点可能实现相同的协议,因而要接收相同的消息。而在一个站点中不太可能出现多个高层进程同时实现一个共同协议。

全“1”的SAP是保留的,表示“所有的SAP”,类似于广播地址。全“ 0”(除“G / L”位外)的SAP保留用来表示数据链路层本身,而不是数据链路层的用户。SAP的结构图如下:

除去上述两位保留位,全球分配的SAP编号只有6位,因而802委员会无法保证提供给每一个希望定义协议的组织一个SAP编号。为此,802制定了严格的规则来分配SAP编号,而且不是采取“先申请先服务”直到分配完的办法。只有那些经802委员会批准的标准组织制定的协议才可得到SAP编号。
对那些可以获得全球SAP编号的协议来说,SAP字段就像一个单一协议类型字段,因为SSAP和DSAP是相同的(它们都等于分配给该协议的全球SAP值)。其他协议(没有全球SAP编号的协议)可以使用本地分配的SAP编号,系统管理员可以为每个协议指定本系统中唯一的一个编号。但这种方式使会话的开始很困难,因为在不知道对方机器的SAP编号的情况下,很难给它发送一个协议消息。
802提出了一个让SAP系统可行的办法,它由请求一个单一的全球指定的SAP值组成。当DSAP被设为那个值时,表明报头被扩展而包括了一个“协议类型”字段。这个字段要求足够大,以使每个协议都能得到一个唯一的编号。
最初,协议类型字段是2个八位组,因为最初的以太网上协议类型占2个八位组,且施乐公司知道它表示什么。但后来有人注意到,802的报头包含了奇数个八位组,而如果协议类型占奇数个八位组,则可以使整个报头为偶数个八位组,从而提高那些希望字段是按16位对齐的机器的性能。
然后有人注意到,如果协议类型字段超过了3个八位组,则这个字段可以通过和地址的管理联系在一起,从而进行“免费的”管理。也就是说,当一个设备厂商买下一个地址块时,他得到了一个3个八位组长的常数(包括组,/个体位)而其余的3个八位组可由厂商自由分配。厂商可以将那个3个八位组长的常数作为协议类型的高位部分,然后分配协议类型。例如,如果协议类型字段是4个八位组长,则当设备厂商买下一块地址时,他也就可以定义256种协议类型。最后人们达成了一致,把协议类型字段设为5个八位组长,因为5是大于3的最小奇数。那个指出存在协议类型字段的全球范围内定义的SAP值,称为SNAP(子网访问协议)SAP。它等于10101010(二进制)或者aa(十六进制)。当使用了SNAP SAP时,DSAP和SSAP都被设为aa(十六进制)。拥有全球分配的SAP值的协议把DSAP和SSAP设为相同的值,即全球分配的SAP值。而那些没有全球分配的SAP值的协议,也把DSAP和SSAP设为相同的值,即SNAP SAP(aa(十六进制))(在我看来,802定义的字段,即SAP和LLC,纯粹是浪费报头的空间,也增加了规范说明的长度和理解的难度。实际上只需要一个协议类型字段)。
地址和协议类型字段的结构如图所示:

当一个组织购买了一块地址时,它得到了一个3个八位组的数值,如XYZ,地址格式为XYZ***。这个组织可以指定站点的地址为XYZ***,组播地址为X’YZ***,这里X’表示设置设置了G / I位的X。它还可以指定协议类型为XYZ**。
注意,当一个协议类型被指定后,就与指定它的组织无关了。为协议指定一个类型值只是为了让它不和其他的协议发生冲突。由拥有OUI=XYZ的组织指定的类型为XYZAB的协议,可以被任何组织使用且总有类型值XYZAB。
8.位序
对地址而言,需要解决的一个问题是它们该如何表示和传输,因为不同机器存储比特和字节的方式也不同。802.1委员会制定了一个地址书写的标准格式,即用连字符分隔的6个八位组,每个八位组用2个16进制数表示。例如,某个地址可被写成a2-41-42-59-31-51(即我们通常说的网卡地址)。
802.3和802.4规定,最低位最先传输;而802.5(及FDDI)规定,最高位最先传输。这不是个问题(因为某个特定LAN上的发送方和接收方的适配器应是对称的,发送的顺序是不要紧的),除非地址中的组位(group bit)没有被定义成“最高位”或“最低位”,而被定义成“线路上的第一位”。因而802.3上的组地址在802.5上传输时,可能看起来就不像是一个组地址了,因为首先传输的位不同。
地址的标准格式采用最低位在前的顺序。因而,地址a2-41-42-59-31-51不是一个组地址,因为它的第1个八位组(a2,10100010)的最低位是0。在802.5或FDDI上传输的地址,由于有最高位最先传输的要求,因而需要被存储成其他的格式。
下图(1)说明了地址a2-41-42-59-31-51被存储为最低位最先传输的格式。不重要的位排前面。(2)说明了地址a2-41-42-59-31-51被存储为最高位最先传输的格式。最重要的位排前面。

因此,在802.5(或FDDI)与其他LAN之间转发数据的时候,网桥需要先对地址进行重新排列。
一个更困难的问题是如何在高层协议消息(如管理消息或ARP消息)中包含LAN地址。如果高层协议的实现在把LAN地址放入协议消息前没有将其转换成规范的格式,则目的站点若不判断产生此协议消息的LAN类型,就不能解释包含了LAN地址的字段。而高层协议一般不知道LAN的类型,因为它是与高层协议无关的。
802委员会在所有LAN的位序上没有统一,导致了大量的混淆和互操作性问题。例如,至少会有一个协议是这样实现的:若数据链路层报头中的地址与高层报头中表示的地址不一致,则协议失败。因此,如果网桥在802.3和802.5之间转发数据时作恰当的地址重排,这个协议就会失败。网桥厂商被迫采取的方法是:特别检查这种特殊的协议类型,并且对该协议类型的包的数据链路层报头地址不做重排。这样,该协议的桥接包的地址与实际应该有的地址表示不同,这会引发下面两个主要问题:
1) 站点地址——若位序是翻转的(在LAN上可能作为组播地址出现),就会引起源路由网桥错误地解析这个包,也会使透明网桥拒绝转发这个包。
2) 翻转位序的站点地址可能是另外一个站点使用的地址。
9.逻辑链路控制
LLC子层在规范中好像是与MAC子层分离的。如果人们能对LAN的数据报服务达成一致,那么802委员会也就没有必要把LAN的数据链路层再划分为这两个子层了。
目前定义了多种LLC类型。类型1是数据报服务,类型2是面向连接的服务。其他几种类型不常用,可以忽略。
LLC层中的数据链路层字段只有DSAP、SSAP和CTL。源地址和目的地址是MAC子层考虑的部分。这意味着技术上每个LAN委员会(802.3、802.5等)都可以自己定义地址,幸运的是不同LAN的地址是相当一致的。但不幸的是,它们并不相同,因为有地址的位序问题和802.5中的任意组播地址问题。实际上,对802.5来说,地址一开始就是不同的:它们最初是层次型的, 6个字节中的一部分表示站点所在的环号,地址的其余部分表示相应于那个环的站点号。现在那已经改变成6字节的站点地址,和其他的LAN一样。LLC类型1中的CTL(“控制”)字段占一个字节,为以下三个值之一:
1) UI:“未编号的信息”(表示是个数据报)。
2) XID:“交换身份标识”。有两种类型:“响应”和“命令”。“命令”将命令发送者的身份及所支持的LLC类型告知接收者。“响应”是对XID命令消息的回答。它包含了与XID命令相同的信息:X I D响应发送者的身份及所支持的LLC类型。
3) TEST:和XID一样,也有两种TEST消息:命令与响应。TEST用于检测一个包是否能发送给接收者并返回。TEST命令中包含了任意的数据,而TEST响应中包含的数据是从相应的TEST命令中复制的。
在XID和TEST中,命令与响应包是根据SSAP字段中的一位来区分的。802委员会认为没有人会从一个组SAP发送包,所以SSAP中的G/I(组/个体)位被用来区分命令/响应。
在LLC类型2中,CTL字段可以是1个或2个字节长,这取决于包的类型。CTL字段为2个字节长的包类型包含了一个序列号,这些包如下:
1) I(信息)是一个数据包。此时,CTL为2个字节,其中的7位是由源端S到目的端D的数据包的序列号,再加上从D到S的7位确认包序列号。
2) RR(接收就绪)是一个确认包。它包含一个序列号,表明所有小于这个序列号的数据包都已经收到,也表明接收者现在可以接收更多的数据。
3) RNR(接收未就绪),和RR一样,是一个对早先发送的数据包(序列号小于RNR中序列号的那些数据包)的确认。但RNR表明的是目前接收方处于繁忙状态,发送方在接到RR以前,应不再发送新的数据包。
4) REJ(拒绝)表明接收方要求重传从所指定序列号开始的数据包。
CTL字段为1个字节长的其他LLC类型2的包类型如下:
1) SABME(设置扩展的异步平衡模式)请求建立连接。这个怪名字的来源有历史的原因。
2) DISC(释放连接)请求终止连接。
3) DM (断开连接模式)是对DISC的响应,表明接收方已经收到DISC。
4) FRMR(帧拒绝)表明收到了一个无效帧,如一个序列号出错的帧。
5) UA(非编号的确认)确认一个DISC或者SABME消息。
10. 802.3中的问题
802.3 LAN的访问是竞争式的,这种技术称为CSMA/CD(带冲突检测的载波侦听多路访问)。“载波侦听”表示希望发送的站点先要侦听线路,如果其他站点正在发送,则等待到线路空闲为止。“多路访问”是指多个站点共享媒体。“冲突检测”是指站点在发送时要监测媒体,从而知道是否有冲突发生—即有其他站点同时在发送。当线路空闲时,如果有2个站点同时企图开始传输数据,就会导致冲突的发生。而且,即便不是同时开始传输,也有可能导致冲突。当一个站点开始传输时,它的信号被其他站点检测到需要一段时间的延迟,特别是对于另一个位置比较远的站点。因此,线路越短,冲突的可能性就越小(见下图)。

最初的CSMA/CD LAN是由施乐公司设计的,称为以太网。它的设计目的是为了让发送方能知道它所发送的数据是否因为发生了冲突而失败。为了达到这个要求,不得不限制线路的长度,包也有最小长度的限制。在最坏的情况下,线路一端的站点发送了数据后,在其第一个字节刚要到达另一端前,另一端的站点开始发送数据。这样,第一个站点要等待信号从一端发送到另一端所需时间的2倍后,才能检测到冲突的发生。这段时间被称为“时间槽(slot time)”。假定线路的最大长度为2.5公里,给定线路上的电子传输速率,并假定按10Mb/s的速率进行数据发送,这就需要化512bit的倍数才能检测到冲突。因而,每个包至少应为512位长,因为如果站点完成了包的发送,且在这期间没有检测到冲突,它就会认为传送成功了。有些协议可能想发送更短的包,但这些包必须填充以达到所要求的最小长度。
802.3LAN特有的一个问题是:委员会并不是仅仅规范了以太网,实际上还做了某些修改。虽然802.3标准的硬件能与以太网的硬件兼容(即两种类型的站点可以共存于一段线路上),但报头格式稍有不同。以太网和802.3的报头如下图:

有必要采取措施使一个站点可以同时接收这两种格式的包。幸好这两种格式是可以区分的,因为802.3中2字节的“长度”字段正好对应以太网中的“协议类型”字段。802.3最大的合法包长度为1500字节,而施乐公司保证了在以太网上使用的协议类型的值肯定不小于1500 。实际上,802.3标准之前的一些协议类型所分配的值是小于1500的,因此它们必须重新分配(使其大于1500)。因而,当一个站点收到一个包时,如果源地址之后的字段的值小于1500,则认为该包是802.3格式的,否则是以太网格式的。
这两种格式间的另外一个不同是,在以太网中使用协议类型,而在802.3中使用2个SAP字段。目前,802.3中的SAP字段按下面两种方式之一(除去XID和TEST)使用:
* 使用802批准的协议,此时DSAP =SSAP,且等于全球分配的SAP值;
* 或者DSAP=SSAP,等于全球分配的SNAP SAP值,且在CTL字段后面是5字节的/8协议类型字段。
11.802.5中的问题
令牌环具有一个很好的特性———每个包都要经过每个站点,源站点在接收到它发出的包后就可以将其从环上删除。这样,目标站点可以在包上作标记以告知源站点该包已经被接收到(至少已被硬件接收到,因为即使硬件已接收了包,目标站点上的拥塞还是可能使包被丢弃的)。
在802.5标准中,每个包的最后有两位被目标站点用做确认。其中一位是A标志位,表明在令牌环中存在包中地址所指定的目标站点。另一位是C标志位,表明目标站点已经将包复制进自己的缓存中。如果A标志被设置而C标志被清除,说明目标站点暂时正忙:虽然目标站点知道应该复制该包,但是由于拥塞而无法复制。从理论上说,如果源站点发送一个包,且该包环绕后回到源站点,则源站点可以通过检查A和C标志作出如下推测:
1) 如果A标志是清除的,说明目标站点不存在或不活动,所以不必重传该包。
2) 如果A标志和C标志都被置位,说明目标站点已成功接收了该包,所以也不必重传该包。
3) 如果A标志被置位而C标志清除,说明目标站点暂时正拥塞,立刻重传很可能会成功。
4) A标志清除而C标志置位,这种组合被认为是无意义的,不少实现中都会把这种情况当作一个错误。
尽管这两个标志位对于令牌环来说是很好的,但是对于网桥而言这两个标志却不太有意义。
网桥对它们的处理有很多种选择,下面是其中的几种:
1) 总是清除这两个标志位。
2) 对这两个标志位不做任何修改。
3) 在转发包时设置A位,清除C位。
4) 在转发包时清除A位,设置C位。
实际应用中使用第四种方法。
A标志和C标志还有其他的用途,这两个标志可以帮助令牌环上的站点确定它们之间的物理顺序。一个站点发出一个目的地址是所有站点(allstations)的包。环上的下一个站点将接收到一个A位未置位的包,所以它知道自己是源站点的邻接站点并将A置位。而其他下游站点不能得出这个结论。每个站点依次发出这种特殊的包,向下游的直接邻接站点表明自己。不过, A和C标志的这些用法对于网桥和路由器是没有意义的。
802.5的另一个问题是,所使用的芯片并不支持真正的组播地址。相反,它们支持“功能地址”(functional address),只有31位,因为有17位是常数,之后才是31位,而802.5类型的组播地址只设了一个标志位(注意:从技术的准确性角度说,我希望称它们为“无功能”地址,但我想市场营销人员会认为功能地址听起来更好)。由于802.5的芯片不支持接收真正的组播地址,原来被指定为使用某个组播地址的协议,必须转而要求得到一个31位的功能地址。另外,连接802.5和其他LAN的网桥还必须注意两件事情:一是某个协议在非802.5 LAN上的组播地址与该协议在802.5上的功能地址之间的映射关系;二是如果使用了多于231个组播地址,则需要有一个复用机制,使得几个组播地址可以映射到同一个功能地址上。实际上, 231个功能地址要比组播地址(247个,超过100万亿)少得多。即使新的802.5芯片开始支持真正的组播地址,与现有设备的向后兼容性也会使802.5和其他LAN间的桥接变得很复杂,因为需要在组播地址和功能地址间作转换。
12.包的突发性
许多站点都不能长时间地以LAN中的传输速率来处理包。这基于如下假设:如果LAN的总带宽(比方说)是10Mb,则单个站点并不需要那么快地处理包,因为给某个站点的通信量远低于10Mb。但包有可能突发性地到达,而超出了站点的接收能力。虽然每个站点通常都有一定大小的缓冲区,但是只要处理包的速度跟不上包到达的速度,缓冲区就迟早会溢出。如果发生这种情况,最早到达的那些包能够得到处理,而后来的包都将丢失。理解这种情形非常重要,因为有些协议在这种情况下可能永远无法工作。假设有一个“申请─回复”协议,站点通过它从另一个站点请求数据。如果有一部分数据没有接收到,则站点会重新提出同样的申请。假设数据需要用10个包来传输,发送方同时发送所有这10个包,而请求方只能缓存2个包,那么这个传输就永远无法实现,因为每次请求者接收回复时,它的硬件只能接受头2个包而其余的包被丢弃。
13.需要网桥的理由
前面几节所讨论的技术都有某些限制:
1)站点数的限制:在令牌环网中,每加入一个站点到环中,都会增加时延,即使它不发送数据。
2)大小的限制:在802.3中,线路需要充分的短,以便让站点在传输一个合法的最小的包时,能够检测到冲突。
3)通信量的限制:在所有的LAN中,多个站点共享带宽。LAN上的站点越多,以及希望传输数据的站点越多,每个站点能够分配到的带宽就越小。
由于这些原因,单一的L A N很难适合一个组织的需求。如果一个站点需要通过路由器把包发送给另外一个地区的站点,则这个站点需要实现能和路由器协作的网络层协议。这样,就可以通过路由器把多个LAN连接在一起。但是,如果一个站点只是在一个单一的LAN里接收/发送数据,那么它们一般都没有实现网络层,因而不能使用路由器。因为很多的站点没有设计网络层,但确实需要有一个“盒子”来连接LAN,使得包可以在LAN间转发,而不需要站点间的协作。这样的“盒子”称为网桥。虽然最初设计网桥的目的是为了适应那些没有网络层的站点,但实际上,网桥非常有用,它可以支持所有的网络层协议,这样不少组织同时运行了很多网络层协议。多协议路由器还没有被广泛应用的时候,网桥可以起到相同的作用,在不同网络层协议之间传递数据。现在多协议路由器使用得越来越多了,而且人们厌倦了各种各样的网络层协议,开始慢慢地汇集到IP上来。但是网桥始终很受欢迎,因为它简单、性能高,且允许IP站点在网桥的拓扑结构里移动而保留它的网络地址。
14. 点对点链路
有两个问题和LAN及点对点链路都相关:
1)服务:传统上,为点对点链路设计的数据链路层协议是提供可靠服务的。如果每条链路上的出错率都比较高,则逐跳的可靠服务是非常重要的。否则,通过多跳成功传输一个包的可能性会变得非常小,意味着源端需要重发无数次。HDLC和DDCMP是数据链路层提供可靠服务的例子。技术改进后,数据链路层上的数据报服务不但更易于接受,而且性能也提高了。PPP(点对点协议)是由TCP/IP体系为点对点链路开发的提供数据报服务的数据链路层协议。它本质上就是一个简化的HDLC。PPP与HDLC之间的关系类似于LLC的类型1与类型2之间的关系。下图为HDLC的格式。

Flag是个特殊的位模式,表示数据包的开始和结束。当一条链路上有多于2个站点时,地址是必需的。在一个LAN中,有2个地址是必需的:一个是源地址,另一个是目的地址。但是,HDLC并不是为LAN设计的,而是为有一个主机(master)和多个分机(tributary)的多点访问链路设计的。这种链路上的分机之间并不传送包,包只能在主机与分机之间传输。包从主机传给分机时,地址字段指出将要接收包的分机;由分机传给主机时,地址字段指出发送这个包的源。控制字段的含义与LLC类型2中的含义相同。数据字段和校验和字段的意义是明显的。
2) 复用:和LAN一样,多个高层协议可以复用在同一条链路上。除非所有协议的设计使得所有的包都不会发生混淆,否则必须有一些字段来澄清包所属的协议类型。在LAN中,有一个协议类型字段。传统的数据链路层协议并没有一个协议类型字段,PPP为此增加了一个16位的“协议”字段,其格式如下图:

地址字段被设为全1,控制字段是个单字节,设为3(HDLC将其视为“未编号的信息”)。协议字段长为2个字节,它所定义的值见“ assigned numbers”R F C(RFC 1700)。
0 Response to “影响网桥和路由器的数据链路层问题”