数据链路
数据链路层的协议数据单元叫做帧,其通信主要步骤如下:
- 节点A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧
- 节点A把封装好的帧发送给节点B的数据链路层
- 若节点B的数据链路层收到的帧无差错,则提取IP数据报上交给上面的网络层;否则丢弃。
因此数据链路层的三个基本问题是:封装成帧,透明传输和差错检测。
局域网与广播信道
广播信道可以进行一对多通信,局域网使用的就是广播信道。局域网为一个单位所共有,且地理范围和站点数目均有限。常见的局域网拓扑包括星形网、环形网、总线网、树形网。需要解决的一个问题是,如何让多个用户能够合理而方便的使用共享信道,在物理媒介上不产生信号冲突。在技术上有两种方案:
-
静态信道划分
在物理上使用频分复用、时分复用、码分复用等,但这中方式的信道利用率低且成本高,不适合于局域网。
-
动态媒体接入控制
随机接入和受控接入,此内容是以太网重点内容,因此下面讨论最重要的一个协议CSMA/DC
CSMA/DC协议
CSMA/DC简介
以太网是一种广播网络,每个节点都可以看到在网络中发送的所有信息。那么就决定了在同一时间只能允许一台计算机发送信息,否则各个计算机之间就会产生干扰,导致大家都无法正常发送。以太网采用CSMA/DC协议,它是载波侦听多点接入/冲突监测(Carrier Sense Multiple Access with Collision Detection)。
-
多点接入
以太网实质是总线型网络,许多计算机以多点接入的方式连接在同一根线上。
-
载波监听
每个计算机发送数据前先要监测总线上是否有其他计算机正在发送数据。如果有,就暂时不发送数据,等待信道变为空闲时再发送。
-
碰撞检测
碰撞检测即边发送边监听,即适配器边发送信号,边检测信道上的信号电压变化情况,以判断自己发送数据时是否有其他站点也在发送数据。当几个站点同时在总线上发送信号时,信道上电压相互叠加导致变化幅度变大。当适配器检测到信道电压幅度超过某阈值时,就认为产生了碰撞。每一个正在发送数据的站点一旦检测到了碰撞,将立刻停止发送,避免继续浪费资源,然后等待一定时间后再次发送。
时延的影响
既然每个站点发送数据前已经监听到信道空闲,为什么还会出现数据在总线上的碰撞呢?因为电磁波在介质中是以有限的速度传播的,端到端的传播存在时延。站点监听到总线空闲,并不能确定是真的空闲。下图可以解释这个现象。
解释:
- 在t=0时刻,A发送数据,B检测到信道空闲。
- 在t=τ-δ时刻,A发送的数据还没有达到B,B检测信道空闲,因此B发送数据。
- 在t=τ-δ/2时刻,发生碰撞
- 在t=τ时刻,B检测到碰撞,停止发送。
- 在t=2τ-δ时刻,A检测到碰撞,停止发送。
指数退避算法
由此可见,每个站点发送数据之后的一段时间内存在碰撞的可能性。在以太网中,2τ称为争用期,经过争用期还没有发生碰撞,则本次发送一定不会碰撞。
以太网使用截断二进制指数退避算法来解决碰撞问题。当重传次数为k,且站点碰撞时,在
$${0,τ,2τ,4τ...2^kτ}$$
中随机选择一个时间进行退避(动态退避),当k达到16次是仍未发送成功,则丢弃该帧,向上层报告。
强化干扰
另外,以太网还采取一种强化碰撞的措施。当发送数据的站点检测到碰撞时,除了立即停止发送外,还会再发送32bit或者64bit的人为干扰信号,以便让所有用户都知道现在发生了碰撞。
要点归纳
- 适配器从网络层获得一个分组,加上以太网的首部和尾部,封装成帧,放入适配器缓存等待发送。
- 若适配器检测到信道空闲,即96bit(以太网规定了帧间最小间隔9.6μs)时间内没有检测到信道信号,则发送这个帧。若检测到信道忙,则继续监测直到信道空闲(在加上96bit时间),然后发送这个帧。
- 在发送过程中,若一直未检测到碰撞,则顺利把这个帧发送完成。若检测到碰撞,则终止发送,并发送认为干扰信号。
- 在终止发送后,适配器执行指数退避算法,等待,然后返回步骤2.