计算机网络学习笔记-3 数据链路层
第三章 数据链路层
使用点对点的信道的数据链路层
数据链路和帧
链路(link)就是从一个结点到相邻接点的一段物理线路(有线或无线),而中间没有任何的交换节点。链路只是一条路径的组成部分。
数据链路(data link)是除了一条物理线路外,加上一些必要的通信协议来控制数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
最常用的方法是使用网络适配器来实现这些协议。
同时,也有另一种说法把链路分为物理链路和逻辑链路。物理链路就是上面所说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。
早期的数据通信协议曾叫做通信规程(procedure)。因此在数据链路层,规程和协议是同义语。
数据链路层的协议数据单元——帧。
数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。互联网中,网络层协议数据单元就是IP数据报(或简称为数据报、分组或包)
点对点信道的数据链路层在进行通信时的主要步骤如下:
结点A的数据链路层把网络层交下来的IP数据包添加首部和尾部封装成帧。
结点A把封装好的帧发送给结点B的数据链路层。
若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出IP数据包交给上方的网络层;否则丢弃这个帧。
三个基本问题
1.分装成帧
封装成帧(framing) 就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。
所有在互联网上传送的数据都已分组(即IP数据报)为传送单位。一个帧的帧长等于帧的数据部分(即网络层传递下来的IP数据报) + 帧首部 + 帧尾部的长度。
首部和尾部的一个重要作用就是进行帧定界(确定帧的界限)。同时首部和尾部还包含了很多必要的控制信息。
每一种链路层协议都规定了所能传送的帧的数据部分长度上限——最大传送单元MTU(Maximum Transfer Unit)。
当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。控制字符SOH(Start Of Header)放在一帧的最前面(十六进制为01),控制字符EOT(End Of Transmission)放在一帧的最后(十进制为04)。
2.透明传输
虽然正常的输入文本时,不可能从输入设备上输入出SOH和EOT,但是在传送非ASCII码的文本文件时,如果数据中的某个字节的二进制代码恰好和SOH或者EOT这种控制字符相等,就会造成数据链路层错误的判断帧的结束。
透明:某一个实际存在的事务看起来却好像不存在一样。通过在数据部分中和控制字符二进制一致的数据前添加一个转义字符ESC (十六进制为1B)。这种方法被称为字节填充(byte stuffing)或字符填充(character stuffing)。如果转义字符也出现在数据中,就在转义字符前面再加一个转义字符,接收端收到两个连续的转义字符后会自动删除前面的那个。
3.差错检测
现实的通信链路传输的正确率不可能是100%,0和1之间可能会混淆,这就叫做比特差错。
传输错误的比特占所传输比特总数的比率为误码率BER(Bit Error Rate)。
目前在数据链路层广泛使用了循环冗余校验CRC(Cyclic Redundancy Check)的检错技术。
CRC计组里有详细介绍。。。就不在此赘述了。
在传递时,会在数据尾部添加冗余码,然后构成一个帧发出去。接收端接收到之后会通过CRC检验判断帧是否有差错。
如果有差错就直接丢弃。
若数据链路层仅仅使用循环冗余检验CRC差错检测技术,则只能做到对帧的无差别接受。即“凡是数据链路层接受的帧,都是几乎可以完全认为都是正确的。“
通常这样认为:“凡是接收端数据链路层接受的帧均无差错。”
如果说在传输过程中没有出现比特差错,但是出现了帧丢失、帧重复或帧失序。(以帧为单位的错误)
为了解决这个问题,在CRC检错的基础上,添加了帧编号、确认和重传机制。
收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,进行重传,直到收到对方的确认为止。
对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制。如果在数据链路层传输数据时出现了差错并需要进行改正,那么改正差错的任务就有上层协议完成。
对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务。
这样可以提高通信效率。
点对点协议PPP
点对点协议PPP(Point-to-Point Protocol)是目前使用的最广泛的数据链路层协议。
PPP协议的特点
PPP协议应满足:
- IETF把“简单”作为首要的需求。简单的设计还可以使协议在是现实不容易出错,从而使不同厂商在协议的不同实现上的互操作性提高。
- 接收方没接收到一个帧,就进行CRC检验,正确就收下,反之就丢弃这个帧,什么也不做。
- 封装成帧:PPP协议必须规定特殊的字符作为帧界定符。
- 透明性
- 多种网络层协议:PPP协议必须能在同一条物理链路上同时支持多种网络层协议的运行。
- 多种类型链路:PPP还必须能够在多种类型的链路上运行。
- 差错检测:PPP协议必须能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。
- 检测连接状态。
- 最大传送单元:PPP协议必须对每一种类型的点对点链路设置最大传送单元MTU的标准默认值。
- 网络地址协商
- 数据压缩协商
PPP协议的帧格式
FCS: CRC 的帧检验序列
PPP协议的工作状态
PPP协议的起始和终止状态永远是“链路静止”(Link Dead)状态,这时用户个人电脑和ISP路由器之间并不存在物理层的连接。
在双方建立了物理层连接后,PPP就进入了“链路建立”(Link Establish)状态。
然后LCP开始协商一些配置选项,即发送LCP的配置请求帧(Configure-Request)。
- 配置确认帧(Configure-Ack) 所有选项都接受
- 配置否认帧(Configure-Nak)所有选项都理解但不能接受
- 配置拒绝帧(Configure-Reject)选项有的无法识别或不能接受,需要协商
LCP配置选项包括链路上的最大帧长、所使用的鉴别协议(authentication protocol)的规约。
协商结束后双方就建立了LCP链路,进入”鉴别(Authenticate)“状态。
在这一状态下,若使用口令鉴别协议PAP(Password Authentication Protocol),则需要发起通信的一方发送身份标识符和口令。
如果需要更高的安全性,则可使用更加复杂的口令握手鉴别协议CHAP(Challenge-Handshake Authentication Protocol)。
若鉴别失败,转为“链路终止”状态。若鉴别成功,则进入“网络层协议”(Network-Layer Protocol)状态。
在该状态下,PPP链路的两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组。
当网络层配置完毕后,链路就可以进入数据 通信的“链路打开(Link Open)”状态。链路的两个PPP端点可以彼此向对方发送分组。两个PPP端点还可以发送回送请求LCP分组(Echo-Request)和回送回答LCP分组(Echo-Reply)来检查链路的状态。
数据传送结束后,可以由链路的一端发出终止请求LCP分组(Terminate-Ack)后,转到“链路终止”状态。
如果链路出现故障,也会从“链路打开“状态转到“链路终止”状态。
当调制解调器的载波停止后,则回到“链路静止”状态。
使用广播信道的数据链路层
局域网的数据链路层
局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。
局域网具有如下一些主要优点:
- 具有广播功能:局域网上的主机可共享连接在局域网上的各种硬件和软件资源。
- 便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变。
- 提高了系统的可靠性(reliability) 、可用性(availability)和生存性(survivability) 。
局域网可按网络拓扑进行分类。
现在以太网几乎成为了局域网的同义词。
共享信道要着重考虑的一个问题就是如何使众多用户能够合理而方便地共享通信媒体资源。这在技术上有两种方法:
- 静态划分信道:频分复用、时分复用、波分复用和码分复用等。用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价较高,不适合在局域网使用。
- 动态划分信道:它又称为多点接入(multiple access), 其特点是信道并非在用户通信时固定分配给用户。这里又分为以下两类:
- 随机接入:随机接入的特点是所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。
- 受控接入:受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网和集中控制的多点线路探询(polling),或称为轮询。
以太网的两个标准
以太网用无源电缆作为总线来传送数据帧,并以曾经在历史上表示传播电磁波的以太(Ether) 来命名。
为使数据链路层能更好地适应多种局域网标准,IEEE就把局域网的书库链路拆成了两个子层,即逻辑链路控制LLC(Logical Link Control)子层和媒体介入控制MAC(Medium Access Control)子层。
适配器的作用
计算机与外界局域网的连接是通过通信适配器(adapter)进行的。这种适配器又称为网络接口卡NIC (Network Interface Card)或简称为“网卡“。
在这种通信适配器上面装有处理器和存储器。适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而适配器和计算之间的通信则是通过计算机主板上的1/0 总线以并行传输方式进行的。因此,适配器的一个重要功能就是要进行数据串行传输和并行传输的转换。由千网络上的数据率和计算机总线上的数据率并不相同,因此在适配器中必须装有对数据进行缓存的存储芯片。在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来。适配器还要能够实现以太网协议。
适配器所实现的功能包含了数据链路层及物理层这两个层次的功能。
适配器在接收和发送各种帧时,不使用计算机的CPU 。这时计算机中的CPU 可以处理其他任务。当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机。当适配器收到正确的帧时,它就使用中断来通知该计算机,并交付协议栈中的网络层。当计算机要发送IP 数据报时,就由协议栈把IP 数据报向下交给适配器,组装成帧后发送到局域网。
CSMA/CD 协议
总线的特点:当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据,这种就是广播通信方式。
在发送数据时,在帧的首部写名接收站的地址。当数据帧中的目的地址于适配器ROM中存放的硬件地址一致时,该适配器才能接收到这个数据帧。适配器对不是发送给自己的数据帧就丢弃。
以太网采取了以下两种措施:
第一,采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。适配器对发送的数据帧不进行编号,也不要求对方发回确认。这样做可以使以太网工作起来非常简单。而局域网信道的质量很好,因通信质量不好产生差错的概率是很小的。因此,以太网提供的服务是尽最大的努力的交付,即不可靠的交付。当目的站收到有差错的数据帧时,就把帧丢弃,其他什么也不做。对有差错帧是否需要重新重传则由高层来决定。
如果高层需要TCP协议,那么TCP就会发现丢失了一些数据。于是TCP就把这些数据重新传递给以太网进行重传。但以太网并不知道这是重传帧,而是当做新的数据帧来发送。
总线再同一时间只能允许一台计算机发送数据。就好比有一屋子的人在开讨论会,想大眼的随时可以发言,不需要随手示意。如果你听见有人在发言,那么你就必须等别人讲完了才能发言(否则会干扰别人的发言)。但有时碰巧两个或更多的人同时发言了,那么一旦发现冲突,大家都必须停止发言,等听到没有人发言了你再发言。
以太网使用的协议是CSMA/CD,意思是载波监听多点接入/碰撞检测(Carrier Scene Multiple Access with Collision Detection)。
第二,以太网发送的数据都是用曼彻斯特(Manchester)编码的信号。
曼彻斯特编码的编码方法是把每一个码元再分成两个相同的间隔。防止多个1或0连接起来后,接收端无法才从收到的比特流中提取同步信号。
但是曼彻斯特编码的缺点也很明显,因为每秒传送的码元数加倍了,它所占的频带宽度比原始的基带信号增加了一倍。
多点接入:说明这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。协议的实质是“载波监听”和“碰撞检测”。
载波监听:载波监听就是检测信道,这是个很重要的措施。不管在发送前还是在发送中,每个站都必须不停地检测信道。
碰撞检测:也就是“边发送边监听”。即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。当几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(叠加)。当适配器检测到的信号电压变化幅度超过一定的阈值时,就认为总线上至少有两个站在同时发送数据,即产生了冲突。因此“碰撞检测”也称为“冲突检测”。一旦发现总线上出现了碰撞,其适配器就要立即停止发送,然后等待一段随机时间后再次发送。
讨论碰撞产生的原因
因为电磁波在总线上总是以有限的速率传输的。
电磁波在1km电缆上的传播时延约为5μs。
在局域网的分析中,常把总线上的单程端到端传播时延记为τ。
发送数据后,在2τ时间(两倍的总线端到端的传播时延)内一定可以知道是否发生了碰撞。即总线的端到端往返传播时延。
由此,在使用CSMA/CD协议时,一个站不可能同时进行发送和接受(但必须边发送边监听通道)。因此使用CSMA/CD协议的以太网只能进行双向交替通信(半双工通信)。
每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。
因此,以太网不能保证某一时间之内一定能够把自己的数据帧成功地发送出去(因为存在产生碰撞的可能)。以太网的这一特点称为发送的不确定性。如果希望在以太网上发生碰撞的机会很小,必须使整个以太网的平均通信量远小千以太网的最高数据率。
最先发送数据帧的A 站,在发送数据帧后至多经过时间2τ就可知道所发送的数据帧是否遭受了碰撞。因此以太网的端到端往返时间2τ称为争用期(contention period) 。
争用期又称为碰撞窗口(collision window),一个站在发送完数据之后只有在争用期的等待时长过后还没有检测到碰撞,太能肯定这次发送不会发生碰撞。‘
以太网使用截断二进制指数退避(truncated binary exponential backoff)算法来确定碰撞后重传的时机。这种算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是推迟(这叫做退避)一个随机的时间。具体算法如下:
协议规定了基本退避时间为争用期2τ, 具体的争用期时间(通常)是51.2μs。对千10 Mbit/s以太网,在争用期内可发送512 bit, 即64 字节。也可以说争用期是512 比特时间。1 比特时间就是发送1比特所需的时间。也可以直接使用比特作为争用期的单位。
从离散的整数集合[0,1,…, (2^k -1)] 中随机取出一个数,记为r。重传应推后的时间就是r 倍的争用期。上面的参数K 按下面的公式计算:
$$
k = Min[重传次数, 10]
$$
可见当重传次数不超过10 时,参数K 等于重传次数;但当重传次数超过10 时, K 就不再增大而一直等于10 。
当重传达16 次仍不能成功时(这表明同时打算发送数据的站太多,以致连续发生冲突),则丢弃该帧,并向高层报告。
例如,在第1 次重传时, k = 1, 随机数r 从整数{0, 1} 中选一个数。因此重传的站可选择的重传推迟时间是0 或2τ, 在这两个时间中随机选择一个。
若再发生碰撞,则在第2 次重传时, k = 2, 随机数r 就从整数{0, 1, 2, 3} 中选一个数。因此重传推迟的时间是在0, 2τ, 4τ, 6τ 这4 个时间中随机地选取一个。
若连续多次发生冲突,就表明可能有较多的站参与争用信道。但使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(这也称为动态退避),因而减小发生碰撞的概率,有利于整个系统的稳定。
某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定这个帧在继续向前传播到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。为了避免发生这种情况,以太网规定了一个最短帧长64 字节,即512 bit。如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于64 字节。对于10 Mbit/s 以太网,发送512 bit 的时间需要51.2μs, 也就是上面提到的争用期。
因此凡长度小于64 字节的帧都是由于冲突而异常中止的无效帧。只要收到了这种无效帧,就应当立即将其丢弃。
强化碰撞
强化碰撞就是当发送数据的站一旦发现发生了碰撞时,除了立即停止发送数据外,还要再继续发送32 比特或48 比特的人为干扰信号(jamming signal), 以便让所有用户都知道现在已经发生了碰撞(图3-18) 。对于10 Mbit/s 以太网,发送32 (或48)比特只需要3.2 (或4.8)μs 。
因此总线被占用的时间是
$$
T_B + T_J + \tau
$$
以太网还规定了帧间最小间隔为9.6μs, 相当于96 比特时间。这样做是为了使刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。
要点归纳
准备发送:适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。但在发送之前,必须先检测信道。
检测信道:若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在96 比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧。
在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。这里只有两种可能性:
- 发送成功:在争用期内一直未检测到碰撞。这个帧肯定能够发送成功。发送完毕后,其他什么也不做。
- 发送失败:在争用期内检测到碰撞。这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法,等待r 倍512 比特时间后,返回到步骤(2), 继续检测信道。但若重传达16 次仍不能成功,则停止重传而向上报错。
以太网每发送完一帧,一定要把已发送的帧暂时保留一下。如果在争用期内检测出发生了碰撞,那么还要在推迟一段时间后再把这个暂时保留的帧重传一次。
使用集线器的星形拓扑
传统以太网最初是使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。这种以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器(hub)。
从此以太网的拓扑就从总线型变为更加方便的星形网络,而以太网也就在局域网中占据了统治地位。
集线器的特点如下:
但由于集线器使用电子器件来模拟实际电缆线的工作,因此整个系统仍像一个传统以太网那样运行。也就是说,使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是CSMA/CD 协议(更具体些说,是各站中的适配器执行CSMNCD 协议)。网络中的各站必须竞争对传输媒体的控制,并且在同一时刻至多只允许一个站发送数据。
一个集线器有许多接口,一个集线器很像一个多接口的转发器。
集线器工作在物理层,它的每个接口仅仅简单地转发比特——收到1 就转发1, 收到0 就转发0, 不进行碰撞检测。
集线器本身必须非常可靠。现在的堆叠式(stackable)集线器由4~8 个集线器堆叠起来使用。集线器一般都有少量的容错能力和网络管理功能。
以太网的信道利用率
假定一个10 Mbit/s 以太网同时有10 个站在工作,那么每一个站所能发送数据的平均速率似乎应当是总数据率的1/10(即1Mbit/s)。
多个站在以太网上同时工作就可能会发生碰撞。当发生碰撞时,信道资源实际上是被浪费了。以太网总的信道利用率并不能达到100% 。
经过一个争用期2τ后(τ是以太网单程端到端传播时延),可能又出现了碰撞。这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是$T_0$。
成功发送一个帧需要占用信道的时间是$T_0 + \tau$,因此必须在经过时间$T_0 + \tau$, 后以太网的媒体才完全进入空闲状态。
要提高以太网的信道利用率,就必须减小$\tau$与$T_0$之比。在以太网中定义了参数a, 它是以太网单程端到端时延τ与帧的发送时间$T_0$之比:
$$
a = \frac{\tau}{T_0}
$$
当a ->0 时,表示只要一发生碰撞,就立即可以检测出来,并立即停止发送,因而信道资源被浪费的时间非常非常少。以太网的参数
a 的值应当尽可能小些。当数据率一定时,以太网的连线的长度受到限制(否则T_0的数值会太大),同时以太网的帧长不能太短(否则几的值会太小,使a值太大)。
现在考虑一种理想化的情况,假定以太网上的各站发送数据都不会产生碰撞,并且能够非常有效地利用网络的传输资源,即总线一旦空闲就有某一个站立即发送数据。于是我们可计算出极限信道利用率为:
$$
S_{max} = \frac{T_0}{T_0 + \tau} = \frac{1}{1 + a}
$$
只有当参数a 远小于1 才能得到尽可能高的极限信道利用率。
以太网的MAC 层
MAC 层的硬件地址
在局域网中,硬件地址又称为物理地址或MAC 地址(因为这种地址用在MAC 帧中)。
严格地讲,名字应当与系统的所在地无关。但是IEEE 802标准为局域网规定了一种48 位的全球地址(一般都简称为“地址”)’是指局域网上的每一台计算机中固化在适配器的ROM 中的地址。
假定连接在局域网上的一台计算机的适配器坏了而我们更换了一个新的适配器,那么这台计算机的局域网的“地址”也就改变了,虽然这台计算机的地理位置一点也没有变化,所接入的局域网也没有任何改变。
假定我们把位千南京的某局域网上的一台笔记本电脑携带到北京,并连接在北京的某局域网上。虽然这台电脑的地理位置改变了,但只要电脑中的适配器不变,那么该电脑在北京的局域网中的“地址”仍然和它在南京的局域网中的“地址”一样。
严格地讲,局域网的“地址“应当是每一个站的“名字”或标识符[PERLOO] 。
如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个“地址"。更准确些说,这种48 位“地址”应当是某个接口的标识符。
IEEE 802 标准规定MAC 地址字段可采用6 字节(48 位)或2 字节(16 位)这两种中的一种。现在的局域网适配器实际上使用的都是6 字节MAC 地址。
现在IEEE 的注册管理机构RA (Registration Authority)是局域网全球地址的法定管理机构[W-IEEERA], 它负责分配地址字段的6 个字节中的前三个字节(即高位24 位)。这个号的正式名称是组织唯一标识符OUI (Organizationally Unique Identifier) , 通常也叫做公司标识符(company_id) [RFC 7042] 。地址字段中的后三个字节(即低位24 位)则由厂家自行指派,称为扩展标识符(extended identifier) 。用这种方式得到的48 位地址称为EUI-48, 这里EUI 表示扩展的唯一标识符(Extended Unique Identifier) 。
我们知道适配器有过滤功能。但适配器从网络上每收到一个MAC 帧就先用硬件检查MAC 帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的处理机和内存资源。这里”发往本站
的帧“包括以下三种帧:
- 单播(unicast)帧(一对一),即收到的帧的MAC 地址与本站的硬件地址相同。
- 广播(broadcast)帧(一对全体),即发送给本局域网上所有站点的帧(全l 地址)。
- 多播(multicast)帧(一对多),即发送给本局域网上一部分站点的帧。
以太网适配器还可设置为一种特殊的工作方式,即混杂方式(promiscuous mode) 。工作在混杂方式的适配器只要“听到“有帧在以太网上传输就都悄悄地接收下来。有一种很有用的网络工具叫做嗅探器(Sniffer) 就使用了设置为混杂方式的网络适配器。
MAC 帧的格式
在曼彻斯特编码的每一个码元(不管码元是1 或0) 的正中间一定有一次电压的转换(从高到低或从低到高)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元了(既不发送1, 也不发送0) 。因此,发送方网络适配器的接口上的电压也就不再变化了。这样,接收方就可以很容易地找到以太网帧的结束位置。在这个位置往前数4 字节(FCS 字段长度是4 字节),就能确定数据字段的结束位置。
当数据字段的长度小于46 字节时, MAC 子层就会在数据字段的后面加入一个整数字节的填充字段,以保证以太网的MAC 帧长不小于64 字节。
当上层使用IP 协议时,其首部就有一个“总长度”字段。“总长度“加上填充字段的长度,应当等于MAC 帧数据字段的长度。
在传输媒体上实际传送的要比MAC 帧还多8 个字节。当一个站在刚开始接收MAC 帧时,由于适配器的时钟尚未与到达的比特流达成同步,因此MAC 帧的最前面的若干位就无法接收。为了接收端迅速实现位同步,从MAC 子层向下传到物理层时还要在帧的前面插入8 字节(由硬件生成),它由两个字段构成。第一个字段是7 个字节的前同步码(1 和0 交替码),它的作用是使接收端的适配器在接收MAC 帧时能够迅速调整其时钟频率,使它和发送端的时钟同步。
第二个字段是帧开始定界符,定义为10101011 。它的前六位的作用和前同步码一样,最后的两个连续的1 就是告诉接收端适配
器: “MAC 帧的信息马上就要来了,请适配器注意接收”。
在以太网上传送数据时是以帧为单位传送的。以太网在传送帧时,各帧之间还必须有一定的间隙。因此,接收端只要找到帧开始定界符,其后面的连续到达的比特流就都属千同一个MAC 帧。可见以太网不需要使用帧结束定界符,也不需要使用字节插入来保证透明传输。
IEEE 802.3 标准规定凡出现下列情况之一的即为无效的MAC 帧:
- 帧的长度不是整数个字节;
- 用收到的帧检验序列PCS 查出有差错;
- 收到的帧的MAC 客户数据字段的长度不在46 ~ 1500 字节之间。考虑到MAC 帧首部和尾部的长度共有18 字节,可以得出有效的MAC 帧长度为64 ~ 1518 字节之间。
扩展的以太网
这种扩展的以太网在网络层看来仍然是一个网络。
在物理层扩展以太网
扩展主机和集线器之间的距离的一种简单方法就是使用光纤(通常是一对光纤)和一对光纤调制解调器。
光纤调制解调器的作用就是进行电信号和光信号的转换。由千光纤带来的时延很小,并且带宽很宽,因此使用这种方法可以很容易地使主机和几公里以外的集线器相连接。
每一个系的10BASE-T以太网是一个独立的碰撞域(collision domain, 又称为冲突域),即在任一时刻,在每一个碰撞域中只能有一个站在发送数据。
这种多级结构的集线器以太网也带来了一些缺点:
在三个系的以太网通过集线器互连起来后就把三个碰撞域变成一个碰撞域(范围扩大到三个系)。
如果不同的系使用不同的以太网技术(如数据率不同),那么就不可能用集线器将它们互连起来。一个系使用10 Mbit/s 的适配器,而另外两个系使用10/100 Mbit/s 的适配器,用集线器连接起来后,大家都只能工作在10 Mbit/s 的速率。
在数据链路层扩展以太网
扩展以太网更常用的方法是在数据链路层进行。最初人们使用的是网桥(bridge) 。网桥对收到的帧根据其MAC 帧的目的地址进行转发和过滤。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是根据此帧的目的MAC 地址,查找网桥中的地址表,然后确定将该帧转发到哪一个接口,或者是把它丢弃(即过滤)。
交换式集线器(switching hub) , 很快就淘汰了网桥。交换式集线器常称为以太网交换机(switch)或第二层交换机(L2 switch) , 强调这种交换机工作在数据链路层。后文将其称为以太网交换机。
以太网交换机的特点
以太网交换机实质上就是一个多接口的网桥,通常都有十几个或更多的接口。以太网交换机的每个接口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工方式。以太网交换机还具有并行性,即能同时连通多对接口,使多对主机能同时通信(而网桥只能一次分析和转发一个帧)。相互通信的主机都是独占传输媒体,无碰撞地传输数据。
以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。
由于一个用户在通信时是独占而不是和其他网络用户共享传输媒体的带宽,因此对于拥有10 个连接用户带宽为10Mbits/s接口的交换机的总容量则为100 Mbit/s 。这正是交换机的最大优点。
也有一些交换机采用直通(cut-through) 的交换方式。直通交换不必把整个数据帧先缓存后再进行处理,而是在接收数据帧的同时就立即按数据帧的目的MAC 地址决定该帧的转发接口,因而提高了帧的转发速度。
缺点是它不检查差错就直接将帧转发出去,因此有可能也将一些无效帧转发给其他的站。
以太网交换机的自学习功能
交换机收到帧后,先查找交换表,没有查到应从哪个接口转发这个帧(在MAC 地址这一列中,找不到目的地址为B 的项目)。接着,交换机把这个帧的源地址A 和接口1 写入交换表中,并向除接口1 以外的所有接口广播这个帧(这个帧就是从接口1 进来的,当然不应当把它再从接口1 转发出去)。
C 和D 将丢弃这个帧,因为目的地址不对。只B 才收下这个目的地址正确的帧。这也称为过滤。
假定接下来B 通过接口3 向A 发送一帧。交换机查找交换表,发现交换表中的MAC地址有A 。表明要发送给A 的帧(即目的地址为A 的帧)应从接口1 转发。千是就把这个帧传送到接口1 转发给A 。显然,现在已经没有必要再广播收到的帧。交换表这时新增加的项目(B, 3), 表明今后如有发送给B 的帧,就应当从接口3 转发出去。
但有时为了增加网络的可靠性,在使用以太网交换机组网时,往往会增加一些冗余的链路。在这种情况下,自学习的过程就可能导致以太网帧在网络的某个环路中无限制地兜圈子。
为了解决这种兜圈子问题, IEEE 的802.1D 标准制定了一个生成树协议STP (SpanningTree Protocol) 。其要点就是不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象。
从总线以太网到星形以太网
而随着以太网上站点数目的增多,使得总线结构以太网的可靠性下降。与此同时,大规模集成电路以及专用芯片的发展,使得星形结构的以太网交换机可以做得既便宜又可靠。在这种情况下,采用以太网交换机的星形结构又成为以太网的首选拓扑,而传统的总线以太网也很快从市场上消失了。
总线以太网使用CSMA/CD 协议,以半双工方式工作。但以太网交换机不使用共享总线,没有碰撞问题,因此不使用CSMA/CD 协议,而是以全双工方式工作。既然连以太网的重要协议CSMA/CD 都不使用了(相关的“争用期”也没有了),为什么还叫做以太网呢?原因就是它的帧结构未改变,仍然采用以太网的帧结构。
虚拟局域网
利用以太网交换机可以很方便地实现虚拟局域网VLAN (Virtual LAN) 。
计算机$B_1$~$B_3$同属于虚拟局域网$VLAN_2$ 。当B1 向工作组内成员发送数据时,计算机$B_2$和$B_3$将会收到广播的信息,虽然它们没有和$B_1$连在同一个以太网交换机上。相反, $B_1$向工作组内成员发送数据时,计算机$A_1, A_2$和$C_1$都不会收到$B_1$发出的广播信息,虽然它们都与$B_1$连接在同一个以太网交换机上。
虚拟局域网限制了接收广播信息的计算机数,使得网络不会因传播过多的广播信息(即所谓的“广播风暴”)而引起性能恶化。
虚拟局域网协议允许在以太网的帧格式中插入一个4 字节的标识符(见图3-28), 称为VLAN 标记(tag), 用来指明发送该帧的计算机属千哪一个虚拟局域网。
VLAN 标记的前两个字节总是设置为0x8100 (即二进制的10000001 00000000), 称为IEEE 802.1Q 标记类型。
当数据链路层检测到MAC 帧的源地址字段后面的两个字节的值是0x8100 时,就知道现在插入了4 字节的VLAN标记。
在后面的两个字节中,前3 位是用户优先级字段,接着的一位是规范格式指示符CFI (Canonical Format Indicator), 最后的12 位是该虚拟局域网VLAN 标识符VID (VLAN ID), 它唯一地标志了这个以太网帧属于哪一个VLAN 。
由于用于VLAN 的以太网帧的首部增加了4 个字节,因此以太网的最大帧长从原来的1518 字节(1500 字节的数据加上18 字节的首部)变为1522 字节。