(三)数据链路层--广播信道
广播信道
上一篇文章介绍了点对点协议PPP,本文介绍使用广播信道的数据链路层。广播信道可以进行一对多的通信。
局域网的数据链路层
局域网最主要的特点是:网络为一个单位所拥有,且地理位置和站点数目均有限。在局域网刚出现时,相较广域网,有较高的数据率,较低的时延,较小的误码率。局域网具有如下主要优点:
- 具有广播功能,从一个站点可很方便的访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源
- 便于系统的扩展和逐渐演变,各设备的位置可灵活调整和改变
- 提高了系统的可靠性(reliability)、可用性(availability)、生存性(survivability)
局域网可按网络拓扑进行分类,如下图所示:
- 星形网
- 环形网
- 总线网
各站直接连在总线上。总线两端的匹配电阻吸收在总线上传播的电磁波信号的能量,避免在总线上产生有害的电磁波反射。
共享信道要着重考虑的一个问题就是如何使众多用户能够合理而方便的共享通信媒体资源,这在技术上有两种办法:
- 静态划分信道,如频分复用、时分复用、波分复用、码分复用。用户只要分配到了信道就不会和其他用户发生冲突,但这种划分信道的方法代价较高,不适合局域网使用
- 动态媒体接入控制,又称为多点接入(multiple access),其特点是信道并非在用户通信时固定分配给用户,它又分为以下2类:
- 随机接入,特点是所有的用户可随机的发送信息,但如果恰巧有两个或更多的用户在同一时刻发送消息,那么在共享媒体上就会产生碰撞,使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议
- 受控接入,特点是用户不能随机的发送信息,而要服从一定的控制。典型代表有:分散控制的令牌环局域网和集中控制的多点线路探寻(polling),或成为轮询。
处于有关厂商在商业上的激烈竞争,IEEE802委员会未能形成一个统一的、最佳的局域网标准,而是被迫制定了几个不同的局域网标准,如:802.4令牌总线网、802.5令牌环网等。为了使数据链路层能更好的适应多种局域网标准,IEEE802委员会就把局域网的数据链路层拆成两个子层,即逻辑链路控制LLC子层(Logical Link Control)和媒体接入控制MAC子层(Mmedium Access Control)。LLC子层与传输媒体无关,采用何种传输媒体和MAC子层的局域网对LLC子层来说都是透明的。
适配器的作用
计算机与外界局域网的连接是通过通信适配器(Adapter)进行的。适配器本来是在主机箱内插入的一块网络接口板,它又被称为网卡。这种通信适配器上面装有处理器和存储器(RAM和ROM)。适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而适配器和计算机之间的通信则是通过计算机主板上的I/O总线以并行传输方式进行的。因此,适配器的一个重要功能就是要进行数据串行传输和并行传输的转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此在适配器中必须装有对数据进行缓存的存储芯片。在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来。适配器还要能够实现以太网协议。
适配器在接收和发送各种帧时,不使用计算机的CPU,此时CPU可以处理其它任务。当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机;当适配器收到正确的帧时,它就使用中断来通知计算机,并交付协议栈中的网络层。当计算机要发送IP数据报时,就由协议栈把IP数据报向下交给适配器,组装成帧后发送到局域网。计算机的硬件地址就在适配器的ROM中,而计算机的软件地址(IP地址),在计算机的存储器中。
CSMA/CD协议
总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据,这种就是广播通信方式。但我们并不总是要在局域网上进行一对多的广播通信。为了在总线上实现一对一的通信,可以使每一台计算机的适配器拥有一个与其它适配器都不同的地址,在发送数据帧时,在帧首部写明接收站的地址,仅当数据帧中的目的地址与适配器ROM中存放的硬件地址一致时,才接收这个帧,这样便在总线上实现了一对一的通信。
为了通信的简便,以太网采取了以下两种措施:
- 采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。适配器对发送的数据帧不进行编号,也不要求对方发回确认。以太网提供的服务是尽最大努力的交付,即不可靠的交付。有差错的帧是否需要重传由高层决定。例如,如果高层使用TCP协议,那么TCP就会发现丢失了一些数据。于是,TCP就会把这些数据重新传递给以太网进行重传。但以太网并不知道这是重传帧,而是当作新的数据帧来发送。
我们知道,总线上只要有一台计算机在发送数据,总线的传输资源就被占用。因此,在同一时间只能允许一台计算机发送数据,否则各计算机之间就会互相干扰,使得所发送数据被破坏。这就好比有一屋子的人在开会,没有主持人控制发言,想发言的人随时可发言。但我们必须有个协议来协调大家的发言,即:如果你听见有人在发言,那么就必须等待别人讲完了才能发言(否则就干扰了别人的发言),但有时碰巧两个或更多的人同时发言了,那么一旦发现冲突,大家都必须立即停止发言,等听到没有人发言了你再发言。以太网采用的协调方法和上面的方法非常像,它使用的协议是CSMA/CD,意思是载波监听多点接入/碰撞检测。 - 以太网发送的数据都使用曼彻斯特编码的信号。
CSMA/CD协议的要点:
- 多点接入,说明这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。
- 载波监听,即使用电子技术检测总线上有没有其它计算机也在发送,这里只是借用一下“载波”这个名词,载波监听其实就是检测信道,这是一个很重要的措施,不管在发送前,还是在发送中,每个站都必须不停地检测信道。在发送前检测信道,是为了获得发送权,如果检测出已经有其它站在发送,则自己就暂时不发送数据。在发送中检测信道,是为了及时发现有没有其它站的发送和本站发送的碰撞。
- 碰撞检测,即边发送边监听,适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时,其它站是否也在发送数据。当几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(互相叠加),适配器检测到的信号电压变化幅度超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。一旦发现总线上出现了碰撞,适配器就要立即停止发送,免得继续进行无效的发送,白白浪费网络资源。
既然每一个站在发送数据之前已经监听到信道为空闲,那么为什么还会出现数据在总线上的碰撞呢?因为电磁波在总线上总是以有限的速率传播的,参考下图所示:
设图中局域网两端的A和B相距1km,用同轴电缆相连。电磁波在1km电缆的传播时延约为5μs。当A向B发出数据,在约5μs后,才能传送到B,那么在B收到数据之前,如果B发送了自己的帧,则必然要在某个时间和A发送的帧发生碰撞,碰撞的结果是两个帧都变的无用。在局域网的分析中,常把总线上的单程端到端传播时延记为τ,那么A发送数据后,最迟要经过多长时间才能知道自己发送的数据和其它站发送的数据有没有发生碰撞呢?从图中可以看出,这是时间最多是2倍的总线端到端的传播时延(2τ),或总线的端到端往返传播时延。
显然,在使用CSMA/CD协议时,一个站不可能同时进行发送和接收,即无法进行全双工通信,只能进行半双工通信。下面总结一下上图中的一些重要时刻:
- t = 0时,A发送数据,B检测到信道为空闲
- 在 t = τ - δ时,B发送数据(因为A发出的数据还没有到达B,B检测到信道是空闲的)
- 在 t = τ - δ / 2时,A发送的数据和B发送的数据发生了碰撞,但此时A和B都不知道发生了碰撞
- 在 t = τ时,B检测到发生了碰撞,于是停止发送数据
- 在 t = 2τ - δ时,A也检测到发生了碰撞,因而停止发送数据。A和B发送数据均失败,它们都要推迟一段时间后再重新发送。
由此可见,每一个站在自己发送数据之后的一小段时间之内,存在着遭遇碰撞的可能性,这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。因此,以太网不能保证某一时间之内一定能够把自己的数据帧成功的发送出去(因为存在产生碰撞的可能)。以太网的这一特点称为发送的不确定性。
从上图可以看出,最先发送数据帧的A站,在发送数据帧后至多经过时间2τ就可知道所发送的数据帧是否遭受了碰撞,即δ -> 0 的情况,因此以太网的端到端往返时间2τ称为争用期,又叫做碰撞窗口。这是因为一个站在发送完数据后,只有通过争用期的“考验”,或者说在争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。这时,就可以放心把这一帧数据顺利发送完毕。
如何确定碰撞重传的时机
以太网使用截断二进制指数退避算法来确定碰撞后重传的时机,这种算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲就立即再发送数据,而是推迟(退避)一个随机的时间。因为如果几个发生碰撞的站都在监听信道,那么会同时发现信道变成了空闲,如果大家都同时重新发送,那么肯定又会发生碰撞。具体的退避算法如下:
- 协议规定了基本退避时间为争用期2τ(2倍的端到端时延),具体的争用期是51.2μs。对于10Mbit/s的以太网,在争用期内可发送512bit,即64字节,也可以说争用期是512比特时间,1比特时间就是发送1比特所需的时间
- 从离散的整数集合中随机取出一个数,即为r,集合的范围是[0, 1, 2, ... (2ⁿ - 1)],重传推后的时间就是r倍的争用期。集合范围中的n使用此公式计算:n = Min(重传次数,10)
可见当重传次数不超过10时,参数n等于重传次数,当重传次数超过10时,n就一直等于10 - 当重传达16次仍不能成功时,则丢弃该帧,并向高层报告(表明同时发送数据的站太多,以致连续发生碰撞)。例如,在第一次重传时,n = 1,随机数r在[0, 1]中选一个,那么可选的重传推迟时间是 0 或 2τ。若再发生碰撞,则在第二次重传时,n = 2,随机数r在[0, 1, 2, 3]中选一个,那么可选的重传推迟时间是 0 或 2τ 或 4τ 或 6τ。依次类推。
若连续多次发生冲突,就表明可能有较多的站参与争用信道,使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大,因而可以减小发生碰撞的概率,有利于整个系统的稳定。
现在考虑一种情况,某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定这个帧在继续向前传播到目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到碰撞信息,并丢弃这个帧,可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。为了避免出现这种情况,以太网规定了一个最短帧长64字节,如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于64字节。由此可见,以太网在发送数据时,如果在争用期没有发生碰撞,那么后续发送的数据就一定不会发生冲突,如果发生碰撞,一定是在发送之前的64字节之内。由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于64字节,因此凡长度小于64字节的帧都是由于碰撞而中止的无效帧,只要收到了这种无效的帧,就应当立即将其丢弃。
强化碰撞
以太网的争用期确定为51.2μs,不仅考虑到以太网的端到端时延,还包括其它的因素,比如转发器所增加的时延,以及强化碰撞的干扰信号的持续时间。当发送数据的站一旦检测到了碰撞,除了立即停止发送数据外,还要再继续发送32比特或48比特的人为干扰信号,以便让所有用户都知道现在已经发生了碰撞,目的站在得知发生碰撞后,也要发送人为干扰信号。对于10Mbit/s以太网,发送32比特只需要3.2μs。以太网还规定了帧间最小间隔为9.6μs,相当于96比特时间,这样做是为了使刚刚收到数据帧的站来得及清理其接收缓存,做好接收下一帧的准备。
接下来对CSMA/CD协议进行一个总结:
- 准备发送:适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。
- 检测信道:在发送前,若检测到信道忙,则应不停地检测,直到信道空闲。检测到信道空闲后,若在96比特时间内信道保持空闲(保证帧间最小间隔),就发送这个帧。
- 发送过程中仍然要不停地检测信道:
- 发送成功:在争用期内未检测到碰撞,这个帧肯定能发送成功
- 发送失败:在争用期内检测到碰撞,此时立即停止发送,并按规定发送人为干扰信号,适配器接着就执行退避算法,等待某个时间后,继续检测信道。若重传16次仍不能成功,则停止重传,向上报错。以太网每发送完一帧,一定要把已发送的帧暂时保留一下,如果在争用期内检测到了碰撞,那么还要推迟一段时间后,再把这个帧重传一次。