《深入浅出计算机网络》第三章 数据链路层
3.1 数据链路层概述
在讨论链路层传输过程时,不考虑解封问题,只看成水平层传输的过程。及局域网1中的主机 H1 经过路由器 R1,广域网,以及路由器 R2 连接到局域网2中的主机 H2。不同的数据链路层可能采取不同的数据链路层协议。
链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。
数据链路(Data Link)是基于链路的。当在一条链路上传送数据时,除需要链路本身,还需要一些必要的通信协议来控制这些数据的传输,把实现这些协议的硬件和软件加到链路上,就构成了数据链路。
计算机中的网络适配器(俗称网卡)和其相应的软件驱动程序就实现了这些协议。一般的网络适配器都包含了物理层和数据链路层这两层的功能。
帧(Frame)是数据链路层对等实体之间在水平方向进行逻辑通信的协议数据单元PDU。
3.2 数据链路层三个重要问题
3.2.1 封装成帧和透明传输
封装成帧是指数据链路层给上层交付下来的协议数据单元PDU添加一个首部和一个尾部,使之成为帧。
透明传输是指数据链路层对上层交付下来的协议数据单元PDU没有任何限制,就好像数据链路层不存在一样。
- 面向字节的物理链路使用字节填充的方法实现透明传输。
- 面向比特的物理链路使用比特填充的方法实现透明传输。
- 帧的首部和尾部中包含有一些重要的控制信息。
- 帧首部和尾部的作用之一就是帧定界。并不是每一种数据链路层协议的帧都包含有帧定界标志。
在传输过程中,如果帧定界和网络协议数据单元的数据发生重合,那还能鉴定出帧定界符么?
答案是否定的。解决这个问题时,可以在发送帧之前,对帧的数据部分进行扫描,每出现一个帧定界符,就在其前面插入一个转义字符。接收方数据链路层在物理层交付的比特流中提取帧,遇到第一个帧定界符时,认为这是帧的开始。当遇到转义字符时就知道,其后面的 1 字节内容虽然与帧定界符相同,但它是数据而不是定界符,剔除转义字符后,将其后面的内容作为数据继续提取。
要是在传输过程中遇到既包含帧定界符,又包含了转义字符,应该怎么处理?
方法依旧是对帧的数据部分进行扫描,每出现一个帧定界符或转义字符,就在其前面插入一个转义字符。转义字符是一个特殊的字符,其长度为1个字节,十进制为27,而并不是E、S、C这三个字符。
MAC 帧不需要帧尾,用的是帧间间隔。
3.2.2 差错检测
- 实际的通信链路都不是理想的,比特在传输过程中可能会产生差错(称为比特差错):比特1可能变成比特0,比特0可能变成比特1。
- 在一段时间内,传输错误的比特数量占所传输比特总数的比率称为误率(Bit Error Rate,BER)。
- 提高链路的信噪比,可以降低误码率。但在实际的通信链路上,不可能使误码率下降为零。
- 使用差错检测技术来检测数据在传输过程中是否产生了比特差错,是数据链路层所要解决的重要问题之一。
1. 奇偶校验
- 奇校验是在待发送的数据后面添加1个校验位,使得添加该校验位后的整个数据中比特1的个数为奇数。
- 偶校验是在待发送的数据后面添加1个校验位,使得添加该校验位后的整个数据中比特1的个数为偶数。
- 在所传输的数据中,若有奇数个位发生误码,则所包含比特1的数量的奇偶性会发生改变,可以检测出误码。
- 在所传输的数据中,若有偶数个位发生误码,则所包含比特1的数量的奇偶性不会发生改变,无法检测出误码(漏检)。
- 在实际使用时,奇偶校验又可分为垂直奇偶校验、水平奇偶校验以及水平垂直奇偶校验。
2. 循环冗余校验CRC
数据链路层广泛使用漏检率极低的循环冗余校验(Cyclic Redundancy Check,CRC)检错技术。
循环冗余校验CRC的基本思想:
- 收发双方约定好一个生成多项式G(X)。
- 发送方基于待发送的数据和生成多项式G(X),计算出差错检测码(冗余码),将冗余码添加到待发送数据的后面一起传输。
- 接收方收到数据和冗余码后,通过生成多项式G(X)来计算收到的数据和冗余码是否产生了误码。
3.2.3 可靠传输
1. 可靠传输的相关基本概念
使用差错检测技术(例如循环冗余校验CRC),接收方的数据链路层就可检测出帧在传输过程中是否产生了误码(比特差错)。
数据链路层向其上层提供的服务类型:
- 不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做;
- 可靠传输服务:通过某种机制实现发送方发送什么,接收方最终就能收到什么。
一般情况下,有线链路的误码率比较低。为了减小开销,并不要求数据链路层向其上层提供可靠传输服务。即使出现了误码,可靠传输的问题由其上层处理。
无线链路易受干扰,误码率比较高,因此要求数据链路层必须向其上层提供可靠传输服务。
- 可靠传输服务并不局限于数据链路层,其他各层均可选择实现可靠传输。
- 可靠传输的实现比较复杂,开销比较大,是否使用可靠传输取决于应用需求。
2. 停止-等待协议的实现原理
确认、否认和重传
超时重传
确认丢失
确认迟到
请注意该数据分组与之前序号为0的数据分组,不是同一个数据分组,我们用给确认分组编号的方法,解决了确认迟到所导致的重复确认的问题。需要说明的是对于数据链路层的点对点信道,往返时间比较固定,不会出现确认迟到的情况。因此如果只在数据链路层实现停止等待协议,可以不用给确认分组编号。
信道利用率
TD:发送方发送数据分组所耗费的发送时延
RTT:收发双方之间的往返时间
TA:接收方发送确认分组所耗费的发送时延
途中忽略了接收方对数据分组的处理时延,以及发送方对确认分组的处理时延
- 若出现超时重传,对于传送有用的数据信息来说,信道利用率还要降低。
- 在往返时间RTT相对较大的情况下,为了提高信道利用率,收发双方不适合采用停止-等待协议,而可以选择使用回退N帧(GBN)协议或选择重传(SR)协议。
3. 回退N帧协议
回退N帧协议采用流水线传输方式,并利用发送窗口来显示发送方连续发送数据分组的数据,这属于连续ARQ协议。
流水线传输
发送窗口
接收窗口
- 接收方每正确收到一个序号落入接收窗口的数据分组,就将接收窗口向前滑动一个位置,这样就有一个新的序号落入接收窗口。与此同时,接收方还要给发送方发送针对该数据分组的确认分组。
- 发送方每收到一个按序确认的确认分组,就将发送窗口向前滑动一个位置,这样就有一个新的序号落入发送窗口,序号落入发送窗口内的数据分组可继续被发送。
- 在回退N帧协议的工作过程中,发送方的发送窗口和接收方的接收窗口按上述规则不断向前滑动。因此,这类协议又称为滑动窗口协议。
回退N帧含义
若序号落入发送窗口内的已发送数据分组出现超时,则该数据分组及其后续已发送的数据分组被重传,这就是回退N帧名称的由来,即一旦出错就需要退回去重传已发送过的N个数据分组。
累计确认
- 回退N帧协议采用累计确认方式
- 接收方不必对收到的每一个数据分组都发送一个确认分组,而是可以在收到几个序号连续的数据分组后,对按序到达的最后一个数据分组发送确认分组。
- 接收方何时发送累积确认分组,由具体实现决定。
- 确认分组ACKn表名序号为n及之前的所有数据分组都已正确接收。
- 优缺点
- 优点:
- 减少向网络中注入确认分组的数量。
- 即使确认分组丢失,也可能不必重传数据分组。
- 缺点:
- 不能向发送方及时准确地放映出接收方已正确接受的所有数据分组的数量。
- 优点:
发送窗口的尺寸超越上限
将出现接收方无法分辨新旧数据分组的情况
信道利用率
-
无差错的情况
信道利用率比停止-等待协议高不少
-
有差错的情况
一个数据分组的差错就可能引起大量数据分组的重传,而这些重传的数据分组原本已经正确到达接收方,但由于序号未落入接收窗口内而被接收方丢弃。显然,这些数据分组的重传是对通信资源的严重浪费。
总结
4. 选择重传协议
为了进一步提高信道利用率,可以设法只穿出现差错的数据分组,这就需要接受窗口尺寸要大于1,以便先收下时序但正确到接收方且序号落入接收窗口内的数据分组,等到所缺数据分组收齐后再一并送交上层。