自20世纪70年代局域网技术提出以来,各种局域网技术不断产生,其中有的技术发展壮大,而有的技术逐渐被淘汰。现阶段成熟的局域网技术有三种:以太网(Ethernet)、令牌环(Token Ring)和光纤分布式数据接口(FDDI),其中以太网技术逐步成为局域网技术的主流。
以太网是在1972年开创的,Bob Metcalfe(被尊称为“以太网之父”)被Xerox雇佣为网络专家,Bob Metcalfe来到Xerox公司的Palo Alto研究中心(PARC)的第一个任务是把Palo Alto的计算机连接到Arpanet(Internet的前身)。1972年底,Bob Metcalfe设计了一套网络,把Alto计算机连接起来。在研制过程中,因为该网络是以ALOHA系统(一种无线电网络系统)为基础的,而又连接了众多的ALTO计算机,所以Metcalfe把它命名为ALTO ALOHA网络。ALTO ALOHA网络在1973年5月开始运行,Metcalfe把这个网络正式改名为以太网(Ethernet),这就是最初的以太网试验原型,该网络运行的速率为2.94Mbps,网络运行的介质为粗同轴电缆。1976年6月, Metcalfe和Boggs发表了题为:“以太网:局域网的分布型信息包交换”的著名论文。1977年底,Metcalfe和他的三位合作者获得了“具有冲突检测的多点数据通信系统”的专利,多点传输系统被称为CSMA/CD(带冲突检测的载波侦听多路访问)。从此,以太网就正式诞生了。
70年代末,涌现出了数十种局域网技术,以太网正是其中的一员。1979年,Digital Equipment Corporation(DEC)、Intel公司与Xerox公司联盟,促进了以太网的标准化。1980年9月30日,DEC、Intel和Xerox公布了第三稿的“以太网,一种局域网:数据链路层和物理层规范,1.0版”,这就是现在著名的以太网蓝皮书,也称为DIX(取三家公司名字的第一个字母而组成的)版以太网1.0规范。如前所述,最初的实验型以太网工作在2.94Mbps,而DIX规范定义的以太网工作在10Mbps。1982年,DIX联盟发布了以太网的第二个版本,即Ethernet II。
在DIX联盟开展以太网标准化工作的同时,IEEE组成一个定义与促进工业LAN标准的委员会,这就是我们今天熟知的802工程委员会。IEEE 802委员会成立了不同的工作组,每个工作组研究不同的LAN技术。DIX联盟虽已推出以太网规范,但还不是国际公认的标准,所以在1981年6月,IEEE 802工程决定组成802.3分委员会,以产生基于DIX工作成果的国际公认标准,1983年6月IEEE 802.3工作组发布了第一个关于以太网技术的IEEE标准,即IEEE 10BASE5。
10BASE5技术与DIX的Ethernet II在技术上是有差别的,不过这种差别甚微。10BASE5的速率仍然是10Mbps,使用的传输介质仍然是粗同轴电缆,允许节点间的最长距离为500米。1984年美国联邦政府以 FIPS PUB107的名字采纳802.3标准。1989年ISO以标准号 IS88023采纳802.3以太网标准,至此,IEEE标准802.3正式得到国际上的认可。
随着以太网技术的商业化,使用粗同轴电缆作为传输介质的缺点逐渐暴露,粗同轴电缆价格昂贵,需要外接MAU收发器,不易安装。80年代初逐渐出现了一些基于细同轴电缆的以太网技术和产品,1984年,IEEE 发布了10BASE2的标准,10BASE2采用细同轴电缆作为传输介质,允许节点间的最长距离为200米。
10BASE5和10BASE2都是一种物理总线型拓扑,所有的节点连接在同一根总线,总线上的所有节点共享带宽。这种物理总线型的拓扑有一个致命的缺点,容易出现总线某处断裂而使整个网络瘫痪的问题,不便于查找故障,而且如果用户进行节点的移动,必须重新布线,不利于结构化布线。这时就提出了在非屏蔽双绞线(UTP)电话电缆上运行以太网的想法,最后证实在3类非屏蔽双绞线上可以运行1Mbps的低速以太网,1986年,IEEE接纳了这种低速以太网标准,命名为1BASE5,这就是著名的StarLAN。StarLAN有它自身的优点:便于安装、配置、管理和查找故障,而且成本较低;这种物理星型的拓扑是以太网的一个突破,因为它允许采用结构化布线系统,它用单独一根线将每个节点连接到中央集线器,这对于安装、故障寻找和重新配置显然是一个明显的优点,可以大大降低整个网络的成本。但1BASE5把以太网的速率从传统的10Mbps降低到了1Mbps,很多厂商认为这是以太网的一个后退,因此1BASE5很快走向了灭亡。
1BASE5使得以太网走向星型的结构化布线,但是速率是它的限制,于是IEEE开始在UTP在运行10Mbps以太网的研究,1990年,IEEE 802.3i 标准发布,公布了10BASE-T技术。此后出现了10 BASE-T中继器、双绞线介质附属件(MAU)和NIC网络接口卡,这些使得以太网市场急剧增长。星形结构化布线结构的出现是以太网发展史上的伟大里程碑。它使令牌环(Token Ring)失去了它的两个优势:结构化布线、采用双绞线布线。
同时随着光缆的发展,在光缆上运行以太网成了研究的一个课题,随后逐步出现了10BASE-F,10BASe-FL,10BASE-FP,10BASE-FB等在光缆上运行以太网的技术标准。
前面的技术不管是物理总线型拓扑结构、还是物理星型拓扑结构,LAN中的用户都是共享带宽的,都要争用带宽,存在冲突。90年代初,逐渐出现了多端口网桥,用于多个LAN的互连。共享式以太网逐渐向LAN交换机发展。1993年,Kalpana公司使以太网技术有了另外一个突破——全双工以太网。全双工的优点是很明显的,可以同时发送和接收数据,这在理论上可以使传输速度翻一番。
90年代初,随着网络的发展,10Mbps的速率限制了一些大网络的运行,此时以太网受到了FDDI的巨大冲击。FDDI是一种昂贵的基于100Mbps光缆的LAN技术。1992年,Grand Junction公司成立,开始研制100Mbps的以太网。1993年,以Grand Junction为首的多家公司成立了快速以太网联盟(FEA)。1993年10月,FEA公布了它的100BASE-X互操作规范,1995年3月,IEEE802.3u规范被它的成员和执委会所通过。于是快速以太网的时代宣布来临。1995年末,各厂家日新月异地不断推出新的快速以太网产品,快速以太网达到了鼎盛时代。
1995年11月,IEEE802.3标准委员会组建了一个新的“高速研究组(High-Speed Study Group)”,研究1000Mbps速率的以太网。1996年3月,IEEE组建了新的802.3z工作组,负责研究干兆位以太网,制订相应的标准。1998年,IEEE发布802.3z,1000Mbps的以太网标准。
2002年,10GE以太网标准802.3ae正式发布,10GE以太网与1000M以太网相比,10GE只支持全双工,只支持光纤作为传输介质,10GE可以应用于广域网WAN物理层技术SONET/SDH。
随着以太网技术的发展,以太网已经不仅仅局限于一种局域网技术,以太网技术逐渐应用于城域网MAN和广域网WAN。
以太网是一种共享介质的局域网技术,多个站点连接到一个共享介质上,同一时间只能有一个站点发送数据。这种共享介质的通信方式必然存在一个冲突的问题,如何检测链路是否空闲,站点能否发送数据是共享链路必须解决的问题。
这种同一链路连接多个终端,就是多路访问。多路访问控制有多种协议,如随机访问控制协议、受控访问控制协议、通道化协议。随机访问控制协议中所有连接在共享介质上的终端都具有平等的发送数据的概率,也没有轮询机制,随机访问控制协议技术主要有:MA、CSMA、CSMA/CD、CSMA/CA。受控访问控制协议是一种轮询机制,通过轮询控制哪个站点来发送数据,主要技术有:预约、轮询、令牌传递。通道化协议是一种复用技术,主要技术包括:FDMA、TDMA、CDMA。
图1 多路访问控制协议分类
以太网采用了随机访问控制协议中的CSMA/CD(Carrier Sense Multiple Access with Collision Detection,带有冲突检测的载波侦听多址访问)方法作为多路访问控制协议。我们可以将CSMA/CD比作一次交谈,在这个交谈中每个人都有说话的权力,但是同一时间只能有一个人说话,否则就会混乱,每个人在说话之前先听是否有别人在说话(即载波侦听),如果这时有人说话,那只能耐心等待,等待别人结束说话,它才可以发表意见。另外,有可能两个人同一时间都想开始说话, 此时就会出现冲突,但当两个人同时说话时,两个人都会发现他们在同一时间讲话(即冲突检测),这时说话立即终止,随机的等待一段时间后(回退),再开始说话。这时第一个开始说话的人开始说话,第二个人必须等待,直到第一个人说完后才开始说话。
以太网的CSMA/CD工作方式与以上类似,图2为站点发送数据帧的流程图。当一个站点有数据帧要发送时,它开始检测物理介质是否空闲,这个过程称为载波侦听。如果此时介质忙,则只能耐心等待,推迟数据帧的发送。
如果载波侦听过程中发现介质空闲,则必须等待IFG(Inter Frame Gap)时间让物理信道恢复平稳,同时也让接收者对接收的帧作必要的处理。等待IFG时间后开始发送数据帧。如果这时没有其他站点要发送数据则不会发生冲突,站点可以完整的把数据帧发送完毕,重复下一次发送过程,继续发送下一个数据帧。
图2 CSMA/CD发送数据帧流程图
如果同一时间有多个站点要发送数据,那么就会发生冲突。冲突发生后,发送站点要持续发送一段时间的干扰信号(jamming),发送干扰信号的目的是为了确保共享介质上的所有站点都能够检测到这时以太网上已产生了冲突。然后发送站点终止未发送完的数据帧的发送,等待一个随机时间,这就是回退(backing off),等待的这个随机时间称为回退时间(backoff time)。
回退时间是SlotTime(SlotTime是传送最短以太网帧所需要的时间,对于10M和100M来说为传送512bit所需要的时间,10M是51.2微秒,100M是5.12微秒)的整数倍,回退时间的取值范围与检测到冲突的次数有关,每次检测到冲突后,r选择一个从0到2 k的随机整数
0≤r<2k ,这里 k=MIN {n,10}, n 为检测到冲突的次数。
回退时间为 r×SlotTime.
例如开始传送数据帧后,第一次检测到冲突后需要等待0-1倍SlotTime时间,第二次检测到冲突后等待0-3中随机整数个SlotTime 时间,以此类推。
当检测到的冲突次数超过最大重试次数(通常为16),则表示该数据帧发送失败,停止该数据帧的发送,通知网络管理员发生错误并丢弃数据帧,或者只是简单的丢弃数据帧,然后重置回退时间为0,开始冲突检测准备发送下一个数据帧。
在“以太网发展史”一节中说过,DIX联盟1980年发布以太网的第一个版本,Ethernet I,1982年,DIX联盟又发布以太网的第二个版本,即Ethernet II,1983年IEEE发布了第一个关于以太网的标准,IEEE发布的标准与DIX的Ethernet II在技术上是有差别的,其中一个差别就是关于以太网帧的封装上。Ethernet II采用了Type封装,而最初的802.3采用的Length封装,因此Length封装也称为raw 802.3封装,目前只有IPX支持Raw 802.3封装,以Length字段后紧跟0xFFFF标识。最初的IEEE 802.3标准不支持Type封装,但是Type封装使用极为广泛,在1997年,IEEE 802.3接纳了Type封装,所以Ethernet II封装有时又称为802.3 Type封装。
Preamble/SFD(Start-of-Frame Delimiter):每个以太网帧发送时都是以8个字节的前导码开始,Preamble是1和0交替(1 0 1 0 1 0…….)的7个字节数据,该部分的作用是通知接收方有数据帧到来,使其与输入的时钟保持同步,56bit 模式容许站点在帧的开始可以丢弃一些bit。SFD是一个字节10101011,最后使用11,来通知接收方下一字段就是目的主机的地址了。实际上前导码都是在物理层加进去的,并不是帧的一部分。
DA(Destination Address):6个字节,目的节点的MAC地址。
SA(Source Address):6个字节,源节点的MAC地址。
Type/Length:2字节,根据数值的不同代表2种不同的封装格式,如果字段值在0x0000-0x05DC范围内,则表示该字段为Length,该帧为802.3 raw封装。如果字段值在0x0600-0xFFFF范围内,则表示该字段为Type字段,该帧为Ethernet II封装,0x05DD-0x05FF保留没有使用。
PayLoad:上层协议有效载荷,最小为46字节,最大为1500字节,对于Type封装格式,上层协议必须保证该字段的值大于46字节,对于Length封装,对于有效载荷不够46字节的报文链路层必须进行填充。
FCR:4字节的校验和。
另外以太网还有如下所示的封装格式:
802.3/802.2 LLC封装
DA(6) | SA(6) | Length(2) | DSAP(1) | SSAP(1) | Ctr(1) | Data |
802.3/802.2 SNAP封装:
DA(6) | SA(6) | Length(2) | 0xAA | 0xAA | 0x03 | Org Code(3) | PID(2) | Data |
802.3/802.2 SNAP RFC 1042封装:
DA(6) | SA(6) | Length(2) | 0xAA | 0xAA | 0x03 | 00-00-00 | Type(2) | Data |
802.3/802.2 LLC封装中,DSAP、SSAP用来标志上层协议,比如NetBios为0xF0,IPX为0xE0。
802.3/802.2 SNAP 中Org Code代表机构编码,是全球唯一的表示组织机构的代码OUI,PID(Protocol Identifier)是协议标志,每个组织机构可以有独立的协议标识。如苹果公司的OUI为08-00-07,其AppleTalk协议的PID为0x809B,这种封装中Org Code+PID唯一标识一个上层协议。
802.3/802.2 SNAP RFC1042封装,Org code使用一个特殊的数值00-00-00,当这个字段为00-00-00时,Type字段与Ethernet II封装中的Type具有相同的含义。
IP协议支持两种封装,分别是Ethernet II封装和SNAP RFC1042封装,Type均为0x0800,IPX协议支持四种封装Ethernet II、SNAP RFC1042、raw 802.3、802.3/802.2 LLC,在Ethernet II和SNAP RFC1042封装中,Type字段为0x8137,raw 802.3封装在Length后紧跟0xFFFF标志。802.3/802.2 LLC封装中,DSAP和SSAP=0xE0。Apple Talk支持Ethernet II和SNAP RFC1042封装,Type均为0x809B。
目前使用最广泛的是Ethernet II封装。802.3/802.2 SNAP封装使用很少,因此一般所说的SNAP封装都指SNAP RFC1042封装。
我们通常所说的10M、100M,1000M、10GE,这些都是指物理介质每秒可以传送多少bit的数据。在我们实际中经常使用每秒传送实际数据帧的数目即PPS(packets per second)来表示报文的速率。下面介绍对于以太网来说如何进行链路速率与pps之间的换算。
以太网传送数据时,每两个帧之间存在帧间隙IFG(Inter Frame Gap),帧间隙的作用是使介质中的信号处于稳定状态,同时让帧接收者对接收的帧作必要的处理(如调整缓存取的指针、更新计数、发中断让主机对报文进行处理)。对于Ethernet(10M)帧间隙时间为9.6usec,100M快速以太网帧间隙为0.96usec,1000M帧间隙为0.096usec,10GE帧间隙为0.0096usec,这个时间正好相当于传送96bit数据的时间。
下面我们看怎么把以太网速率与pps进行换算,假设数据帧的长度为 k bytes(包括CRC),端口速率为R,转化后的PPS为N,那么:
N=R/(k×8+8×8+96)
其中k×8表示实际数据帧的长度(bits),8×8表示前导码(Preamble+SFD)的长度,96bit相当于帧间隙占用的bits。
下面举例说明,假设端口速率为100M,发送数据帧的长度为64字节,那么线速发送报文换算成pps后,
N=100 000 000/(64×8+8×8+96)≈148810 pps
我们知道在传统的以粗同轴电缆为传输介质的以太网中,同一介质上的多个节点是共享链路的带宽,争用链路的使用权,这样就会发生冲突,CSMA/CD机制中当冲突发生时,网络就要进行回退,这段回退的时间内链路上不传送任何数据。而且这种情况是不可避免的。当同一介质上的节点越多,冲突发生的概率也就会越大。这种连接在同一导线上的所有节点的集合就是一个冲突域。使用同轴电缆和HUB连接的主机就属于一个冲突域。他们共同的特征是所有的节点都要共享带宽,会发生冲突,且一个节点发出的报文(无论是单播、组播、广播)其余节点都可以收到。
由于各种各样的原因,网络中使用了广播,例如TCP/IP中的ARP使用广播从IP来解析MAC地址。目的MAC为FFFF-FFFF-FFFF的地址是广播地址,这个地址将使所有的节点都处理这个数据帧。广播会占用带宽,而且降低节点的处理效率,必须对广播加以限制。这种一个站点发送一个广播报文其余节点能够接收到的节点的集合,就是一个广播域。传统的网桥(Bridge)可以根据MAC表对单播报文进行转发,对于广播报文向所有的端口都转发,所以网桥的所有端口连接的节点属于一个广播域,但是每个端口属于一个单独冲突域。
传统的二层交换机所有端口都属于一个广播域,这样就不便于管理和网络变化,假设一个用户现在属于工作组1,与工作组1内的用户在同一个LAN中,一段时间后要把该用户划分到工作组2中,要加入到工作组2中的LAN,那么必须重新连线。这种给网络管理带来了不方便。这样就在传统二层交换机上引入了VLAN(Virtual LAN)。每个VLAN中的所有节点在同一个广播域,每个VLAN是逻辑LAN,VLAN之间是二层隔离的。
在10BASE5和10BASE2的总线型拓扑中,同一时刻只能有一个节点发送数据。随着10BASE-T和hub的出现,网络节点的连接变成了点到点的连接。在节点之间点到点连接中,同一节点同一时刻只能接收或发送数据,不能同时接收、发送数据。这种同一时刻只能接收或发送数据的工作模式为半双工模式。在半双工模式下,使用CSMA/CD的机制来避免冲突。
全双工模式下,同一时刻可以同时接收和发送数据帧。
自协商功能允许一个网络设备能够将自己所支持的工作模式信息传达给网络上的对端,并接收对方可能传递过来的相应信息。对于两端处于自协商工作方式的设备,最终协商的结果是采用二者技术能力域中优先级低的网口提供的工作方式工作。协商级别一般为1000Mfull,1000Mhalf,100Mfull,100Mhalf,10Mfull,10Mhalf。
10BASE-T的以太网接口(它只支持10M,不支持自协商)在链路UP之前会发送Link Test Pulse(LTP),该脉冲用以检测链路是否应该UP;而100BASE-T以太网接口(它只支持100M,不支持自协商)在链路UP之前会发送FAST ETHERNET IDLE流,用以检测链路是否应该UP。
支持自协商(Autonegotiation)的以太网接口则在链路UP之前发送FLP(Fast Link Pulse),FLP实际上是一组LTP和数据脉冲的组合,它们表明一种含义:例如我支持100M全双工。较旧的设备例如10BASE-T仍然将这些FLP识别为LTP,而自协商设备则能够识别FLP的含义并通过交互这种握手信息来使链路成为最优配置。如果自协商设备看到有一般的LTP(不是有特定含义的FLP)输入,它就将本端设置为10M半双工。如果自协商设备看到有FAST ETHERNET IDLE输入,它就将本端设置为100M半双工。以上所述的自协商机制只对10/100兆铜缆接口或千兆光/电口有效,100BASE-FX不支持自协商。
千兆自协商和10/100兆自协商使用同样的机制,1000BASE-LX和1000BASE-SX使用自协商机制来协商双工和流控。1000BASE-T设备的自协商还会包含附加域(例如是MASTER还是SLAVE)的协商。千兆设备几乎没有半双工的情况(虽然可以协商),所以很多双工的问题都不存在了。
流控指当接收者没有能力处理接收到的报文时,为了防止丢包,接收者需要通知报文的发送者一段时间内停止发送报文。
对于半双工模式和全双工模式,流控通过不同的方式来实现。在全双工模式下,接收者通过发送一种特殊的数据帧来通知发送者,停止发送报文,这种特殊的数据帧称为PAUSE帧,下面是PAUSE帧的结构:
图3 PAUSE帧格式
PAUSE帧的长度固定为64字节(包括CRC),PAUSE帧的目的MAC为组播MAC :0180-c200-0001,源MAC为发送PAUSE帧的节点的MAC,LENTH/TYPE字段固定为0x8808。MAC CONTROL PARAMETERS字段表示要求发送者暂停发送流量的时间,数值有效范围为0-65535, 单位为512bit time(bit time指链路上传输1bit需要的时间,如100M链路bit time为10ns)。如果数据报文的接收者在发送PAUSE帧后,在PAUSE帧发送的等待时间超时之前可以处理数据报文,则再发送一个等待时间为0的PAUSE帧通知数据发送者开始发送数据。
PAUSE的接收者(也是数据报文的发送者),收到PAUSE帧后会根据PAUSE帧中的等待时间停止发送报文,等待时间超时后继续发送报文。
半双工模式下,以太网利用CSMA/CD机制处理冲突和链路使用问题。根据CSMA/CD机制,半双工的模式下,采取的流控方式为Backpressure,即背压。该种方法有两种实现,一个是数据接收者有意制造一次冲突,数据发送者检测到冲突采取Backoff,这样就延缓了数据的发送;另外一个方法是制造载波信号,使数据发送者感觉到接收者要发送数据,从而通过检测到载波而进行延时传输。