数据链路层的一些基本概念
- 结点(node):网络中的主机(host)和路由器(router)。
- 链路(link):通信路径上连接相邻结点的通信信道,中间没有任何其他的交换结点。一条链路只是一条通路的一个组成部分
- 数据链路(data link):要在一根线路上传送数据,除了要有一条物理线路外,还要有一些必要的规程来控制这些数据的传输。将实现这些规程的硬件和软件加到链路上,就构成了数据链路。
- 点到点(point to point)通信:在相邻结点间的一条链路上的通信(数据链路层)
- 端到端(end to end)通信:从源结点(source node)到目的结点(destination node)通信。通信路径(path)可能由多个链路组成.(传输层)
数据链路层提供给网络层的服务
要求每一种服务能举例说明
-
无确认的无连接服务
适用场景:①错误率很低的场合;②实时通信,如语音传输
举例说明:
- 以太网(Ethernet):以太网数据帧的传输通常是无确认的无连接服务,适用于局域网中高可靠性和低错误率的场合。
- 语音传输(VoIP):VoIP数据包传输时,由于对实时性要求高,通常采用无确认的无连接服务。
-
有确认的无连接服务
适用场景:无线网络
举例说明:
- 无线局域网(WLAN,Wi-Fi):在Wi-Fi网络中,使用数据帧确认机制来确保每个帧的正确接收,适用于信号不稳定或干扰较大的无线环境。
-
有确认的有连接服务
适用场景:光纤网络
举例说明:
- 面向连接的数据链路层协议(如HDLC):HDLC(高级数据链路控制)协议提供有确认的有连接服务,适用于需要可靠传输的场合,如光纤网络中的数据传输。
- 帧中继(Frame Relay):在某些配置中,帧中继可以提供有连接的服务,确保数据帧按顺序并可靠地传输。
数据链路层的主要功能
通过一些数据链路层的协议,在不太可靠的物理链路上实现可靠的数据传输。
主要有以下几种功能:
-
链路管理
-
数据成帧(frame)
-
差错控制(error control)
-
流量控制(flow control)
-
透明传输
-
寻址
数据成帧
字符计数法(Byte count)
原理:利用帧头部的一个字段来标识该帧中的字符数
特点:简单,无法恢复,已经很少使用
字节填充的标志字节法(Flag bytes with byte stuffing)(重点)
定义
用一些特殊字节(FLAG)作为帧开始和结束标志,用转义字符(ESC)来区分二进制数据中存在的特殊字节。
范例
此处以0x7E特殊字节(FLAG)作为帧开始和结束标志,以0x7D为转义字符(ESC),定义信息字段中的以下三种变换:
- 遇特殊字节:0x7E -> 0x7D + 0x5E
- 遇转义字符:0x7D -> 0x7D + 0x5D
- 遇ASCII中的32个控制字符:0x00~0x20 -> 0x7D + 0x20~0x40
例题:将以下数据还原为转义前的格式:7D 5E FE 7D 27 7D 5D 7D 5D 65 7D 5E
解:①将所有的7D字符以及其后的字符标记出来:
7D 5E FE 7D 27 7D 5D 7D 5D 65 7D 5E
②根据以下逆变换对标记字符进行还原:
7D 5E -> 7E; 7D 27 -> 07; 7D 5D -> 7D
③得到原数据为:7E FE 07 7D 7D 65 7E
位填充的标志比特法(Flag bits with bit stuffing)(重点)
定义
原理:以特殊的位模式01111110作为帧标志,来表示帧的开始和结束。
存在的问题:帧标志‘01111110’ 可能存在于帧中,导致不同帧数据之间的混淆。
解决方案:当帧内容中每出现5个1,则在其后插入一个0,即变成01111101,接收方则将自动删除第5个1后的0。这称为位填充法,也称为透明传输。
范例
例题:110101111101011111101011111110,当帧里的上述比特序列在链路上发送时,采用位填充方法,真实的比特序列是什么?
解:①标记处比特序列中所有5个连续的“1”:
110101111101011111101011111110
②在每个标记序列的后方添加一个“0”即可:
110101111100101111101010111110110
物理层编码违禁法(Physical layer coding violations)
采用冗余编码技术,如曼切斯特编码,即两个脉冲宽来表示一个二进制位
数据0:低-高电平对
数据1:高-低电平对
高-高电平对和低-低电平对没有使用,可用作帧边界
参考自:https://blog.csdn.net/qq_18738333/article/details/65444781
差错控制
基本思想
错误的检测和纠正:数据之外加冗余编码;
- 检错码: 通过编码检查能自动发现差错
- 纠错码: 除了能知道出错,还能知道错误发生的位置、
常用编码
奇偶校验、水平垂直奇偶校验、CRC校验等
误码的相关概念
- 实际的通信链路都不是理想的,比特在传输过程中可能会产生差错(称为比特差错):
- 比特1可能变成比特0
- 比特0可能变成比特1
- 在一段时间内,传输错误的比特数量占所传输比特总数的比率称为误码率(Bit Error Rate,BER)
- 提高链路的信噪比,可以降低误码率。但在实际的通信链路上,不可能使误码率下降为零。
- 使用差错检测技术来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。
奇偶校验
实现方法
通过在待发送的数据后面添加一个校验位, 说的添加该校验位后的整个数据中比特1的个数为奇数(奇校验)或偶数(偶校验)。
局限性
在所传输的数据中,若有奇数个位发生误码(所包含比特1的数量的奇偶性会发生改变),可以检测出误码;若有偶数个位发生误码(所包含比特1的数量的奇偶性不会发生改变),则无法检测出误码
循环冗余校验(Cyclic Redundancy Check,CRC)
实现方法
- 收发双方约定好一个生成多项式G(X);
- 发送方基于待发送的数据和生成多项式G(X),计算出差错检测码(冗余码),将余码添加到待发送数据的后面一起传输;
- 接收方收到数据和余码后,通过生成多项式G(X)来计算收到的数据和余码是否产生了误码。
具体操作
发送方和接收方的具体操作均可以分为以下四步:
步骤 | 发送方 | 接收方 |
---|---|---|
1. 构造“被除数” | 待发送数据后面添加生成多项式最高次数个0 | 接收到的信息作为被除数 |
2. 构造“除数” | 生成多项式各项系数构成的比特串作为除数 | 生成多项式各项系数构成的比特串作为除数 |
3. 做“二进制模2除法” | 相当于对应位进行逻辑异或运算 | 相当于对应位进行逻辑异或运算 |
4. 检查“余数” | 余数的位数应与生成多项式最高次数相同,如果位数不够,则在余数前补0来凑足位数。 | 余数为0,可认为传输过程无误码;余数不为0,可认为传输过程产生了误码。 |
大致可以总结为以下两张图:
范例
-
接收到的信息为101001,生成多项式为 G ( X ) = X 3 + X 2 + 1 G(X)=X^3+X^2+1 G(X)=X3+X2+1,计算冗余码?
解:①构造被除数:生成多项式最高次数为3,在原信息后面添加3个0:101001000;
②构造除数:生成多项式的各项系数如下: 1 × X 3 + 1 × X 2 + 0 × X 1 + 1 × X 0 1\times X^3+1\times X^2+0\times X^1+1\times X^0 1×X3+1×X2+0×X1+1×X0,连起来作为除数1101;
③做二进制模2除法:加法不进位,减法不借位,除法中的减法仍然采用模2运算,具体如下:
④检查余数:将上一步中得到的余数1与生成多项式最高次数3比较,位数不够,在余数前面补0来得到冗余码001;
-
接收到的信息为101101001,生成多项式为 G ( X ) = X 3 + X 2 + 1 G(X)=X^3+X^2+1 G(X)=X3+X2+1,判断传输是否误码?
解:①构造被除数:将接收到的信息101101001作为被除数;
②构造除数:生成多项式的各项系数如下: 1 × X 3 + 1 × X 2 + 0 × X 1 + 1 × X 0 1\times X^3+1\times X^2+0\times X^1+1\times X^0 1×X3+1×X2+0×X1+1×X0,连起来作为除数1101;
③做二进制模2除法:加法不进位,减法不借位,除法中的减法仍然采用模2运算,具体如下:
④检查余数:余数不为0,可认为传输过程产生了误码!
可靠传输
相关基本概念
-
使用上述差错检测技术(例如循环冗余校验CRC),接收方的数据链路层就可检测出帧在传输过程中是否产生了误码(比特差错)。
-
检测出误码后如何处理,取决于数据链路层向其上层提供的服务类型,具体可分为以下两种:
- 不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做;
- 可靠传输服务:通过某种机制实现发送方发送什么,接收方最终就能收到什么。
-
一般情况下,有线链路的误码率比较低。为了减小开销,并不要求数据链路层向其上层提供可靠传输服务。即使出现了误码,可靠传输的问题由其上层处理;无线链路易受干扰,误码率比较高,因此要求数据链路层必须向其上层提供可靠传输服务。
-
传输差错的分类
- 误码(比特差错):即上述差错控制中提到的,比特在传输过程中可能会产生差错;
- 分组丢失:网络中某一节点的输入队列快满时,会主动丢弃收到的分组;
- 分组失序:分组到达目的节点的顺序与发送顺序不同;
- 分组重复:由于链路中某一路由器繁忙,分组在输入队列中等待较长时间,发送方执行超时重发,最终使得接收方收到多个重复的分组。、
以上除第一种误码会出现在数据链路层及其下层外,其他三种均只会出现在数据链路层的上层
-
可靠传输服务并不局限于数据链路层,其他各层均可选择实现可靠传输。
-
可靠传输的实现比较复杂,开销比较大,是否使用可靠传输取决于应用需求。
-
捎带技术
-
滑动窗口协议一般采用双向通信,双向通信发送的帧主要包含两种:
A-B数据帧 , A-B的确认帧;B-A数据帧 , B-A的确认帧;
-
确认帧的数据长度一般很短,但同样需要帧头、校验、控制信息和帧尾,通信效率较低;
-
于是选择将同方向的两种帧混合,即:
将A-B的数据帧,A-B的确认帧,混合在一起;将B-A的数据帧,B-A的确认帧,混合在一起;
-
实际上是在一方收到另外一方发来的数据帧之后。不立即回发确认帧给对方,而是等本站有数据要发送给对方时,将给对方的确认信息和本站发向对方的数据混合成一个帧传送给对方。
-
优点:
- 更好地利用信道的带宽;
- 减少目标端的中断次数;
- 减少单独发送确认帧带来效率的降低。
-
存在的问题即解决方法:如果一个站点在收到对方数据帧之后没有数据发送给对方,源站可能要超时;通过设置辅助计时器,在目标端收到数据时,启动辅助计时器,如果辅助计时器到时,没有反向数据传送,则单独发送确认短帧。
-
-
发送窗口:发送方需要维护一个发送窗口$W_T $ ,在未收到接收方确认分组的情况下,发送方可将序号落入 W T W_T WT内的所有数据分组连续发送出去。
-
接收窗口:接收方需要维护一个接收窗口 W R W_R WR ,只有正确到达接收方(无误码)且序号落入 W R W_R WR内的数据分组才被接收方接收。
-
分组编号:为了让双方能够判断所收到的数据分组是否是重复的,需要分别进行数据分组编号和确认分组编号,一般通过编号所使用的比特数量来计算序号数量,采用n个比特编号得到的序号有 2 n 2^n 2n个,确认分组编号所用比特数量一般与数据分组所用比特数量一样。
-
超时重传时间:给超时计时器设置的超时重传时间RTO应当仔细选择,一般将RTO设置为略大于收发双方的平均往返时间RTT。
停止-等待协议
- 发送窗口 W T W_T WT为1,接收窗口 W R W_R WR也为1;
- 发送方在发出一帧后,在发送下一帧之前要等待前一帧的确认;
- 分组编号只需使用1个比特编序号即可,即序号0和序号1。
- 属于自动请求重传(Automatic Repeat reQuest,ARQ)协议。即重传的请求是发送方自动进行的,而不是接收方请求发送方重传误码的分组。
- 存在的问题:效率低; 发送方一次只发送一个数据帧,直到接收方回复为止。
停止-等待协议的信道利用率
计算例题
主机甲采用停-等协议向主机乙发送数据,数据传输速率是3kbps,单向传播延时是200ms,忽略确认帧的传输延时。当信道利用率等于40%时,数据帧的长度为多少?
解:停止-等待协议传输过程中链路的示意图如下:
根据题目信息可得如下方程:
40
%
=
x
b
3
k
b
/
s
x
b
3
k
b
/
s
+
200
m
s
×
2
40\%=\frac{\frac{x\:b}{3k\:b/s}}{\frac{x\:b}{3k\:b/s}+200ms\times2}
40%=3kb/sxb+200ms×23kb/sxb
解得x=800b,即数据帧的长度为800比特。
从信道利用率分析停止-等待协议存在的问题
由上图可知,当RTT(双向传播时延)很长的时候,停止-等待协议的信道利用率U很低。
回退N帧协议
-
采用𝒏个比特给分组编序号,则发送窗口 W T W_T WT的取值范围是 1 < W T ≤ ( 2 n − 1 ) 1<W_T≤(2^n−1) 1<WT≤(2n−1)。接收窗口 W R W_R WR为1;
-
发送方:在发送完一个数据帧后,不是停下来等待应答帧,而是可以继续发送发送窗口中的数据帧。如果这时收到了接收端发来的确认帧,那么还可以接着发送数据帧,如果在超时时间到时,仍然没有收到相应帧的确认帧,则回退N帧(Go-back-N, GBN)重新从这个帧开始传起;
-
接收方:连续接收帧,当接收到一个坏帧时,简单丢弃这个帧和这个帧以后的所有帧,让它们在发送端超时,直到收到这个帧为止。
-
累计确认:回退N帧协议的接收方采用累积确认方式。接收方不必对收到的每一个数据分组都发送一个确认分组,而是可以在收到几个序号连续的数据分组后,对按序到达的最后一个数据分组发送确认分组。确认分组ACKn表明序号为n及之前的所有数据分组都已正确接收。
-
若 W T = 2 n W_T=2^n WT=2n时会发生什么(重点):
- 假设n = 3, 发送方发送了序号DATA0~DATA7,共 2 3 2^3 23个,所有序号都已使用,此时第二批次的第一个序号将从DATA0重新开始;
- 假设接收方全部接收到了且无误码,接收方返回ACK0~ACK7;
- 若返回的ACK0分组丢失,发送方收不到DATA0分组的确认分组发生超时,则从第一批次的第一个,序号同为DATA0的分组重新开始发送;
- 接收方第二次接收到DATA0分组,但无法区分这是第一批次的DATA0还是第二批次的DATA0,从而产生问题。
-
回退N帧协议在流水线传输的基础上,利用发送窗口来限制发送方连续发送数据分组的数量,是一种连续ARQ协议。
-
在信道质量较差(容易出现误码)的情况下,回退N帧协议的信道利用率并不比停止-等待协议的信道利用率高。
选择重传协议
-
采用𝒏个比特给分组编序号,发送窗口 W T W_T WT和接收窗口 W R W_R WR满足下列公式 1 < W R ≤ W T W T + W R ≤ 2 n } 1 < W R ≤ 2 ( n − 1 ) \left.\begin{array}{l}1<W_R \leq W_T \\ W_T+W_R \leq 2^n\end{array}\right\} 1<W_R \leq 2^{(n-1)} 1<WR≤WTWT+WR≤2n}1<WR≤2(n−1),当 W R W_R WR取最大值 2 ( n − 1 ) 2^{(n-1)} 2(n−1)时, w T w_T wT能取到的最大值也为 2 ( n − 1 ) 2^{(n-1)} 2(n−1);
-
只有按序收到对已发送数据分组的确认分组时,发送窗口才能向前滑动到相应位置;如果收到未按序到达的确认分组,应对其进行记录,以防止其相应数据分组的超时重发,但发送窗口不能向前滑动。
-
与回退N帧协议不同,为了使发送方仅重传出现差错的数据分组,选择重传协议不采用累积确认,接收方需要对每一个正确接收的数据分组进行逐一确认;只有在按序接收数据分组后,接收窗口才能向前滑动到相应位置。
考点
- 掌握三种滑动窗口协议的名称、发送和接收窗口大小
- 能在给定条件和窗口大小的情况下计算信道利用率等,或者反过来计算需要多少位比特来对窗口进行编号。