数据链路层概述
链路、数据链路和帧
链路(Link)就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点
数据链路(Data Link)是基于链路的。当在一条链路上传送数据时,除需要链路本身,还需要一些必要的通信协议来控制这些数据的传输,把实现这些通信协议的硬件和软件加到链路上,就构成了数据链路
计算机中的网络适配器(网卡)和其相应的软件驱动程序就实现了这些协议。一般的网络适配器都包含了物理层和数据链路层这两层的功能
帧(Frame)是数据链路层对等实体之间在水平方向进行逻辑通信的协议数据单元PDU
数据链路层的重要问题
数据链路层的重要问题分别是:
- 封装成帧和透明传输
- 差错检测
- 可靠传输
封装成帧和透明传输
数据链路层将上层交付下来的协议数据单元PDU添加帧首部和帧尾部,这称为封装成帧
帧的首部和尾部中包含有一些重要的控制信息
下面是以太网MAC的格式:
- FCS字段:接收方可根据该字段的值来判断帧在传输过程中是否产生了误码
下面是PPP帧的格式:
- 标志字段:接收方的数据链路层在收到物理层交付上来的比特流后,根据帧首部和尾部的标志字段就可以从比特流中识别出帧的开始和结束,也就是进行帧定界
假设发送方给接收方连续发送了两个帧,接收方的数据链路层根据每个帧的帧定界符来识别出一个个的帧
但是如果在帧的数据载荷部分恰好出现了与标志字段取值相同的数据,则在不采取措施的情况下,接收方的数据链路层就会出现帧定界的错误
如果不解决该问题,则数据链路层就会对上层交付的PDU的内容有所限制,即PDU中不能包含帧定界符。显然,这样的数据链路层没有什么应用价值
如果能够采取措施,使得数据链路层能够对上层交付的PDU的内容没有任何限制,则就好像数据链路层不存在一样,就称其为透明传输
差错检测
实际的通信链路都不是理想的,表示比特的信号在信道上传输时,不可避免地会产生失真,甚至出现误码(即比特0变为1,1变为0)
接收方需要根据差错检测来判断帧中是否出现误码
例如接收方的数据链路层采用某种检错技术,根据帧的内容计算出一个检错码,并将检错码填入帧尾部,帧尾部中用来存放检错码的字段称为帧检验序列(FCS)
接收方的数据链路层根据帧尾部取出检错码,并采用与发送方相同的检错技术,就可通过检错码检测出帧在传输过程中是否会出现了误码
可靠传输
若数据链路层向其上层提供的是不可靠传输服务,则接收方的数据链路层直接丢弃有误码的帧即可、
若数据链路层向其上层提供的是可靠传输服务,则就需要数据链路层通过某种机制,实现发送方发送什么,接收方就能收到什么
封装成帧和透明传输
封装成帧
封装成帧是指数据链路层给上层交付的协议数据单元PDU添加帧头和帧尾,使之成为帧
帧的首部和尾部中包含一些重要的控制信息
帧首部和尾部的作用之一就是帧定界
需要注意的是,并不是每一种数据链路层协议的帧都含有帧定界标志,例如以太网V2的MAC帧中就没有帧定界符
以太网V2的帧定界标志是在物理层为MAC帧添加一个8字节的前导码,前导码中的前7字节为前同步码,作用是使接收方的时钟同步,之后的1字节为帧开始定界符,标明其后面紧跟着的就是MAC帧
另外,以太网还规定了帧间间隔为96比特的发送时间,因此其MAC帧不需要帧结束定界符
为了提高数据链路层传输帧的效率,应当使帧的数据载荷的长度尽可能地大于首部和尾部的长度
考虑到对缓存空间的需求以及差错控制等诸多因素,每一种数据链路层都规定了帧的数据载荷的长度的上限,即最大传送单元(Maximum Transfer Unit, MTU),如以太网帧的MTU为1500字节
透明传输
透明传输是指数据链路层对上层交付的传输协议数据单元没有任何限制,就好像数据链路层不存在一样
帧的数据部分中可能存在与帧定界符相同的比特序列,如果不采取一些措施,则会导致接收方错误地判断了帧的结束
如果接收方不采取某种措施解决该问题,则不能称之为透明传输,否则称之为透明传输
实现透明传输的方法
-
面向字节的物理链路使用字节填充的方法实现透明传输
在把帧交付给物理层之前,对帧的数据载荷进行扫描,每出现一个帧定界符,就在其前面添加一个1字节的转义字符(即ESC字段)
接收方的数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符时,认为是帧的开始,当遇到转义字符时就知道其后面的1字节虽然与帧定界符相同,但其实是数据。之后将转义字符剔除,并从转义字符之后的内容继续提取
如果原始的帧的数据载荷部分包含有与转义字符相同的数据,则同样只需要在该数据前面插入一个转义字符即可
转义字符是一种特殊的控制字符,其长度为1字节,十进制值为27,而不是ESC这三个字符
注意:做题时,转义字符应该添加在左侧,而不是右侧
-
面向比特的物理链路使用比特填充的方法实现透明传输
假设某数据链路层协议采用8比特的特定位串
01111110作为帧定界符这是发送方的数据链路层封装成的帧:
在帧的数据载荷部分恰好包含有帧定界符的特定位串
则发送方的数据链路层会在将帧交付给物理层之前对帧的数据载荷部分进行扫描(从左至右),若出现了连续的5个比特1,就在其后插入一个比特0,填充之后的数据载荷就不会出现帧定界符
接收方的数据链路层在把数据载荷交付给上层之前,会对数据载荷进行扫描(从左至右),每当发现连续的5个比特1,就把其后的一个比特0剔除,这就可以还原出原始的数据载荷
差错检测
误码的相关概念
实际的通信链路都不是理想的,比特在传输过程中可能会产生差错(比特差错):1可能会变成0,而0也可能会变成1,这称为比特差错
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER(Bit Error Rate)。提高链路的信噪比,可以降低误码率。但在实际的通信链路上,不可能使误码率下降为零
使用差错检测技术来检测数据在传输过程中是否产生了比特差错,这是数据链路层所要解决的重要问题之一
接收方的数据链路层从物理层交付的比特流中提取出一个帧后,就需要使用差错检测措施来判断帧中是否出现了误码
例如接收方的数据链路层采用某种检错技术,根据帧的内容计算出一个检错码,并将检错码填入帧尾部,帧尾部中用来存放检错码的字段称为帧检验序列(FCS)
接收方的数据链路层根据帧尾部取出检错码,并采用与发送方相同的检错技术,就可通过检错码检测出帧在传输过程中是否会出现了误码
奇偶校验
奇校验:在待发送的数据后面添加1个校验位,使的添加该校验位后的整个数据中比特1的个数为奇数
偶校验:在待发送的数据后面添加1个校验位,使的添加该校验位后的整个数据中比特”1“的个数为偶数
如果有奇数个比特位发生误码,则整个数据中比特1的个数的奇偶性将发生变化,因此奇偶校验可以检查出发生了误码
如果有偶数个比特位发生误码,则整个数据中比特1的个数的奇偶性不会发生变化,奇偶校验也将不能检查出发生了误码
在实际使用中,奇偶校验又可分为垂直奇偶校验、水平奇偶校验以及水平垂直奇偶校验
由于漏检率比较高,所以一般不采用这种方法
循环冗余校验CRC(Cyclic Redundancy Check)
数据链路层广泛使用漏检率极低的循环冗余校验检错技术
循环冗余校验的基本思想:
-
收发双方约定好一个生成多项式G(x)
-
发送方基于待发送的数据和生成多项式计算出差错检测码(冗余码),并将冗余码添加到待传输数据的后面一起传输
-
接收方收到数据和冗余码后,通过生成多项式来计算收到的数据和冗余码中是否产生了误码
例:待发送的数据为101001,生成多项式为G(x) = x^3^ + x^2^ + 1,计算冗余码
发送方操作:
-
构造“被除数” —— 在待发送数据后面添加生成多项式最高次数个0
101001 000
-
构造“除数” —— 将生成多项式各项系数构成的比特串作为除数
1 × x^3^ + 1 × x^2^ + 0 × x^1^ + 1 × x^0^ → 1101
-
做“二进制模2除法” —— 相当于对应位进行逻辑异或运算
计算得出余数为“1”
商的确定方法:
当被除数和除数的位数相差为1时,就可以在下一位商的位置处标记为1,然后将与该位的商对应位置的被除数的比特落下,与除数进行二进制异或运算
如果标记为1并将被除数中的位落下后发现依然不够除,则该位的商就需要标记为0,直至被除数与除数之间的位数相差只有1
-
检查”余数“ —— 余数的位数应与生成多项式最高次数相同,如果位数不够,则在余数前补0来凑足位数
余数为“1”,而生成多项式最高次数为3,所以在余数前添加2位0,得到结果“001:,即为冗余码,将冗余码添加到待发送数据的后面构成“101001 001”,进行发送
接收方操作:
-
构造“被除数” —— 将接收到的信息作为被除数
101101 001(假设数据的第四位出现误码)
-
构造“除数” —— 将生成多项式各项系数构成的比特串作为除数
1101
-
做“二进制模2除法” —— 相当于对应位进行逻辑异或运算
计算得出余数为“11”
-
检查“余数” —— 余数为0,可认为传输过程无误码;余数不为0,可认为传输过程产生了误码
认为传输过程产生了误码
生成多项式直接关系到循环冗余校验的漏检率,因此CRC算法要求生成多项式必须包含最低次项(即x^0^必须与1相乘)
奇偶校验、循环冗余校验等差错检验技术,只能检测出帧在传输过程中出现了差错,但并不能定位错误,因此无法纠正错误
要想纠正传输中的差错,可以使用冗余信息更多的纠错码(海明码)进行前向纠错。但纠错码的开销比较大,在计算机网络中较少使用
在计算机网络中通常采用检错重传方式来纠正传输中的差错,或者仅仅是丢弃检测到差错的帧,这取决于数据链路层向上层提供的是可靠传输服务还是不可靠传输服务
循环冗余校验CRC有很好的检错能力(漏检率非常低),虽然计算比较复杂,但非常易于用硬件实现,因此被广泛应用于数据链路层
可靠传输的基本概念
使用差错检测技术(如CRC),接收方的数据链路层就可以检测出帧在传输过程中是否产生误码(比特错误),之后接收方会对该帧进行怎样的处理,取决于数据链路层向其上层提供的是什么样服务
若数据链路层向上层提供的是不可靠传输服务,则数据链路层直接丢弃有误码的帧即可,其他的什么也不做
若数据链路层向上层提供的是可靠传输服务,则数据链路层需要通过某种机制实现发送方发送什么,接收方最终就能接收到什么
一般情况下,有线链路的误码率比较低,为了减小开销,并不要求数据链路层向上提供可靠传输服务。即使出现了误码,可靠传输的问题也可以由其上层处理
而无线链路易受干扰,误码率比较高,因此要求数据链路层必须向上提供可靠传输服务
比特差错只是传输差错中的一种,从整个计算机网络结构来看,传输差错还包括分组丢失、分组失序以及分组重复
-
分组丢失
当分组到达传输路径上的某个路由器时,如果该路由器的输入队列已满,则路由器会主动丢弃该分组
-
分组失序
不同的分组可以经过不同的路径到达接收方,而各条路径的距离、路径中各路由器的性能和繁忙程度都可能不同,因此各分组到达接收方的顺序可能与发送方发送它们的顺序不同
-
分组重复
当分组到达某个路由器时,由于该路由器此时比较繁忙,因此分组会在路由器的输入队列中等待较长时间,则会导致发送方对该分组的超时重传,若最后超时重发的分组以及之前处于等待队列中的分组都到达了接收方,就造成了分组的重复接收
比特差错只会出现在数据链路层及其下层,而分组差错则通常出现在数据链路层之上
由于传输差错并不只在是数据链路层上出现,所以可靠传输服务并不仅仅局限于数据链路层,其他各层均可选择实现可靠传输
- 若网络接口层使用的是信道易受干扰的802.11无线局域网,那么其数据链路层就必须实现可靠传输
- 若网络接口层使用的是信道质量比无线局域网要号很多,那么其数据链路层不要求实现可靠传输
- 网际层的IP协议向其上层提供的是无连接、不可靠的传输服务
- 运输层的TCP协议向其上层提供的是面向连接的可靠传输服务
- 运输层的UDP协议向其上层提供的是无连接、不可靠传输服务
可靠传输的实现比较复杂,开销也比较大,是否使用可靠传输取决于应用需求
可靠传输的实现机制 — 停止-等待协议SW(Stop-and-Wait)
可靠传输的实现机制包括:停止-等待协议、回退N帧协议、选择重传协议
这三种可靠传输的实现机制的基本原理并不局限于数据链路层,可以应用到计算机网络体系结构中的各层协议中
停止-等待协议的基本工作原理
情况1
收发双方基于因特网进行通信,而不是局限于一条点对点的数据链路,纵坐标为时间
发送方给接收方发送一个数据分组,接收方收到后,对其进行差错检测,若没有检测出误码,则接受该数据分组,并给发送方发送确认分组,简记为ACK
发送方收到对所发送数据分组的确认分组后才能发送下一个数据分组
假设发送的第二个分组在传输过程中出现了误码,接收方收到后对其进行差错检测,检测出了误码,则丢弃该数据分组,并给发送方发送否认分组NAK
发送方收到对所发送数据分组的否认分组后,就知道自己之前发送的数据分组出现了误码且被接收方丢弃,于是立即重传该数据分组
接收方收到重传的分组后对其进行差错检测,若没有检测出误码,则接受该数据分组并给发送方发送确认分组
因此发送方每发送完一个数据分组后,并不能立即将该数据分组从发送缓存中删除,因为之后有可能需要重传该数据分组,只有收到针对该数据分组的确认分组后,才能将其从发送缓存中删除
本例只介绍了有确认、否认和重传机制的SW协议,似乎已经可以实现可靠传输了,但如果出现数据分组、确认(或否认)分组丢失的情况,仅实现确认、否认和重传机制的SW协议仍不能实现可靠传输
情况2
若发送方发送的数据分组在传输过程中丢失了,因此接收方不可能收到该数据分组,也就不会收到给发送方发送的确认或否认分组
如果不采取措施,发送方就会一直处于等待接收方ACK或NAK的状态
为解决上述问题,发送方可在每发送完一个数据分组时就启动一个超时计时器(Timeout Timer)。若到了超时计时器所设置的超时重传时间(Retransmission Time-Out, RTO),且发送方仍未收到接收方的ACK或NAK,就重传之前已发送过的数据分组
一般将超时重传时间设置为略大于收发双方的平均往返时间RTT
当发送方设置的超时计时器超时时,发送方就会立即重传之前已发送的数据分组
接收方若正确接收到重传的数据分组,就给发送方发送相应的确认分组,发送方收到后,就可以发送下一个数据分组了,接收方收到后,就可以给发送方发送相应的确认分组了
至此,在确认、否认和重传机制的基础上又添加了超时重传机制,然而,这样的SW协议仍不能完全实现可靠传输
情况3
发送方给接收方发送一个数据分组,接收方正确接收该数据分组后,给发送方发送相应的确认分组,然而,该确认分组在传输过程中丢失了,这必然会造成发送方的超时重传,这样接收方就会收到两个相同的数据分组,如果接收方不能识别出所接收的数据分组与前一次接收的数据分组是重复的,则会导致分组重复这种传输差错
为了避免分组重复,就必须给每个分组带上序号
对于SW协议,由于每发送一个数据分组就停止等待,只要保证每发送一个新的数据分组,其序号与上一次发送的数据分组的序号不同就可以了(用一个比特来编号就足够了,0和1交替使用)
接收方连续收到序号相同的数据分组时,就可识别出分组重复这种传输差错,这时,接收方应当丢弃重复的数据分组,并且还必须向发送方再发送一个确认分组(以避免发送方继续重发),发送方收到该确认分组后,就可以给接收方发送下一个数据分组,其序号与上一个数据分组的序号是不同的,接收方若正确接收到该数据分组,就给发送方发送相应的确认分组
至此,在原有机制的基础上有添加了给数据分组编号的机制,不单单数据分组需要编号,确认分组也需要编号
情况4
发送方发送0号数据分组,接收方正确接收后给发送方发送确认分组(对应图中的ACK0),由于某种原因,该确认分组迟到了,这必然会导致发送方对0号分组的超时重传
若在0号分组的重传过程中,发送方收到了迟到的确认分组(误把其当做了重传的0号数据分组的确认),于是给接收方发送1号数据分组(DATA1),接收方收到重传的0号数据分组,根据序号可知,这是一个重复的分组,将其丢弃,并针对0号数据分组再发送一个确认分组,这样发送方就会收到两个针对0号数据分组的确认
然而,发送方会将第二个针对0号数据分组的确认误认为是针对1号数据分组的确认
如果给确认分组也编上序号,发送方就可以知道这是对0号数据分组的重复确认,忽略即可
接收方正确收到1号数据分组后,给发送方发送针对1号数据分组的确认分组,确认分组编号为1,发送方收到后,给接收方发送下一个数据分组,序号为0(第二个0号分组),接收方正确接收后,给发送方发送相应的确认分组,确认号为0(第二个0)
至此,具有确认、否认、重传、超时重传、分组编号机制的SW协议就可以实现在不可靠的信道上实现可靠传输了
SW协议注意事项
-
使用超时重传机制后,就可以不使用否认机制了,这样可使协议实现起来更加简单
但是,如果点对点链路的误码率较高,使用否认机制可以使发送方在超时计时器超时前就尽快重传
-
为了让接收方能够判断所收到的数据分组是否是重复的,需要给数据分组编号
由于停止-等待协议的等待特性,只需1个比特编号就够了,即编号0和1
-
为了让发送方能够判断所收到的ACK分组是否是重复的,需要给ACK分组(确认分组)编号,所用比特数量与数据分组所用比特数量一样
数据链路层一般不会出现ACK分组迟到的情况,因此在数据链路层实现停止-等待协议一般可以不用给ACK分组编号
-
超时计时器设置的重传时间应仔细选择,一般可将重传时间选为略大于“从发送方到接收方的平均往返时间”
在数据链路层点对点的往返时间比较确定,重传时间比较好设定
在运输层,由于端到端往返时间非常不确定,设置合适的重传时间有时并不容易
停止-等待协议属于自动请求重传(Automatic Repeat reQuest, ARQ)协议,即重传的请求是发送方自动进行的,而不是接收方请求发送方重传某个误码的数据分组
SW协议的信道利用率
假设收发双方之间是一条直通的信道:
信道利用率U = TD / (TD + RTT + TA)
- T
D表示发送数据分组的发送时延 - RTT表示信号在收发双方之间传播所耗费的时间
- T
A表示确认分组的发送时延
注意:
- T
A一般远小于TD,因为确认分组的长度远小于数据分组的长度,因此TA一般可以忽略 - 当往返时延RTT远大于分组的发送时延T
D时(例如使用卫星链路),信道利用率非常低 - 若出现超时重传,则对于传送有用的数据信息来说,信道利用率还要降低
- 综上,在往返时间RTT相对较大的情况下,为了提高信道利用率,收发双方不适合采用停止-等待协议,而可以选择回退N帧协议GBN和选择重传协议SR
回退N帧协议GBN(Go-Back-N)
使用停止-等待协议,则发送方每发送完一个数据分组,都停止发送并等待接收方的确认分组,当收到接收方的确认分组后,才能发送下一个数据分组
若信号在收发双方之间链路的传播时延RTT远大于TD,例如使用同步卫星链路,则信道利用率会很低
如果再发送超时重传,则信道的利用率会更低
若发送方在未收到接收方确认分组的情况下,可以连续发送多个数据分组,而不像停止-等待协议那样每发送完一个数据分组就等待接收方的确认分组,则可以显著提高信道的利用率(这称为流水线传输方式)
需要注意的是,在使用流水线传输方式时,发送方不能无限制地连续发送数据分组,否则可能会导致网络中的路由器或接收方来不及处理这些数据分组,进而导致数据分组的丢失,这实际上是对网络资源的浪费
因此,必须采取措施来限制发送方连续发送数据分组的数量
回退N帧协议采用流水线传输方式,并且利用发送窗口来限制发送方连续发送数据分组的数量,这属于连续ARQ协议
GBN协议在SW协议的基础上,利用发送窗口来限制发送方可连续发送数据分组的个数。发送方要维护一个发送窗口,序号落在发送窗口内的数据分组可被连续发送,而不必等收到接收方相应确认分组后再发送
实现机制
发送方:
-
采用n个比特给分组编序号,则数据分组的序号范围是0 ~ 2^n^ - 1
当分组的序号增加到2^n^ - 1时,下一个序号就又从0开始
-
发送方需要维护一个发送窗口W
T,在未收到接收方确认分组的情况下,发送方可将序号落在WT之内的所有数据分组连续发送出去,而发送窗口之外的数据分组不允许发送发送窗口W
T的取值范围是1 < WT≤ 2^n^ - 1,其中n是构成分组序号的比特数量若W
T= 1,则GBN协议退化为SW协议若W
T> 2^n^ - 1,则接收方将无法分辨新、旧数据分组 -
发送方每收到一个按序确认的确认分组,就将发送窗口向前滑动一个位置
接收方:
-
接收方需要维护一个接收窗口W
R,只有正确到达接收方(即无误码)且序号落入WR内的数据分组才允许被接收方接收,而序号位于接收窗口外的数据分组不允许被接收接收窗口W
R的取值范围固定为1,因此接收方只能按序接收数据分组 -
接收方每正确收到一个序号落在接收窗口内的数据分组,就将接收窗口向前滑动一个位置,与此同时,接收方还需要给发送方发送针对该数据分组的确认分组
在回退N帧协议的工作过程中,发送方的发送窗口和接收方的接收窗口按上述规则不断先前滑动,因此该协议又称为滑动窗口协议
回退N帧协议的接收方可采用累积确认的方式(默认回退N帧协议是采用该机制的),即接收方不必对收到的每一个数据分组都发送一个确认分组,而是可以在收到几个序号连续的数据分组后,对按序到达的最后一个数据分组发送确认分组
累积确认机制下的确认分组ACKn,表明序号为n以及之前的所有数据分组都已被正确接收
接收方在何时发送累积确认分组,由具体实现决定
累积确认机制的优点:
- 减少向网络中注入确认分组的数量
- 即使某个确认分组丢失,也可能不必重传数据分组
累积确认机制的缺点:
- 不能向发送方及时准确地反映出接收方已经正确接收的所有数据分组的数量
工作过程
假设使用3个比特为数据分组进行编号,因此编号的范围为0 ~ 7,发送方的发送窗口大小WT为5
无传输差错情况
发送方将序号落入发送窗口内的0 ~ 4号数据分组依次连续发送出去,它们经过因特网的传输,最终正确到达了接收方(没有出现乱序和误码)
接收方按序接收它们,且每接收一个,滑动窗口就向前滑动一个位置,并给发送方发送针对所接收数据分组的确认分组
0 ~ 4号确认分组经过因特网的传输,最终正确到达了发送方,发送方每按序接收一个确认分组,发送窗口就向前滑动一个位置,之后发送方就可以将收到确认的数据分组从发送缓存中删除,而接收方应当尽快取走已正确接收到的数据分组
在无传输差错的情况下,回退N帧协议的信道利用率比停止-等待协议的信道利用率有显著提高
提高的程度取决于发送窗口的大小
超时重传,回退N帧的情况
发送方将序号落入发送窗口内的0 ~ 4号数据分组依次连续发送出去,它们经过因特网的传输,按序到达了接收方,然而2号数据分组在传输过程中产生了误码
接收方按序接收0号和1号数据分组,接收窗口向前滑动两个位置,并给发送方发送0号和1号确认分组
接收方通过2号数据分组中的检错码,检测出该数据分组内出现了误码,因此直接将其丢弃,接收窗口也不能向前滑动
对于这些没有误码,但也未按序到达的数据分组,接收方在丢弃它们后,还需要给发送方发送相应数量的针对最近已按序接收的数据分组的确认分组
对于本例,最近已按序接收的数据分组为1号数据分组,因此接收方在丢弃3号和4号数据分组后,还会向发送方发送两个针对1号数据分组的重复确认
当发送方收到0号和1号确认分组后,就将发送窗口向前滑动两个位置
发送方现在就可以将5号和6号数据分组发送出去了。与此同时,发送方收到针对原先的1号数据分组的两个重复确认,于是发送方就知道了接收方并未按序正确接收2号数据分组,而有两个序号未落入接收窗口的数据分组也不能被接收方接收而被丢弃
接收方收到5号和6号数据分组,由于它们的序号未落入接收窗口中,因此接收方将它们丢弃,并给发送方发送两个针对1号数据分组的重复确认
于是发送方又收到了针对1号数据分组的两个重复确认,至此发送方已经收到了针对1号数据分组的四个重复确认,因此发送方就知道了接收方并未按序正确接收2号数据分组,而到目前为止,已有四个正确的但序号未落入接收窗口的数据分组被接收方丢弃了
发送方可以选择在收到若干个重复的确认分组时就立即对下一个数据分组进行重传,而不必等到该数据分组的重传记时器超时后再重传
具体发送方收到多少个重复确认就立刻开始重传,由具体实现决定
对于本例,假设发送方收到四个重复的确认分组时仍然不会立刻重传
当2号数据分组的重传计时器超时时,发送方就将发送窗口内的2号数据分组以及之后的3 ~ 6号数据分组全部重传,尽管发送方之前发送过的3 ~ 6号数据分组正确到达接收方(因为接收方只能接收序号落入接收窗口内的数据分组)
使用回退N帧协议实现的可靠传输,一个数据分组的差错,就可能引起大量数据分组的重传
在信道质量较差(容易使分组出现误码)的情况下,回退N帧协议的信道利用率并不比停止-等待协议的信道利用率高
发送窗口大小超过规定范围的情况
假设接收方采用的是累积确认机制的回退N帧协议,发送方将发送窗口WT大小设置为8
发送方将序号落入发送窗口的0 ~ 7号数据分组依次连续发送出去,它们经过因特网的传输按序正确到达了接收方
接收方按序正确接收它们,并给发送方发送累积确认分组ACK7,接收窗口向前滑动8个位置
假设ACK7在传输过程中丢失了,则将导致发送方的超时重传
超时重传的0 ~ 7号数据分组按序正确到达接收方,接收方对这8个数据分组按序接收。但是,接收方之前已经按序接收过这8个数据分组,现在是在重复接收,也就是说,接收方无法分辨新旧分组,进而会产生分组重复这种传输差错
因此,发送方的发送窗口取指不能超过其取指范围的上限
选择重传协议SR
三种实现可靠传输的协议对比
-
停止等待协议
仅用1个比特给分组编号
其发送窗口W
T的尺寸为1其接收窗口W
R的尺寸为1 -
回退N帧协议
用n个比特给分组编号
其发送窗口W
T的尺寸为1 < WT≤ 2^n^ - 1,若WT超过了取值的上限,则会出现接收方无法分辨出新旧数据分组的问题其接收窗口W
R的尺寸为1回退N帧协议在无数据分组出现差错的情况下,其信道利用率要比停止-等待协议高不少,但一个数据分组的差错,就可能引起大量数据分组的重传,而这些重传的分组可能原本就已经正确地到达了接收方,但由于序号未落入接收窗口内而被接收方丢弃
-
选择重传协议
为了进一步提高信道利用率,就可以设法只重传出现差错的数据分组,这就需要接收窗口W
R的尺寸大于1,以便先收下失序但正确到达接收方且序号落入接收窗口WR内的数据分组,等到所缺分组收齐后,再一并送交至上层用n(n > 1)个比特给分组编号
其发送窗口W
T的尺寸为1 < WT≤ 2^n^ - 1其接收窗口W
R的尺寸为1 < WR≤ WT(WR超出WT的部分是无意义的),且WT+ WR≤ 2^n^(这是为了确保接收窗口向前滑动时,落入接收窗口内的新序号与之前的就序号没有重叠,避免无法分辨出新旧数据分组的情况),因此可以退出1 < WR≤ 2^(n-1)^当接收窗口W
R取最大值2^(n-1)^时,WT能取到的最大值也为2^(n-1)^为了使发送方仅重传出现差错的数据分组,接收方就不能采用累积确认,而是需要对每一个正确接收的数据分组进行逐一确认
工作过程
正常情况
假设采用3个比特给分组编序号,因此序号范围为0 ~ 7,接收窗口WR取最大值4,发送窗口WT也取最大值4
发送方将序号落入发送窗口中的数据分组依次全部发送出去,其中0号数据分组在传输过程中出现了误码
接收方将出现误码的0号数据分组丢弃,并将失序但正确到达接收方且序号落入接收窗口内的1 ~ 3号数据分组进行缓存,并给发送方发送相应的1 ~ 3号确认分组
接收方缓存的1 ~ 3号数据分组,暂时还不能交付给上层,因为还未收到序号落入接收窗口内的0号数据分组,因此接受窗口不能向前滑动
发送方收到失序的1 ~ 3号确认分组后,并不能向前滑动发送窗口,但要记录1 ~ 3号数据分组已被确认
当0号数据分组的重传计时器超时时,该分组就会被重传
0号数据分组正确到达接收方,接收方正确接收序号落入接收窗口内的0号数据分组,并给发送方发送0号确认分组
接收方可将接收窗口向前滑动4个位置
0号确认分组正确到达发送方,发送方收到该确认分组后,将发送窗口向前滑动4个位置
之后,发送方就可将序号已被移出发送窗口内的数据分组删除了,而接收方应尽快将接收缓存中序号已被移出接收窗口的数据分组取走
异常情况
假设取WT为5,WR保持不变,因此WT + WR > 2^3^
发送方将序号落入发送窗口内的0 ~ 4号数据分组依次发送出去
这些分组按序正确到达接收方,接收方接收它们,并给发送方发送相应的确认分组,同时,接收窗口向前滑动4个位置
假设0号确认分组在传输过程中丢失了,而1~4号确认分组正确到达了发送方
发送方收到1 ~ 4号确认分组后,并不能向前滑动发送窗口,但要记录1 ~ 4号数据分组已被确认
当0号数据分组的重传计时器超时时,发送方会重传该分组
0号数据分组正确到达接收方,接收方发现该数据分组的序号为0,在接收窗口中,因此会将其接收。然而,接收方却不知道该数据分组在之前已被正确接收过了
因此当发送窗口尺寸超过其规定的上限时,会造成接收方无法分辨新旧数据分组的问题
点对点协议PPP
点对点协议PPP(Point-to-Point Protocol)是目前使用最广泛的点对点数据链路层协议
PPP协议的主要应用
-
因特网计算机通过点对点链路连接到某个ISP,进而接入因特网,用户计算机与ISP通信时,所采用的数据链路层协议一般就是PPP协议
-
用于广域网路由器之间的专用线路
PPP协议的组成
PPP协议为在点对点链路上传输各种协议数据报提供了一个标准方法,它主要由以下三部分构成:
- 对各种协议数据报的封装成帧的方法
- 链路控制协议LCP,用于建立、配置以及测试数据链路的连接
- 一套网络控制协议NCPs,用于支持不同的网络层协议
PPP协议能够在多种类型的点对点链路上运行,包括面向字节的异步链路、面向比特的同步链路
PPP帧的格式
PPP帧由帧首部、帧尾部和数据载荷3个部分组成:
-
标志字段(Flag):PPP帧的定界符,取值为0x7E(01111110),长度为1字节
-
地址字段(Address):取值为0xFF,预留(目前没有什么作用),长度为1字节
-
控制字段(Control):取值为0x03,预留(目前没有什么作用),长度为1字节
-
协议字段(Protocol):指明帧的数据载荷部分应向上交付给哪个网络层协议处理,长度为2字节
当取值为0x0021时,表明帧的数据载荷部分为IP数据报,因此应该向上交付给IP协议进行处理
当取值为0xC021时,表明帧的数据载荷部分为LCP分组
当取值为0x8021时,表名帧的数据载荷部分为NCP分组
-
帧检验序列字段(Frame Check Sequence):其值为使用CRC计算出的校验码,长度为2字节
-
帧的数据部分长度不能超过1500字节
PPP协议的透明传输
PPP帧的Flag字段为帧定界符,若以字节角度看,其取值为0x7E;以比特角度看,其取值为01111110
当PPP协议采用的是面向字节的异步链路时,使用字节填充法来实现透明传输
当PPP协议采用的是面向比特的同步链路时,使用零比特填充法来实现透明传输
字节填充法的具体流程
发送方的处理:
-
将数据载荷中出现的每一个0x7E减去0x20(相当于与0x20进行异或运算),然后在其前面插入转义字符0x7D,因此这会将原本数据载荷中出现的每一个0x7E都转换为2字节的 (0x7D, 0x5E)
-
若数据载荷中原来就含有0x7D,则把每一个0x7D减去0x20,然后在其前面插入转义字符0x7D,因此这会将原本数据载荷中出现的每一个0x7D都转换为2字节的 (0x7D, 0x5D)
-
将数据载荷中出现的每一个ASCII码控制字符,即数值小于0x20的字符,加上0x20(相当于与0x20进行异或),以将其转换成非控制字符,然后在其前面插入转义字符0x7D
接收方的处理:进行与发送方相反的操作即可恢复出数据载荷的原始形式
比特填充法的具体流程
将PPP帧首部和尾部的帧定界符看作是取指为01111110的8比特的特定位串,并且帧的数据载荷包含有该特定位串
发送方的处理:对帧的数据部分进行扫描(一般由硬件实现),每出现5个连续的比特1,则在其后填充一个比特0
接收方的处理:对帧的数据部分进行扫描(一般由硬件实现),每出现5个连续的比特1,就把其后的一个比特0删除
PPP帧的差错控制
PPP帧的尾部包含一个2字节的帧检验序列FCS字段,其值是使用循环冗余校验计算出的检错码
循环冗余校验所采用的生成多项式CRC-CCITT为 X^16^ + X^12^ + X^5^ +1
而FCS所检测的范围如下:
接收方每收到一个PPP帧,就进行一次CRC校验,若CRC检验正确,就收下这个帧;反之就丢弃这个帧
使用PPP的数据链路层向上提供的是不可靠传输服务
PPP协议的工作状态
以用户主机拨号接入因特网服务提供者ISP的拨号服务器的过程为例:
PPP链路的开始和结束状态都是静止状态,这时用户PC与ISP的拨号服务器之间并不存在物理层的连接
当检测到调制解调器的载波信号并建立物理层连接后,PPP就进入链路的建立状态
在建立状态下,链路控制协议LCP开始协商一些配置选项,若协商成功,则进入鉴别状态;若协商失败,则退回到静止状态
所协商的配置选项包括最大帧长、鉴别协议等(可以不使用鉴别,也可以使用口令鉴别协议PAP或挑战握手协议CHAP)
若通信双方无须鉴别或鉴别身份成功,则进入网络状态;若鉴别失败,则进入终止状态
进入网络状态后,PPP链路的两端通过互相交换物理层特定的NCP分组来进行NCP配置,如果PPP链路的上层使用的是IP协议,则使用IP控制协议IPCP来对PPP链路的每一端配置IP模块,例如分配IP地址
NCP配置完成后,就进入打开状态
只要链路处于打开状态,双方就可以进行数据通信,当出现故障或链路的一端发出终止请求时,就进入终止状态
当载波停止后就回到静止状态
共享式以太网
以太网(Ethernet)以曾经被假想的电磁波传播介质 — 以太(Ether)来命名
以太网最初采用无源电缆(不包含电源线)作为共享总线来传输帧,属于基带总线型局域网,传输速率为2.94Mb/s
以太网目前已经从传统的共享式以太网发展到交换式以太网,传输速率已经从10Mb/s提高到100Mb/s、1Gb/s甚至10Gb/s
网络适配器和MAC地址
网络适配器
要将计算机连接到以太网,需要使用相应的网络适配器(Adapter),网络适配器一般简称为“网卡”
网卡的大致结构如图所示:
在计算机内部,网卡与CPU之间的通信,一般是通过计算机主板上的I/O总线以并行传输方式进行
网卡与外部以太网(局域网)之间的通信,一般是通过传输媒体(同轴电缆、双绞线电缆、光纤)以串行传输方式进行的
网卡除要实现物理层和数据链路层功能,其另外一个重要功能就是要进行并行传输和串行传输的转换
由于网络的传输速率和计算机内部总线上的传输速率并不相同,因此在网卡的核心芯片中都会包含用于缓存数据的存储器
在确保网卡硬件正确的情况下,为了使网卡正常工作,还必须要在计算机的操作系统中为网卡安装相应的设备驱动程序,驱动程序负责驱动网卡发送和接收帧
MAC地址
对于点对点信道,由于只有两个站点分别连接在信道的两端,因此其数据链路层不需要使用地址
对于连接有多个站点的广播信道,如果总线上的某台主机发送帧给另一台主机,由于广播信道天然的广播特性,表示帧的信号会通过总线传播到总线上的其他所有主机,接收到帧的主机必须在数据链路层使用某种地址来判断该帧是否是发送给自己的
当多个主机连接在同一个广播信道上,要想实现两个主机之间的通信,则每个主机都必须有一个唯一的标识,即一个数据链路层地址
在每个主机发送的帧的首部中,都携带有发送主机(源主机)和接收主机(目的主机)的数据链路层地址
由于这类地址是用于媒体接入控制(Medium Access Control, MAC)的,因此被称为MAC地址
当代表帧的信号传播到了某台主机上时,该主机的网卡就可以判断帧首部中的目的MAC地址字段的值是否与自己的MAC地址匹配,来决定丢弃或接受该帧
MAC地址一般被固化在网卡的电可擦可编程只读存储器EEPROM中,因此MAC地址也被称为硬件地址,MAC地址有时也被称为物理地址
一般情况下,普通用户计算机中往往会包含两块网卡:
- 一块是用于接入有线局域网的以太网卡
- 一块是用于接入无线局域网的Wi-Fi网卡
而每块网卡都有一个全球唯一的MAC地址
交换机和路由器往往具有很多的网络接口,所以会拥有更多的MAC地址
因此,严格来说,MAC地址是对网络上各接口的唯一标识,而不是对网络上各设备的唯一标识
IEEE 802局域网的MAC地址格式
IEEE 802标准为局域网规定了一种由48比特构成的MAC地址,每8个比特为1个字节,从左至右依次为1 ~ 6字节
前三个字节为组织唯一标识符OUI,生产网络设备的厂商需要向IEEE的注册管理机构申请一个或多个OUI
后三个字节为获得OUI的厂商可自行随意分配的网络接口标识符,只要保证生产出的网络设备没有重复地址即可
将每四个比特写为一个16进制的字符,因此48个比特可转换为12个字符
将每两个字符分为一组,共六组,各组之间用短横线连接,就可以得到MAC地址的标准表示形式(Windows系统中采用的就是这种表示方法)
也可将短横线改为冒号(iOS系统采用的就是这种表示方法)
还可将每四个字符分为一组,共分为三组,各组之间用.连接
IEEE 802规定,MAC地址的第一个字节的b0位为I/G位,I(Individual)为单独的意思,G(Group)为组的意思
当I/G位为0时,表示MAC地址为单播地址,当I/G位为1时,表示MAC地址为多播地址(组播地址)
MAC地址的第一个字节的b1位为G/L位,G(Global)为全球的意思,L(Local)为本地的意思
当G/L位为0时,表示MAC地址是全球管理的,这可以确保在全球没有相同的MAC地址,网络设备厂商向IEEE购买的OUI就属于全球管理
当G/L位为1时,表示MAC地址是本地管理的,用户可以任意分配该范围内的MAC地址
将I/G位和G/L位进行组合,可以组合出4种不同的MAC地址类型:
-
全球单播
第一个字节的b1位取0,b0位取0
全球单播地址是由厂商生产网络设备时固化在设备中的
-
全球多播
第一个字节的b1位取0,b0位取1
全球多播地址是交换机和路由器等标准网络设备所支持的多播地址,用于特定功能(如交换机的生成树协议STP中使用的BPDU首部的目的MAC地址)
-
本地单播
第一个字节的b1位取1,b0位取0
由网络管理员分配,优先级高于同一网络接口的全球单播地址
-
本地多播
第一个字节的b1位取1,b0位取1
可由用户对网卡编程实现,以标明其属于哪些多播组
若将MAC地址的48比特用全1表示(FF-FF-FF-FF-FF-FF),则该地址就是广播地址
网卡从网络上每收到一个无误码的帧,就检查帧首部中的目的MAC地址,并按照以下情况进行处理:
- 如果目的MAC地址是广播地址(全F),则接受该帧
- 如果目的MAC地址与网卡上固化的全球单播MAC地址相同,则接受该帧
- 如果目的MAC地址是网卡支持的多播地址,则接受该帧
- 除以上情况外,丢弃该帧
网卡还可被设置为一种特殊的工作方式:混杂方式(Promiscuous Mode)
工作在混杂方式的网卡,只要收到共享媒体上传来的帧就会收下,而不管帧的目的MAC地址是什么
对于网络维护和管理人员,这种方式可以监视和分析局域网上的流量,以便找出提高网络性能的具体措施
嗅探器(Sniffer)就是一种工作在混杂方式的网卡,再配合相应的工具软件(WireShark),就可以作为一种非常有用的网络工具来学习和分析网络
混杂方式就像一把“双刃剑”,黑客常利用这种方式非法获取网络用户的口令
全球单播MAC地址如同身份证一样,具有唯一性,它往往和用户的个人信息绑定在一起,因此,用户应该尽量确保自己拥有的全球单播MAC地址不被泄漏
为了避免用户设备连接Wi-Fi热点时MAC地址泄露的安全问题,目前大多数移动设备都已经采用了随机MAC地址技术
IEEE 802局域网的MAC地址发送顺序
字节发送顺序:第1个字节 → 第6个字节
字节内比特的发送顺序:d0 → d7
单播MAC地址
假设某总线型以太网上有3台主机,主机B要给主机C发生一个单播帧
主机B首先构建该单播帧,在帧首部中的目的地址字段,填入主机C的MAC地址,源地址字段填入自己的MAC地址,之后将单播帧发送出去
主机A和C都能收到该单播帧,主机A发现该单播帧的目的MAC地址与自己的MAC地址不匹配,于是丢弃该单播帧
主机B发现该单播帧的目的MAC地址与自己的MAC地址匹配,于是接受该单播帧,并将该帧的数据载荷交付给上层处理
接收与接受的含义不同:
接收是指网卡从网络中收到某个帧
接受是指网卡除从网络中收到某个帧后,还要对该帧判断是否符合要求(如目的MAC地址与自己的MAC地址是否匹配,帧中是否有误码等),若符合要求才会接受该帧
广播MAC地址
假设主机B要发送一个广播帧,主机B首先构建该广播帧,在帧首部中的目的地址字段,填入广播MAC地址(48比特全为1),源地址字段填入自己的MAC地址,之后将该广播帧发送出去
主机A和C都会收到该广播帧,它们各自的网卡发现该帧的目的MAC地址为广播地址,于是接受该帧,并将帧的数据载荷部分交付给上层处理
多播MAC地址
对于存在环路的交换式以太网,使用广播帧会造成帧在环路中永久兜圈的现象,为解决该问题,需要让环路中的各交换机使用一种特殊的帧 —— BPDU帧进行交互,各交换机根据BPDU中的一些参数,按照生成树协议使用的生成树算法,最终某些交换机会阻塞自己的部分接口,这样就破除了环路
而BPDU首部中的目的MAC地址就是生成树协议专用的多播MAC地址 —— 01-80-C2-00-00-00
CSMA/CD协议的基本原理
在以太网的发展初期,人们普遍认为“无源的电缆线比有源器件可靠”,因此将多个站点连接在一条总线上来构建共享总线以太网
共享总线以太网具有天然的广播特性,即使总线上某个站点给另一个站点发送单播帧,表示帧的信号也会沿着总线传播到总线上的其他各站点
当某个站点在总线上发送帧时,总线资源会被站点独占
此时,如果总线上的其他站点也要在总线上发送帧,就会产生信号碰撞,即当两个或多个站点同时使用总线发送帧时,就会产生信号碰撞
为了解决各站点争用总线的问题,共享总线以太网使用了一种专用协议CSMA/CD,它是载波监听多址接入/碰撞检测(Carrier Sense Multiple Access Collision Detection)的英文缩写词
多址接入MA是指多个站点(主机)连接在一条总线上,它们竞争使用总线
载波监听CS是指每个站点在发送帧之前,先要检测一下总线上是否有其它站点在发送帧
若检测到总线空闲96比特时间,则发送这个帧
若检测到总线忙,则继续检测并等待总线转为空闲96比特时间,然后再发送这个帧
96比特时间就是发送96比特所耗费的时间,也称帧间最小间隔。其作用是使接收方可以检测出一个帧的结束,同时也使得所有站点都能有机会平等竞争信道并发送帧
碰撞检测CD是指每一个正在发送帧的站,边发送边检测碰撞
一旦发现总线上出现碰撞,则立即停止发送,退避一段随机时间后再次从载波监听开始进行发送
CSMA/CD的工作过程
多个主机连接在一个总线上,各主机随机发送帧
假设站点C要发送帧,它首先进行载波监听
在检测到总线空闲96比特时间后,就可以发送帧了,表示帧的信号在总线上传播
假设在站点C使用总线发送帧的过程中,站点B也要发送帧,于是站点B进行载波监听
站点B发现总线忙,于是持续监测总线,一旦发现总线空闲96比特时间,就立即发送帧
站点B边发送帧,还需要边检测碰撞,只要没检测到碰撞,就可继续发送帧的剩余部分
假设在站点B发送帧的过程中,站点C也要发送帧,于是站点C进行载波监听,此时站点C检测到总线空闲,但实际上总线并不空闲,这是因为站点B发送的信号还没有传播到站点C,站点C检测不到而已
站点C检测到总线空闲96比特时间后,就立即发送帧,这必然会导致碰撞
在发送碰撞时,站点B和C都在边发送帧边检测碰撞,但一开始都检测不到碰撞
碰撞信号延总线传播,就本例而言,产生碰撞的位置距离站点C较近,因此站点C比站点B更早检测到碰撞并停止发送帧。站点C会退避一段随机时间,然后再从载波监听开始,以便重发之前遭遇到碰撞的帧
当站点B检测到碰撞后,立即停止发送,并退避一段随机时间后再从载波监听开始,以便重发之前遭遇到碰撞的帧
以太网还采取了一种叫做强化碰撞的措施,即发送帧的站点一旦检测到碰撞,除了立即停止发送帧外,还要再继续发送32或48比特的人为干扰信号,以便有足够多的碰撞信号使所有站点都能检测出碰撞
载波监听检测到的总线空闲,实际上总线并不一定空闲,因此使用CSMA/CD协议的共享总线以太网上各站点,只是尽量避免碰撞并在出现碰撞时做出退避后重发的处理,但不能完全避免碰撞
在使用CSMA/CD协议时,由于正在发送帧的站点必须“边发送帧边检测碰撞”,因此站点不可能同时进行发送和接收,也就是不可能进行全双工通信,而只能进行半双工通信
CSMA/CD协议用于各种总线结构的以太网和双绞线以太网,但不适合无线数据传输网络
争用期
使用CSMA/CD协议的共享总线以太网的各主机在发送帧的过程中都可能会遭遇碰撞
设边缘两端的单程端到端信号传播时延为τ,纵坐标为时间,站点A和D都要发送帧
在t = 0时刻,主机A要发送帧,当检测到总线空闲96比特时间后立即发送该帧
在t = τ - δ时刻,站点A发送的帧还未到达站点D,而站点D也要发送帧,尽管总线现在已经被站点A占用,但站点A发送的信号还未到达站点D,因此在该时刻站点D检测不到总线忙,于是站点D在检测到总线空闲96比特时间后立即发送该帧,这必然会导致碰撞。碰撞发生时刻为t = τ - δ/2时刻,但此时双方还都检测不到碰撞
碰撞信号沿总线传播到总线的两端,在t = τ时刻,站点D首先检测到碰撞,于是站点D立即停止发送帧
在t = 2τ - δ时刻,站点A也检测到碰撞,于是也立即停止发送帧
站点A和D发送帧都失败了,它们都必须要退避一段时间后再重新发送
因此,记以太网端到端的单向信号传播时延为τ,则某站点从发送帧开始,最多经过2τ(即使δ→0)的时长就可检测出所发送的帧是否遭遇了碰撞
因此,以太网的端到端往返传播时延2τ称为争用期或碰撞窗口
一个站点从发送帧开始,经过争用期2τ这段时间还没有检测到碰撞,就可以肯定这次发送不会发送碰撞
从争用期的概念可以看出,共享总线型以太网上的每一个站点从发送帧开始,到之后的一小段时间内,都有可能遭遇碰撞,而这一小段时间的长短是不确定的,1它取决于另一个发送帧的站点到本站点的距离,但不会超过总线的端到端往返传播时延,即一个争用期2τ
显然,网络中的站点数量越多,总线的长度越长,端到端往返传播时延越大,发生碰撞的概率就越大
因此,共享式以太网不能连接太多的主机,使用的总线也不能太长
10Mb/s的共享总线型以太网规定,争用期2τ的值为512比特的发送时间,即51.2μs,因此其总线长度不能超过5120m(计算过程如下图所示)
除考虑了信号传播时延外,还要考虑到网络中可能存在转发器所带来的时延,以及产生碰撞时继续发送32或48比特人为干扰信号所持续的时间,因此单程的端到端传播时延实际上会小于25.6μs
在实际应用中,共享总线以太网规定总线长度不能超过2500m
最小帧长
假设站点A给D发送一个很短的帧,发送期间边发送边检测碰撞
由于该帧很短,因此很快就发送完毕了,于是站点A便不再检测碰撞
若该帧在传送过程中,站点C也要发送帧,则站点C在检测到信道空闲96比特时间后发送帧,这必然会产生碰撞
站点D最终收到遭遇碰撞的帧,直接将其丢弃即可,但站点A并不知道自己已发送完成的帧遭遇了碰撞,因此不会重发该帧,这样站点D就不能正确接收到该帧
为了确保共享总线以太网上的每一个站点在发送完一个完整的帧之前,能够检测出是否产生了碰撞,帧的发送时延就不能少于共享总线以太网端到端的往返时间,即一个争用期2τ
对于使用10Mb/s的共享总线以太网,其争用期2τ的值规定为51.2μs,因此最小帧长为64字节,即512比特(计算过程如下所示)
最小帧长(bit) = 数据传输率(b/s) × 争用期2τ(s)
当某个站点发送帧时,若帧的前64B没有遭遇碰撞,那么帧的后续部分也就不会遭遇碰撞,也就是说,如果遭遇碰撞,也一定是在帧的前64B之内
由于发送帧的站点边发送帧边检测碰撞,一旦检测到碰撞就立即中止帧的发送,此时已发送的数据量一定小于64B,因此接收方只需要判断收到的帧的长度是否小于64B,就可判定出这是否是一个遭遇了碰撞而中止的无效帧,将其丢弃即可
最大帧长
一般来说,帧的数据载荷的长度应远大于帧首部和尾部的总长度,这样可以提高帧的传输效率
然而,如果不限制数据载荷的长度上限,就可能使得帧的长度过长,这会带来一些问题
比如某一个站点发送了一个很长的帧,就使得该站点长时间占用总线,导致总线上的其他站点迟迟拿不到总线的使用权
另外,由于帧过长,可能导致接收站点的接收缓冲区无法装下该帧而产生溢出
因此,以太网V2的MAC帧的数据载荷部分的最大长度被限制在了1500B(此时整体长度为1518字节),而最小长度为46B(此时整体长度为64B,满足最小帧长64B的要求)
截断二进制指数退避算法
在使用CSMA/CD协议的共享总线以太网中,正在发送帧的站点一边发送帧一边检测碰撞,当检测到碰撞时就立即停止发送,退避一段随机时间后再重新发送
共享总线以太网中的各站点采用阶截断二进制退避(Truncated Binary Exponential Backoff)算法来选择退避的随机时间
退避时间 = 基本退避时间 × 随机数r
- 基本退避时间,即争用期2τ
- 随机数r,从离散的整数集合{0, 1, ..., (2^k^ - 1)}中随机选出一个数,其中k = Min{重传次数, 10}
| 重传次数 | k | 离散的整数集合{0, 1, ..., (2^k - 1)} | 可能的退避时间 |
|---|---|---|---|
| 1 | 1 | {0, 1} | 0 × 2τ, 1 × 2τ |
| 2 | 2 | {0, 1, 2, 3} | 0 × 2τ, 1 × 2τ, 2 × 2τ, 3 × 2τ |
| 12 | 10 | {0, 1, 2, ..., 1023} | 0 × 2τ, 1 × 2τ, 2 × 2τ, 3 × 2τ, ..., 1023 ×2τ |
如果连续多次发送碰撞,就表明可能有较多的主机参与竞争信道
使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(这就是动态退避),因而减小发送碰撞的概率,有利于整个系统的稳定
当重传达16次仍不能成功时,表明同时打算发送帧的主机太多,以至于连续发生碰撞,此时应该放弃重传并向高层报告
信道利用率
站点发送一帧所需要的时间包括:发生碰撞后进行退避的时间 + 帧的发送时延 + 帧的单向传播时延τ
考虑以下这种理想情况:
-
各站点发送帧都不会产生碰撞(即不存在进行退避的时间)
-
总线一旦空闲就有某个站点立即发送帧
此时站点发送一帧所占用总线的时间为T0 + τ,而帧本身的发送时间为T0,则极限信道利用率Smax = T0 / (T0 + τ) = 1 / (1 + (τ/T0))
要使Smax尽可能大,则 τ/T0 就应该尽可能小,这意味着:
- 共享以太网端到端的距离不应该太长
- 以太网帧的长度应该尽量长
CSMA/CD协议曾经用于各种总线结构以太网和双绞线以太网的早期版本中,现在的以太网基于交换机和全双工连接,不会产生碰撞,因此也就没有必要使用CSMA/CD协议
使用集线器的共享式以太网
早期的传统以太网是使用粗同轴电缆的共享总线以太网,后来发展到使用价格相对便宜的细同轴电缆
当初认为这种连接方法既简单又可靠,因为在那个时代普遍认为有源器件不可靠,而无源的电缆线才是最可靠的
然而,实践证明这种使用无源电缆线和大量机械接口的总线型以太网并不像人们想象的那么可靠,因为如果总线上的某个机械连接点接触不良或断开,则整个网络通信就不稳定或彻底断网
因此,使用同轴电缆的共享总线以太网已被淘汰
在使用细同轴电缆的共享总线以太网之后,以太网发展出来了一种使用大规模集成电路来替代总线、并且可靠性非常高的设备,叫做集线器(Hub)
站点连接到集线器的传输媒体也转而使用更便宜、更灵活的双绞线电缆
集线器的主要特点如下:
-
使用集线器的以太网虽然物理拓扑是星型的,但在逻辑上仍是一个总线型网
总线上的各站点共享总线资源,使用的还是CSMA/CD协议
-
集线器只工作在物理层,它的每个接口仅简单地转发比特,并不进行碰撞检测
碰撞检测的任务由各站点中的网卡负责
-
集线器一般都有少量的容错能力和网络管理能力
例如,若网络中某个站点的网卡出现了故障而不停地发送帧,集线器可以检测到这个问题,其会在内部断开与故障网卡的连线,使整个以太网能正常工作
新旧共享总线型以太网的对比
新旧共享总线型以太网虽然物理拓扑不同,但工作逻辑相同,网络中的各站点仍然使用CSMA/CD协议来争用网络资源
对于使用同轴电缆的共享总线以太网,表示帧的信号会沿总线传播到各个主机
对于使用集线器和双绞线的星型拓扑的共享式以太网,集线器收到帧后,会把帧把自己的其他各接口转发出去,这样表示帧的信号也会传播到各个主机
若网络中有多个主机要发送帧,对于这两种不同拓扑的共享式以太网,都会出现碰撞的情况
IEEE与1990年制定了10BASE-T星型以太网标准802.3i,这种以太网是局域网发展史上的一座非常重要的里程碑,它为以太网在局域网中的统治地位奠定了牢固的基础
10BASE-T的含义:
- 10是指传输速率为10Mb/s
- BASE是指采用基带信号进行传输
- T表示使用双绞线作为传输媒体
10BASE-T以太网的通信距离较短,每个站点到集线器的距离不能超过100m
IEEE 802.3以太网还可以使用光纤作为传输媒体,相应的标准为10BASE-F,“F”表示光纤
光纤主要用作集线器之间的远程连接
在物理层扩展以太网
扩展站点与集线器之间的距离
共享总线以太网中两站点之间的距离不能太远,否则它们之间所传输的信号就会衰减到使CSMA/CD协议无法正常工作
在早期广泛使用粗同轴电缆或细同轴电缆共享总线以太网时,为了提高网络的地理覆盖范围,常用的是工作在物理层的转发器
IEEE 802.3标准规定,两个网段可用一个转发器连接起来,任意两个站点之间最多可以经过三个网段
随着使用双绞线和集线器的10BASE-T星型以太网成为以太网的主流类型,扩展网络覆盖范围就很少使用转发器了
10BASE-T星型以太网中每个站点到集线器的距离不能超过100m,因此两站点间的通信距离最大不能超过200m
在10BASE-T星型以太网中,可使用光纤和一对光纤调制解调器来扩展站点与集线器之间的距离
这种扩展方法比较简单,所需付出的代价是:为站点和集线器各增加一个用于电信号和光信号转换的光纤调制解调器,以及它们之间的一对通信光纤
信号在光纤中的衰减和失真很小,因此使用这种方法可以很简单地将站点与集线器之间的距离扩展到1000m以上
扩展共享式以太网的覆盖范围和站点数量
以太网集线器一般具有8~32个接口,如果要连接的站点数量超过了单个集线器能提供的接口数量,就需要使用多个集线器,这样就可以连接成覆盖更大范围、连接更多站点的多级星型以太网
某公司的两个部分各有一个10BASE-T以太网
为了让这两个以太网之间可以通信,可使用一个主干集线器将它们连接起来,形成一个更大的网络
采用多个集线器连接而成的多级星型以太网,在扩展了网络覆盖范围和站点数量的同时,也带来了一些负面因素
在将部门A和B各自的以太网互连起来之前,每个部门的10BASE-T以太网是一个独立的碰撞域,两个碰撞域之间互不影响,此时每个部门的10BASE-T以太网的最大吞吐量为10Mb/s,因此两个部门的总最大吞吐量为20Mb/s
其碰撞发生的可能位置如下:
当把两个部门各自的10BASE-T以太网通过一台主干集线器互联起来后,就把原来两个独立的碰撞域合并成了一个更大的碰撞域,即形成了一个覆盖范围更大,站点数量更多的共享式以太网,而这个更大碰撞域的最大吞吐量仍然是10Mb/s,其中的每个站点相较于它们原先所在的独立碰撞域所遭遇碰撞的可能性会明显增加
其碰撞发生的可能位置如下:
综上所述,在物理层扩展的共享式以太网仍然是一个碰撞域,不能连接太多的站点,否则可能会出现大量的碰撞,导致平均吞吐量太低
在数据链路层扩展以太网 — 网桥的主要结构和基本工作原理
使用网桥在数据链路层扩展以太网
使用集线器扩展以太网会形成更大的碰撞域,为了避免形成更大的碰撞域,可以使用网桥在数据链路层扩展共享式以太网
网桥工作在数据链路层(包含其下的物理层),而集线器仅工作在物理层,因此网桥具备属于数据链路层范畴的相关能力,例如:
- 网桥可以识别帧的结构
- 网桥可以根据帧首部中的目的MAC地址和网桥自身的帧转发表来转发或丢弃所收到的帧
网桥的主要结构和基本工作原理
使用网桥将两个集线器的共享式以太网互连起来,会形成一个覆盖范围更大,站点数量更多的以太网,而原来的两个共享式以太网则分别称为这个更大的以太网的一个网段,并且各自是一个独立的碰撞域
网桥的主要结构如图所示,其中转发表是网桥转发帧的依据,里面记录有网桥所知道的网络中各主机的MAC地址与自己的各接口的对应关系。网桥收到帧后,会在自身的转发表中查找帧的目的MAC地址,根据查找结果来转发或丢弃帧
网桥转发单播帧
假设主机A给D发送单播帧,该单播帧被集线器转发给主机B、C以及网桥
主机B和C在收到该单播帧后,它们的网卡根据该单播帧首部中的目的MAC地址可知,这不是发送给自己的帧,于是将其丢弃
网桥从自己的接口1收到该单播帧后,在转发表中查找主机D的目的MAC地址D,根据查找结果可知,应从接口2转发该帧,于是就把该帧从自己的接口2转发给另一个网段,使主机D能够收到该帧
主机D中的网卡根据该单播帧首部中的目的MAC地址可知,这是发送给自己的帧,于是接受该帧,而主机E和F中的网卡,根据该单播帧首部中的目的MAC地址可知,这不是发送给自己的帧,于是将其丢
网桥丢弃帧
假设主机A给C发送单播帧,该单播帧被集线器转发给主机B、C以及网桥
主机B中的网卡根据该单播帧首部中的目的MAC地址可知,这不是发送给自己的帧,于是将其丢弃
而主机C中的网卡,根据该单播帧首部中的目的MAC地址可知,这是发送给自己的帧,于是接受该帧
网桥从接口1收到该单播帧后,在转发表中查找主机C的目的MAC地址,根据查找结果可知,应从接口1转发该帧,但网桥正是从接口1收到该帧的,这表明主机C和主机A在同一个网段,主机C能够直接收到这个帧,而不需要依靠网桥的转发,因此网桥会丢弃该帧
网桥转发广播帧
假设主机A发送了一个广播帧,广播帧的目的MAC地址为全F
该广播帧被集线器转发给主机B、C以及网桥
主机B和C中的网卡会接受该帧
网桥从自己的接口1收到该广播帧时,不会查找转发表,而是直接通过除接收该帧的接口的其他接口转发该广播帧
该广播帧通过集线器的转发,到达另一个网段中的各主机,各主机中的网卡接受该广播帧
网桥的接口在向其连接的网段转发帧时,会执行相应的媒体接入控制协议,对于共享式以太网就是CSMA/CD协议