计算机网络数据链路层

数据链路层的设计初衷

我们知道物理层的线路上传输的是我们的比特流,物理层的线路由传输介质与通信设备组成。比特流在物理线上的传输肯定会存在误差。这样我们就引入了数据链路层在物理层之上,在数据链路层中采用差错检测差错控制流量控制等方法,向网络层提高高质量的数据传输服务。

注意这里说的是高质量,而不是可靠,数据传输的可靠仍然要靠我们传输层的TCP协议实现。数据链路层提供了差错检测机制,相对于物理层来说,提高了数据传输的质量。

这样数据链路层就可以看成了网络层物理层之间的一层抽象,属于计算机网络中的低层。

下面我们通过一个例子看一下数据链路层在主机通过互联网进行通信时所处的地位。如图:

图3-1(a)从主机的角度表示了H1主机向H2主机发送数据报时,中间经过了三个路由器R1,R2,R3,最后数据到达H2。

图3-1(b)从数据报经过的协议的角度来看数据的流动,主机H1和H2都有完整的五层协议栈,路由器在转发分组时使用的协议栈只有三层。主机H1在应用层将数据报一层一层向下交付直到物理层。数据进入路由器后先从物理层上到网络层,在路由器的转发表找到下一跳的地址后,再下到物理层转发出去,到下一个路由器。主机H2收到数据报后,从物理层往上交付给应用层。

图3-2是我们常用的研究数据链路层的问题时用的图形,在许多情况下我们只关心在协议栈中水平方向的各数据链路层,想象数据在数据链路层就是简单地从左往右水平传送的

数据链路层使用的信道主要有以下两种类型:

  • 点对点信道:使用一对一的点对点通信方式的信道。

  • 广播信道:使用一对多的广播通信方式。

链路,数据链路与帧

链路

所谓链路(link)就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点。在主机间进行数据通信时,之间的通信路径往往要经过许多段链路链路只是一条路径的组成部分。又称物理链路

数据链路

数据链路则不仅仅包括一条物理线路,它还包括了数据传送时起控制作用的协议。把实现这些协议的硬件和软件加到链路上,就构成了数据链路。又称逻辑链路

可以简单地理解为,数据链路就是链路加上必要的通信协议

是数据链路层的协议数据单元。

一个很重要的关系需要我们知道的是:网络层传输的是数据报,而数据链路层传输的是数据帧,而物理层传输的是比特流。数据链路层将网络层传输的数据报装入中,而物理层将比特流的形式通过物理的传输线路在物理网络中传输。

网络层和数据链路层,物理层的数据传输关系大概可以用下图描述:

三个基本问题

数据链路层协议有很多,但有共同的三个基本问题封装成帧透明传输差错检测

封装成帧

封装成帧(framing)就是在一段数据的前后分别添加首部尾部,构成一个

接收端在收到物理层上交的比特流后,可以根据首部尾部的标记,判断出帧的开始和结束,我们又称为帧定界。此外,首部和尾部还包括了许多必要的控制信息

在上面我们提到了网络层传输的IP数据报,而数据链路层传输的是数据帧,但网络层的IP数据报传送到数据链路层上只成为数据帧数据部分,在需要再数据部分的前面和后面分别加上数据首部数据尾部,构成一个完整的帧。一个数据帧=数据首部+数据部分+数据尾部,关系图如3-4

为了提高帧的传输效率,应当规定帧的数据部分长度应该尽可能地大于首部和尾部的长度。尽管如此,帧的数据部分也不可能无数长,每一种链路层协议都规定了所能传送的帧的数据部分长度上限—最大传送单元MTU(Maximum Transfer Unit)。

首部和尾部如何做到帧定界呢?当数据是可打印的ASCII码时,我们就可以使用特殊的帧定界符号,大家统一规定了某个符号一出现就表示是帧的开始或结束。比如说我们规定控制字符SOH(Start Of Header)表示帧的首部开始,另一控制字符EOT(End Of Transmission)表示帧的结束。注意SOH和EOT都是控制字符的名称,而不是三个字符。

控制字符进行帧定界的方法举例:

帧定界符在数据传输出现差错时,可以起到作用。假定发送端在尚未发送完一个帧是突然出故障,中断了发送。随后很快恢复正常,于是重新从头开始发送刚才为发送完毕的帧。因为使用了帧定界符,接收端知道了前面收到的这个帧是不完整的,选择丢弃。后面的帧是完整的,选择收下。

透明传输

透明传输,这里提到的**“透明”是一个很重要的术语。表示某一实际存在的事物但看起来却好像不存在一样**,类似于一个100%透明的玻璃,实际存在,但正常情况你看不见,除非你猛得一头撞上了"玻璃"。在数据链路层透明传送数据的意思就是:无论什么样的比特组合的数据,都能够按照原来照样没有差错地通过这个数据链路层,不存在有什么妨碍他们传输的东西。

封装成帧看起来十分的合理和完美。但我们其实违背了透明传输,我们细想,万一我们传输的数据当中就包括了我们的帧定界符呢?那样接收端怎么判断这个帧定界是数据部分的还是数据首部或尾部的?如果按照一收到帧定界符就判断帧结束了,那么一旦数据部分包括了帧定界符,数据链路层就会错误地以为找到了帧的边界,把部分帧收下,而把剩下那部分的数据帧丢弃了。如图3-6所示:

而如图3-6,帧的传输就明显不是透明传输,因为数据帧中碰巧出现了帧定界符EOT

如何解决这种误会呢?

答案是增加一个转义字符ESC。具体的方法是:发送端的数据链路层中的数据出现控制字符SOH和EOT,则在前面插入一个转义字符ESC,表明这个控制字符表示的是它本身的意思,而不是什么帧定界符。而在接收方的数据链路层,在把数据送往网络层之前删除这个插入的转义字符。这种方法我们又称作字节填充(byte stuffing)字符填充(character stuffing)

可能你又想到了,那么如果ESC表示的是它本身的意思呢?很简单,那么就在ESC前面再插入一个ESC(套娃成功),当接收端连续收到两个转义字符时,就删除其中前面的那一个。图3-7表示用字节填充法解决透明传输的问题:

差错检测

上面提到了物理层比特流在物理网传输的过程中难免会出现差错,而数据链路层想向网络层提供"更高质量"的数据传输,实现的手段就是差错检测(更准确地说比特差错检测)。

比特差错

比特在传输过程中可能会产生差错:1可能会变成0,0也可能变成1,这就叫做比特差错。比特差错是传输差错中的一种,在差错检测这一节,差错指的一般是比特差错

循环冗余检验

在一段时间内,传输错误的比特占所传输比特总述的比率称为误码率BER(Bit Error Rate)。比如说误码率为101010^{-10}表示平均传送101010^{10}个比特就会出现一个比特的差错。在计算机网络传输数据时,需要采用各种差错检测的措施,目前在数据链路层广泛使用的是**循环冗余检验CRC(Cyclic Redundancy Check)**的检错技术。

下面我们通过一个简单的例子说明循环冗余检验的原理

在发送端,我们将数据分成组,假定每组为k个比特。现假定待传送的数据M=101001(k=6)。CRC运算就是在数据M的后面添加供差错检测用的n位冗余码,然后构成一个帧(k+n)位,发送出去。

这n位的冗余码如何得出?我们用的是先用二进制的模2运算进行2n2^{n}乘M的操作,相当于M左移n位,也就是在M的后面添加n个0。得到的(k+n)位的数用模2除法除以收发双方事先约定的长度为(n+1)位除数P,得出商为Q而余数为R(n位,比P少一位)。这个余数R就作为冗余码拼接在数据M的后面发送出去。

这种为了进行检错而添加的冗余码也常称为帧检验序列FCS(Frame Check Sequence)

举个例子:我们假定除数P为1101(n=3),M=101001,2n2^{n}乘M得到101001000 ,用模2除法除以1101,得到商Q=110101(并没有什么实际用处),余数R=001。所以我们最终发送的帧为 101001001,一共k+n=9位。

关于模2除法已经有博主讲得挺好的了,就不再赘述。

这里区分一下循环冗余检验帧检验序列,这两个并不是一个概念,CRC是一种检错的方法,FCS是添加在传输数据后面的冗余码,通过其他的检错方法也可以得到FCS。可以说,得到FCS是我们要的目的,而CRC只是我们达到目的的一种手段罢了。(小丑CRC)

无差错传输和可靠传输

这里需要强调一下,在数据链路层仅仅使用CRC差错检测技术,只能做到对帧的无差错接受。什么叫无差错接受,就是说我们接受到了的帧,我们都能以非常接近于1的概率认为这些帧在传输过程中没有产生差错(指比特出错)。而那些传输过程中出现差错(也是指比特差错)的帧,我们会丢弃,即这些帧不会被接受。

可靠传输要求的是数据链路层的发送端发送什么,在接收端就接受到什么

我的理解是,无差错接受针对的是到达了目的主机的帧,我对帧进行检查,这个检查只是针对比特差错的,就是判断有没有1变成0,0变成1的情况,没有我就收下。但是传输错误不仅仅包括比特错误,还包括有些帧丢失了,帧重复了,帧失序了,那样无差错接受就无能为力了。就需要上层协议去处理了,所以可靠传输是上层协议TCP去搞的。

还是那句话,数据链路层只是尽力提供**“更高质量”的数据传输。“更高质量”体现在现在比特错误我能处理了,但我还是不能完全可靠**。

点对点信道的数据链路层 和 点对点协议 PPP

点对点信道的数据链路层

以AB两主机进行通信为例子,点对点信道的数据链路层在进行通信时的主要步骤为:

  1. A的数据链路层把网络层交下来的IP数据报添加首部和尾部封装成帧
  2. A把封装好的帧发送给主机B的数据链路层。
  3. B检查数据链路层收到的帧无比特差错,则从收到的帧中提取出IP数据报交给上面的网络层;否则丢弃这个帧。

点对点协议PPP

点对点协议 PPP(Point-to-Point Protocol)点对点的链路目前使用得最广泛的数据链路层协议

PPP协议的特点

互联网用户通常都要连接到某个ISP才能接入到互联网。PPP协议就是用户计算机和ISP进行通信时所使用的数据链路层协议,如图3-9:

PPP协议需要满足的一些需求

  1. 简单:PPP基本的原理很简单:发送方发送帧,接收方收到一个帧,进行CRC检验,无比特差错,收下,否者丢弃,什么都不做
  2. 封装成帧:PPP协议是数据链路层,必然逃不过数据链路层三个基本问题中的封装成帧。
  3. 透明性:PPP协议是数据链路层,必然逃不过数据链路层三个基本问题中的透明传输。
  4. 多种网络层协议:PPP协议必须能够在同一条物理链路上同时支持多种网络层协议。向上层提供更多的支持。
  5. 多种类型链路:PPP协议必须能够在多种类型的链路上运行。比如串行链路,并行链路,同步链路,异步链路等。
  6. 差错检测: 数据链路层的三个基本问题。
  7. 检测连接状态:PPP协议必须具有一种机制能够及时自动检测出链路是否处于正常工作状态。
  8. 最大传送单元:前面提到每一种链路层协议都规定了MTU,PPP作为链路层协议也肯定得有
  9. 网络层地址协商: 不太懂
  10. 数据压缩协商
  11. 只支持全双工链路
PPP协议的组成

PPP协议有三个组成部分:

  • 将IP数据报封装到串行链路的方法。IP数据报是数据链路层帧的数据部分,需要有封装到帧里面的方法。
  • 一个用来建立,配置和测试数据链路连接的链路控制协议LCP(Link Control Protocol)。通信双方可以协商一些选项。
  • 一套网络控制协议NCP(Network Control Protocol),其中的每一个协议支持不同的网络层协议。
PPP协议的帧格式

PPP的帧格式如图:

如图所示,各字段的意义为:

  • PPP帧的首部和尾部分别为四个字段和两个字段。首部的第一个字段和尾部的第二个字段都是标志字段F(Flag),规定为0x7E,表示一个帧的开始或结束,也就是我们前面说的帧定界符

  • 首部中的地址字段A规定为0xFF,控制字段C为0x03,这两个字段到如今也没什么特殊定义。

  • PPP首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息字段为IP数据报。为0xC021,则信息字段为PPP链路控制协议LCP的数据,而0x8021表示这是网络层的控制数据。

  • 信息字段的长度可变,不超过1500字节。

  • 尾部中的第一个字段(2字节),是使用CRC的帧检验序列FCS

字节填充:在透明传输中我们知道,当数据帧中有字段出现和标志字段(帧定界符)意义的比特(这里是0x7E)组合,必须在该字段前面插入转义符,表示这不是帧定界符。PPP协议规定了如下所述的填充方法:

  • 把数据帧字段中出现的每一个0x7E字节转变成2字节序列(0x7D,0x5E)
  • 若数据帧中出现一个0x7D的字节,也就是出现了和转义字符一样的比特组合,则把0x7D转变为2字节序列(0x7D,0x5D)
  • 若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符)则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变。(说实在,感觉好复杂,相信用不着嘿嘿)

在接收端进行与发送端相反的变换,正确恢复出原来的信息

零比特填充

具体做法:在发送端,扫描数据帧,只要发现有5个连续1,则立即填入一个0。因此经过这种零比特填充后的数据,保证在信息字段中不会出现6个连续1。为什么不能出现6个连续的1?因为我们PPP协议的帧定界符为0x7E(也就是01111110),所以保证了数据帧中不会出现0x7E字段。如图:

PPP协议的工作状态

PPP协议的工作状态可以用下图来描述

PPP链路的起始或终止状态永远是图中的链路静止,这时在用户个人电脑和ISP的路由器上不存在物理层的链接

当用户个人电脑呼叫路由器时,路由器能够检测到信号,物理层建立连接,PPP进入了链路建立状态,其目的是建立链路层的LCP连接。这时LCP开始协商一些配置选项,即发送LCP的配置请求帧。这是一个PPP帧,其PPP帧的协议字段置为LCP对应的代码,信息字段包含特定的配置请求

链路的另一端可以发送以下几种响应中的一种:

  • 配置确认帧(Configure-Ack): 所有配置选项都接受。
  • 配置否认帧(Configure-Nak): 所有选项都理解但不能接受
  • 配置拒绝帧(Configure-Reject): 选项有的无法识别或不能接受,还需要协商。

LCP配置选项包括了比如链路上的最大帧长,所要使用的鉴别协议,以及不使用PPP帧中的地址和控制字段,因为这两个字段前面提到了,暂时没有什么特殊的意思,所以双方规定了遇到这两个字段就忽略掉。

协商结束后双方就建立了LCP链路,接着就进入了“鉴别”状态。在这一状态下,只允许传送LCP协议的分组,鉴别协议的分组以及监测链路质量的分组。鉴别身份失败,则转到链路终止状态,鉴别成功,则进入网络层协议状态。

网络层协议状态,PPP链路的两端的网络控制协议NCP根据网络层的不同协议互相交换网络层特定的网络控制分组。这个步骤保证我们前面提到的PPP所需要满足的一些需求的第四点:支持多种网络层协议。使得PPP协议的两端的网络层可以运行不同的网络层协议,但仍然可以使用同一个PPP协议进行通信。

当网络层配置完毕后,链路就进入了可以进行数据通信的链路打开状态。链路的两个PPP端点可以彼此向对方发送分组。两个PPP端点还可以通过发送回送请求LCP分组和回送回答LCP分组,以检查链路的状态。

数据传输结束后,可以由链路的一端发出终止请求LCP分组请求终止链路连接,在收到对方发来的终止确认LCP分组后,转到链路终止状态。链路出现故障,也会从链路打开状态转入到链路终止状态

使用广播信道的数据链路层

局域网

广播信道最重要的一个应用就是局域网。局域网是一个为单位所拥有的的,且地理范围和站点数目均有限的网络

局域网具有如下一些主要优点:

  • 具有广播功能:从一个站点可以很方便地访问全网。局域网上的主机共享连接在局域网上的各种硬件和软件资源。
  • 便于系统的拓展和逐渐演变,各设备的位置可灵活调整和改变。
  • 提高了系统的可靠性,可用性和生存性。

局域网按照网络拓扑进行分类,可以分为星形网环形网总线网,他们的网络拓扑图如下:

这里指出,局域网工作的层次跨越了数据链路层和物理层,但因为局域网技术中的有关数据链路层的内容比较丰富,特在这里提出,并不表示局域网仅仅和数据链路层有关。

在局域网中,以太网已经占据了统治的地位。

共享信道需要考虑的问题

共享信道需要考虑的问题就是如何让众多用户能够合理而方便地通信资源,主要有两种方法

  • (1)静态划分信道: 静态分配用户使用的信道,用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价很高,不适合局域网使用。比如说某用户分配到了信道,但是一直占着却不通信,其他用户就无法使用这段通信资源直到该用户释放该信道,这大大降低了通信效率。
  • (2)动态媒体接入控制:又称为多点接入(multiple access),其特点是信道并非在用户通信时固定分配给用户,又主要分成以下两类:
    • 随机接入:随机接入的特点是所有的用户都随机德发送信息,但如果恰巧有两个或更多的用户在同一时刻发送消息,那么就发送了碰撞,使得这些用户的发送都失败,所有,需要有解决碰撞的网络协议
    • 受控接入:受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。比如分散控制的令牌环局域网和集中控制的多点线路探询(polling)轮询

CSMA/CD 协议

这里需要提一下适配器,计算机与外界局域网的连接是通过通信适配器进行的,适配器是后面检测信道空闲执行退避算法的主体。

最早的以太网(一种局域网)将许多的计算机都连接到一根总线上。这是因为在哪个时代认为,”有源器件不可靠,而无源的电缆线才是最可靠的“。

总线的特点就是当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据,这种就是广播通信方式

为了通信的方便,以太网采取了一下的两种措施:

  1. 采用灵活的无连接的工作方式,不需要在传输数据前先建立连接。对发送的数据帧不尽进行编号,也不要求对方发回确认。因此,以太网提供的服务是尽最大努力的交付,是不可靠的交付。当目的站收到有差错的帧时,就把帧丢弃,其他什么都不做。对有差错的帧是否需重传则由高层决定。例如,如果高层是TCP协议,TCP发现有数据丢失,重新发送数据,但以太网并不知道这是重传帧,只是当成新的数据帧来传送
    我们知道,总线上在同一时间只能允许一台计算机发送数据,否则各计算机之间就会互相干扰。因此,如何协调总线上各计算机的工作就是以太网要解决的一个重要问题。以太网使用的协议是CSMA/CD,意思是载波监听多点接入/碰撞检测(Carrier Sense Multiple Access with Collision Detection)

  2. 第二,以太网发送的数据都使用曼彻斯特编码的信号。

CSMA/CD协议的要点
  • 多点接入:指的是网络是总线型网络,计算器以多点接入的方式连接在一起。

  • 载波监听:载波监听其实就是检测信道。不管在发送前还是在发送中,每个站都必须不停地检测信道。在发送前检测信道,是为了获得发送权。检测到没有其他站在发送,就发送数据。在发送过程中检测信道,是为了及时发现有没有其他站的发送和本站发送的碰撞。这也称为碰撞检测,也叫冲突检测

    碰撞检测也就是边发送边监听。适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己发送数据时其他站是否也在发送数据。

    如果有多个站同时在总线上发送数据,总线上的信号电压会增大,电压超过一定门限值时,就认为了总线上至少有两个站同时在发送数据,表面发生了碰撞,也就是发生了冲突。任何一个正在发送数据的栈,一旦发现总线上出现了碰撞,就要立即停止发送,等待一段时间后再次发送。

我们不是在发送数据前检测信道监听到信道为空闲了吗?为什么还要边发送边监听呢?这是因为我们数据通过电磁波在总线上是以有限的速率传播的。正如在一个会议中,一听到会场安静,我们就立即发言,但恰好这时也有人发觉会场安静,也发言了,于是你们同时发言了,这就产生了冲突

CSMA/CD协议的具体过程

如图3-17,图中的局域网两端的站A和站B相距1km,用同轴电缆相连。电磁波在1km电缆的传播时延为5μs\mu s。因此,A检测到信道空闲后,向B发送数据,在约5μs5\mu s才能传送到B,且A的传输的途中(未到达B),B检测信道,信道此时也显示空闲,若此时B发送数据,则一定会在途中与A发送的数据发生碰撞,碰撞的结果是两个帧都变为无用帧

在局域网的分析中,我们常把总线上的单程端到端传播时延为τ。因此我们可以知道,A检测到信道控线后,发送数据,最迟经过可以知道自己发送的数据与其他站发送的数据有没有发生碰撞,这种情况发生在A就快要到达B了(很接近很近但就是没到),然后此时B默默发出一个数据,然后B主机发送的数据报经过τ时间后到达A,告诉A…对不起碰撞了

在使用CSMA/CD 协议时,一个站不可能同时进行发送和接收(但必须边发送边监听信道)。因此使用CSMA/CD协议的以太网不可能进行全双工的方式而只能进行半双工通信。注意与PPP协议区别,PPP协议只支持全双工链路

下面是图3-17一些重要的时刻

  • t=0,此时A发送数据。B检测到信道为空闲。
  • t=τ-δ\delta,此时A发送的数据还没有到达B,所以B检测到信道是空闲的,因此B发送数据。
  • t=τ-δ\delta/2,此时A发送的数据和B发送的数据发生了碰撞。但这时A和B都不知道发送了碰撞。相当于可以看作A和B数据相遇,擦肩而过继续传播。
  • t=τ,A的数据到达了B,并告诉B在过程中发生了碰撞,B于是停止发送数据。
  • t=2π-τ,B的数据到达了A,并告诉了A在过程中发生了碰撞,A于是也停止发送数据。

A和B发送数据均失败,它们都要推迟一段随机的时间再重新发送

由此可见,每一主机在检测到信道空闲后,选择发送数据,在发送数据之后的一小段时间内,仍然存在着遭遇碰撞的可能性。这一小段时间是不确定的,取决于另一个发送数据的站到本站的距离。因此,以太网不能保证某一时间之内一定能够把自己的数据帧成功地发送出去,这一特点称为发送的不确定性

我们前面提到,最先发数据帧的A主机,在发送数据帧后最多(最迟)经过就可以知道所发送的数据帧是否遭到了碰撞。这是δ0\delta → 0的情况,也就是前面说的在A就快要到达B了(很接近很近但就是没到),然后此时B默默发出一个数据,几乎两个动作同时进行(极限的思想)。因此以太网的端到端往返时间2τ又称为争用期
争用期(contention period)又称碰撞窗口(collision window)

于是我们得到结论:一个主机A(站)在发送完数据后,只要通过争用期的考验,即经过争用期这段时间还没有检测到碰撞的话,这样,直到A的数据顺利发送完毕,任何其他站检测信道都会检测到信道忙,我们可以肯定A发送数据不会发生碰撞了。

重传机制–截断二进制指数退避(truncated binary exponential backoff)

前面我们提到,A和B发生碰撞后,发送数据均失败,它们都要推迟一段随机的时间再重新发送

这种重新发送我们又称为重传。问题就来了?推迟的机制是什么?如何确定推迟的时间呢

以太网使用截断二进制指数退避算法来确定碰撞后重传的时机。这种算法让发生碰撞的站(主机)在停止发送数据后,不是等待信号变为空闲后就立即再次发送数据,而是选择推迟(或叫退避)一个随机的时间。之所以要采取这种机制,原因很容易理解,因为如果几个发生碰撞的站都在监听信道,那么很大概率会同时发现信道变为空闲,于是再次冲突,再次退避,再次冲突,再次退避,再次冲突…。

具体的退避算法如下:

  1. 首先协议规定了基本退避时间为争用期2τ,具体的争用期时间51.2μs51.2\mu s,对于10 Mbit/s的以太网,在争用期内可发送512bit(51.2*10),也就是64字节,我们也说争用期是512比特时间。1比特时间就是发送1比特所的时间,争用期就是发送512bit所需的时间

  2. 从离散的整数集合[0,1,...(2k1)][0,1,...(2^{k}-1)]随机取出一个数,记为r。推迟重传的时间是r倍的争用期。k可以按下面的公式计算

    k=Min[10]k=Min[重传数,10]

  3. 当重传16次仍不能成功时,表面此时的网络已经非常地拥挤了,以致于连续发生冲突,则丢弃该帧,向高层报告。

例如在第一次重传时,k=1,随机数r从整数{0,1}中选一个数,因此重传的时间为0τ或2τ,在这两个时间中随机选择一个。

应当注意到,每发送一个新的帧,就要执行一次CSMA/CD 算法。适配器对过去发生的碰撞并无记忆,只能机械地按照退避算法进行退避,这都导致一种情况的发生:很可能某一个刚发送的新帧运气非常好,推迟时间非常短甚至是直接立即成功地插入到信道中,获得了发送权,而一些运气不好的“老帧”可能要无限期地等待下去…。

还需要注意的一个问题是:上面我们提到了结论:

一个主机A(站)在发送完数据后,只要通过争用期的考验,即经过争用期这段时间还没有检测到碰撞,这样,在A终止发数据前,任何其他站检测信道都会检测到信道忙,我们可以肯定A发送数据不会发生碰撞了,直到A的数据顺利发送完毕。

我们知道,争用期共可以发送64个字节,因为一检测到冲突就终止发送,所以此时发送出去的数据一定是小于64字节的。所以有凡长度小于64字节的帧都是由于冲突而异常终止的无效帧,收到这样的帧,立即将其丢弃。

强化碰撞

前面我们提到,发送数据的站一旦接收到发生了碰撞的信息后,立即停止发生数据。但在此基础上,我们还要继续发送32比特或48比特的人为干扰信号,以便所有用户都知道现在已经发生了碰撞。这就是强化碰撞

如下图3-18,A站从发送数据开始到发现碰撞并停止发送的时间时间是TBT_{B}。A站得知碰撞已经发生时所发送的强化碰撞的人为干扰信号的持续时间是TJT_{J}。发生碰撞使得A浪费的时间为TB+TJT_{B}+T_{J}。而整个信道被占用的时间还要增加一个端到端的时延τ,因此总线被占用的时间是TB+TJ+τT_{B}+T_{J}+τ

帧间最小间隔

以太网还规定了帧间最小间隔为9.6μs9.6\mu s,相当于96bit时间,之所以这么做,是为了使刚刚收到数据帧的站的接受缓存来得及清理,做好接受下一帧的准备

综上所述,我们将利用CSMA/CD协议发送数据的过程归纳如下:

首先是发送前适配器检测信道,检测信道是否空闲。若信道忙,则不停地检测,一直等待信道空闲。一旦信道空闲并在96比特时间内信道保持空闲(保证了帧间最小间隔),适配器就发送这个帧。在边发送的过程中仍要不停地检测信道,及边发送边监听,如果在争用期没有检测到碰撞,则这个帧肯定能够发送成功。 如果在争用期内检测到碰撞,这时应该立即停止正在发送的数据,并按规定发送人为干扰信号,告知所以用户都知道现在已经发生了碰撞,适配器执行指数退避算法,重新检测信道,准备发送。但若重传16次仍不能成功,停止重传并向上报错。

以太网的信道利用率

以图3-21为例,分析以太网的信道利用率

一个站在发送帧时出现了碰撞。经过一个争用期2τ后,又出现了碰撞…,这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是T0T_{0},我们应当注意,成功发送一个帧需要占用信道的时间是T0+τT_{0}+τ,因为发送完最后一个比特后,这个比特还需要在以太网上传播一个τ的时间。因此,必须在经过T0+τT_{0}+τ后以太网的信道才完全进入空闲状态,才允许其他站发送数据。

从图3-21可看出,要提高以太网的信道利用率,就必须减小τ和T0T_{0}之比。在以太网中我们定义了参数α\alpha,它是以太网单程端到端时延τ与**帧的发送时间T0T_{0}**之比:

α=τ ÷ T0\alpha=τ \ \div \ T_{0}

α0\alpha → 0时,表示只要一发生碰撞,就立即可以检测出来,并立即停止发送,因为τ比较小,因而信道资源被浪费的时间非常非常少。反之,参数α\alpha越大,表明争用期所占的比例越大,使得发生一次碰撞就浪费了不少的信道资源,信道利用率,明显降低。

因而,以太网的α\alpha的值应当尽可能小,如何让α\alpha小?可以让τ小和让T0T_{0}大,τ变小也就是以太网端到端连线的长度要小,这也是为什么以太网的长度的通信距离比较短的原因T0T_{0}变大就要求我们发送的以太网帧长不能太短。

以太网的MAC层

MAC层的硬件地址

在局域网中,硬件地址又称为物理地址MAC地址,有48位长。MAC地址一般固化在适配器的ROM中,则IP地址一般存在计算机存储器中。一台计算机的MAC地址一般是不可变的,除非你重新更换一个适配器,而IP地址是可以改变的,与你接入的网络有关。

规定MAC地址字段的第一字节的最低位为I/G位,I/G表示 Individual/Group。当I/G为0时,地址字段表示一个单个站的地址,I/G位为1时表示组地址,用来表示多播

MAC帧的格式

如图3-22表示以太网V2的MAC帧格式,我们假定网络层使用的是IP协议。

MAC帧较为简单,由五个字段组成。前两个字段分别为6字节长的目的地址源地址。第三个字段的2字节为类型字段,用来标志上一层使用的是什么协议。例如,当类型字段的值为0x0800时,表示上层使用的是IP数据报。第四个字段是数据字段,长度在461500字节之间,46是怎么来的?我们前面提到了

我们知道,争用期共可以发送64个字节,因为一检测到冲突就终止发送,所以此时发送出去的数据一定是小于64字节的。所以有凡长度小于64字节的帧都是由于冲突而异常终止的无效帧,收到这样的帧,立即将其丢弃。

所以发送的帧最小长度为64字节,减去18字节的首部和尾部就得到了46-数据字段的最小长度。最后一个字段是4字节的帧检验序列FCS

无效的MAC帧
  • 帧的长度不是整数个字节。

  • 用受到的帧检验序列FCS查出有出错。

  • 受到的MAC帧的数据长度不在461500字节之间,也可以理解为**MAC帧总长度**不在641518之间。

虚拟局域网VLAN

以太网交换机

虚拟局域网VLAN(Virtual LAN)是利用以太网交换机实现,所以我们要先简单提一下以太网交换机

以太网交换机的出现其实是因为人们希望在数据链路层上拓展以太网,以太网交换机的作用就是对收到的帧根据其MAC帧的目的地址进行转发过滤。一般都工作在全双工方式下,相互通信的主机都是独占传输媒体,无碰撞地传输数据,无碰撞,显然以太网交换机是不使用CSMA/CD协议的。

以太网交换机通过自学算法建立起其内部的交换表或者说是地址表,根据受到的帧的目的地址,查表然后转发,不检查差错。

VLAN

虚拟局域网VLAN是由一些局域网网段构成的与物理位置无关的逻辑组,而这些网段具有某种共同的需求。每一个VLAN的帧都有一个明确的标识符,指明发送这个帧的计算机属于哪一个VLAN。

虚拟局域网其实只是局域网给用户提供的一种服务,并不是一种新型的局域网

如图3-27,设有10台计算机分配在三个楼层中,成了三个局域网:

LAN1(A1,A2,B1,C1) LAN2: (A3,B2,C2), LAN3(A4,B3,C3) 但这10个用户划分为了三个工作组,也就是三个虚拟局域网VLAN。即VLAN1:(A1,A2,A3,A4) VLAN2: (B1,B2,B3) VLAN3: (C1,C2,C3)

从图中看出,每一个VLAN的计算机可以处在不同的局域网中。利用以太网交换机可以将这10台计算机划分为三个虚拟局域网:VLAN1, VLAN2, VLAN3。在虚拟局域网上的每一个站都可以收到同一个虚拟局域网上的其他成员发出的广播

例如:计算机B1~B3同属虚拟局域网VLAN2,当B1向工作组内成员送数据时,B2和B3会收到广播的信息,即使他们没有跟B1连在同一个以太网交换机上,而A1,A2和C1都不会收到B1发出的广播信息,虽然它们都与B1连接在同一个交换机上。以太网交换机不向虚拟局域网以外的计算机传送B1的广播信息。这样,虚拟局域网限制了接收广播信息的计算机数,使得网络不会因传播过多的广播信息(广播风暴)而引起性能的恶化。

同时,虚拟局域网可按照需要随时重新组合,很方便。

如何指明发送数据帧的计算机属于哪一个局域网?虚拟局域网的协议在以太网的帧格式中插入了4字节的标识符,称为VLAN标记(tag),指明发送该帧的计算机属于哪一个虚拟局域网。

有关数据链路层的内容差不多就是这些了,真的太多太多了,感觉整理的不是很好,觉得什么东西都很重要,连贯性很强,你有部分东西不写后面又会用到这个名词,都想写下来哈哈

整个数据链路层的内容很多,这里做一个小小的总结:

首先我们提到:

1 数据链路层设计的初衷是为了向网络层提高更高质量的数据传输。

2 网络层传输的是数据报,数据链路层传输的是帧,物理层传输的是比特流。

之后我们引出了所有数据链路层都需要考虑的三个基本问题封装成帧,透明传输,差错检测

为什么要封装成帧?因为数据链路层传输的是帧呀,为什么要透明传输?因为特定的帧定界符也需要封装进帧里,所以需要透明传输的原因也是数据链路层传输的是帧,为什么要差错检测?因为数据链路层的设计的初衷是为了向网络层提供更高质量的数据传输。所有三个基本问题的出现也就顺理成章了,之后就是三个基本问题引出的一系列问题,如CRC校验等。

接着我们介绍了数据链路层的两种协议PPP协议CSMA/CD协议,PPP协议支持的是点对点信道,CSMA/CD协议支持的是广播信道。后面就是对着两个协议一些细节的介绍了。

本篇博客只是自己对课程学习的一些笔记和总结,大部分内容参考自**《计算机网络》**第七版,谢希仁编著。

如有出错(非常大可能会出错哈哈),欢迎指正!

完…

文章作者: luo
文章链接: https://luo41.top/2021/06/05/计算机网络数据链路层/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 luo's Blog