本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。
参考书籍
- 《Computer Networks (the fifth edition) 》
(注:由于我看的是英文教材,以下内容为个人理解和翻译的内容,如有不恰当之处,还望多多包涵和指出)
背景
信道经常会出现错误;传输速率有限;有非零的传播时延。
本章的目的就是学习一些协议,看他们是如何检测和纠正错误的。
数据链路层设计
作用
依托物理层收发比特。有以下作用:
- 为网络层提供定义好的服务接口。
- 处理传输错误
- 调节数据流量,使得不出现发送者拼命发送,但接收者完全跟不上的情况。
核心概念
数据链路层的核心概念是“帧”(frame),它将从网络层接收到的包(packet)封装成帧,如下图所示:
数据链路层向网络层提供的服务 概述
实际的数据传输是从上而下经过各个层次,但是为了简化讨论,就先虚拟抽象成数据在两个主机之间的网络层和数据链路层呈U型传递。
服务分为三类:
无应答无连接服务
如以太网
如因信道噪声导致帧丢失,没有办法侦测并重发。
适用于本身错误率低、或对实时性要求高的服务(如音频)。
前者的容错恢复可依赖于更高层;而后者是因为相对而言,迟到数据带来的恶劣影响比错误数据更甚。
有应答无连接服务
在数据链路层中,应答是一种优化而不是必须,因为在更高的层中已经保证了应答。
应答的作用体现在:比如当网络层发送一个很大的包,由于帧有最大长度限制,包会被切分成一个个更小的帧。如果没有应答,一旦中途出现错误,则待网络层监测到时,整个包都得重发;但如果在链路层可以知道,就可以只对丢失的帧部分进行重发。
应答且面向连接的服务
适用于卫星信道、长途电话电路等
它保证了:
- 每帧都被编号
- 每帧都确实被接收且仅被接收一次,并且是按顺序传输的
如果应答信号丢失,将导致同一帧被来回收发多次,浪费带宽。
服务分为三个阶段:
- 连接建立。两边初始化变量、计数器追踪要从哪一帧开始接收。
- 真正开始传输帧
- 连接释放。变量、缓冲区等其他资源也被释放。
成帧方法(识别帧头帧尾)
目标:在使用尽量少的信道带宽的前提下,让接收方能轻易识别每一帧的开头,并且如果出错也能识别(不会导致后面一连串全错)
有以下四种方法:
- 对字节计数(少用)
方法在于在帧头用一个位记录帧的大小。
但问题在于如果这个计数位本身就是错的呢?后续就都错了。
- 填充字节标志位(由于地区编码差异,少用)
这和PPP(point to point principle)原理很像
- 填充比特标志位(常用)
原理:遇到连续5个1就后补0,在信道上传输的数据是这种修改后的形式;接收端接收数据时,再按照遇5个1就砍掉0的方法整合
用于一度很火的HDLC(high level data link control)
- Physical layer coding violations
(感觉直译不太准确,就照搬原文了,用于物理层编码有冗余的情况)
- 总结:以太网和802.11都使用了这样的综合方案:帧头有一个可能很长的序(preamble),紧接着有个长度域。
关于差错控制和流控制的一些说明
差错控制和流控制并不是只在数据链路层有,因为这是个全局的概念;相反,他们在更高层中更为常见。
数据链路层在这方面仅仅是尽力而为,它们往往以最简单、最纯净的形式出现。
差错控制(保证帧以正确顺序传输)
- 接收端成功接收信息后向发送端提供正反馈;否则提供负反馈
- 为解决帧发送或者信息回传过程中丢失而导致错误的问题,引入了超时机制。超过一定时间没接收应答,说明有问题
- 然而,若频繁超时,频繁重传也会带来新问题。于是给每个帧的外部添加序列号,使得接收方可以识别被重传的帧。
流控制(解决发送的实时流量大于接收方所能承受的界限的问题)
- 基于接收方反馈的流控制(在链路层及以上很常见)
接收方对流量进行反馈,如允许发送方发送更大流量的数据
原则:在接收方发送同意请求之前,禁止发送方发送多余的帧
- 基于速率限制的流控制(只作为传输层的一部分)
系统对流量有个最大速率限制