精华内容
下载资源
问答
  • 数据链路层的主要功能

    万次阅读 多人点赞 2019-05-28 11:03:46
    数据链路层主要功能数据传输差错控制数据链路层的三个基本问题1.封装成帧2. 透明传输3. 差错检测 数据传输 透明传输其实就是指无论是什么报文都可以传输。在数据链路层将网络层协议封装成帧时,会在首部和尾部分别...

    主要功能概述

    数据链路层最基本的服务是将源计算机网络层来的数据可靠的传输到相邻节点的目标计算机的网络层。为达到这一目的,数据链路层必须具备一系列相应的功能,主要有:如何将数据组合成数据块(在数据链路层中将这种数据块称为帧,帧是数据链路层的传送单位);如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使之与接收方相匹配;在两个网路实体之间提供数据链路通路的建立、维持和释放管理。这些功能具体表现在以下几个方面。

    数据链路层的三个基本问题

    1. 封装成帧

    为了向网络层提供服务,数据链路层必须使用物理层提供的服务。而物理层我们知道,它是以比特流进行传输的,这种比特流并不保证在数据传输过程中没有错误,接收到的位数量可能少于、等于或者多于发送的位数量。而且它们还可能有不同的值,这时数据链路层为了能实现数据有效的差错控制,就采用了一种“帧”的数据块进行传输。而要采帧格式传输,就必须有相应的帧同步技术,这就是数据链路层的“成帧”(也称为“帧同步”)功能。

    • 封装成帧(framing):就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
    • 分组交换的一个重要概念:就是所有在因特网上传送的数据都是以分组(即IP数据报)为传送单位。
    • 网络层的IP数据报传送到数据链路层就成为帧的数据部分。在帧的数据部分的前面和后面分别添加上首部和尾部,就构成了一个完整的帧。
    • 帧长等于数据部分长度加上帧首部和帧尾部的长度,而首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。
    • 首部和尾部还包含许多必要的控制信息,在发送帧时,是从帧首部开始发送。
    • 各种数据链路层协议都要对帧首部和帧尾部的格式有明确的规定。
    • 为了提高帧的传输效率,应当使帧的数据部分长度尽可能大于首部和尾部的长度。但是,每一种链路层协议都规定了帧的数据部分的长度上限——最大传送单元MTU(Maximum Transfer Unit)。
      在这里插入图片描述
    • 当数据是由可打印的ASCII码组成的文本文件时,帧定界可以使用特殊的帧定界符。
    • 控制字符SOH(Start Of Header)放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT(End Of Transmission)表示帧的结束。他们的十六进制编码分别是01(二进制是00000001)和04(二进制是00000100)。
      在这里插入图片描述
    • 采用帧传输方式的好处是,在发现有数据传送错误时,只需将有差错的帧再次传送,而不需要将全部数据的比特流进行重传,这就在传送效率上将大大提高。但随后很快又恢复正常,于是重新从头开始发送刚才未发送完的帧。由于使用了帧定界符,在接收端就知道前面收到的数据时个不完整的帧(只有首部SOH,没有传输结束符EOT),必须丢弃。而后面收到的数据有明显的帧定界符(SOH和EOT),因此这是一个完整的帧,应当收下

    但同时也带来了两方面的问题:(1)如何识别帧的开始与结束;(2)在夹杂着重传的数据帧中,接收方在接收到重传的数据帧时是识别成新的数据帧,还是识别成已传帧的重传帧呢?这就要靠数据链路层的各种“帧同步”技术来识别了。“帧同步”技术既可使接收方能从以上并不是完全有序的比特流中准确地区分出每一帧的开始和结束,同时还可识别重传帧。

    2. 透明传输

    在上面提到了在数据链路层实现透明传输和封装成帧时,使用到了转义字符。在假设没有使用转义字符的前提下我们来分析一下存在的问题:

    • 由于帧的开始和结束的标记是使用专门指明的控制字符,因此,所传输的数据中的任何8比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。
    • 当传送的帧使用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像SOH或EOT这样的帧定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。

    问题:当数据部分是非ASCII码的文本文件时(如二进制代码的计算机程序或图像等),情况就不同了,如果数据中的某个字符的二进制代码恰好和SOH或EOT这种控制字符一样,数据链路层就会错误地找到帧的边界,把部分帧收下(误认为是完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符SOH)。这样的帧的传输显然就不是透明传输。

    在这里插入图片描述

    • 问题分析:为了解决透明传输的问题,就必须设法使数据中可能出现的控制字符“SOH”和“EOT”在接收端不被解析为控制字符
    • 解决方法:发送端的数据链路层在数据中出现控制字符”SOH”和”EOT”的前面插入一个转义字符”ESC”(其十六进制编码是1B)。而在接收端的数据链路层在将数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充(byte stuffing)或字符填充(character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个
      在这里插入图片描述

    3. 差错检测

    传输差错:可分为两大类,一类就是最基本的比特差错,另一类就是收到的帧并没有出现比特错误,但却出现了帧丢失帧重复帧失序

    • 比特差错:就是比特在传输过程中可能会产生差错,即1可能会变成0,0可能会变成1。比特差错是传输差错中的一种。
    • 三个帧:[#1]-[#2]-[#3],假定在接收端收到的却有可能出现的情况:
      (1)帧丢失:收到[#1]-[#3](丢失了[#2])。
      (2)帧重复:收到[#1]-[#2]-[#2]-[#3](收到两个[#2])。
      (3)帧失序:收到[#1]-[#3]-[#2](后面发的帧反而先到达了接收端,这与一般的数据链路层传输概念不一样)。
    • 误码率BER(Bit Error Rate):就是在一段时间内,传输错误的比特占所传输比特总数的比率。例如,误码率为10 ^ (-10)时,表示平均每传送10^10个比特就会出现一个比特的差错。误码率与信噪比有很大的关系,如果提高信噪比,就可以使误码率减小

    问题:实际的通信链路并非理想的,它不可能使误码率下降到零。
    问题分析:为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种检测措施。
    解决方法:目前在数据链路层广泛使用了循环冗余检验CRC(Cyclic Redundancy Check)的检测技术。
    注:在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输

    补充:
    OSI的观点是必须把数据链路层做成是可靠传输的。因此在CRC检测基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。
    这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。

    因特网广泛使用的数据链路层协议都不适用确认和重传机制,即不要求数据链路层向上层提供可靠传输的服务(因为这要付出的代价太高,不合算)。如果在数据链路层传输数据时除了差错并且需要进行改正,那么改正差错的任务就由上层协议(如,运输层TCP协议)来完成。实验证明,这样可以提高通信效率。

    MAC寻址

    这是数据链路层中的MAC子层主要功能。这里所说的“寻址”与“IP地址寻址”是完全不一样的,因为此处所寻找地址是计算机网卡的MAC地址,也称“物理地址”、“硬件地址”,而不是IP地址。在以太网中,采用媒体访问控制(Media Access Control, MAC)地址进行寻址,MAC地址被烧入每个以太网网卡中。这在多点连接的情况下非常必需,因为在这种多点连接的网络通信中,必须保证每一帧都能准确地送到正确的地址,接收方也应当知道发送方是哪一个站。

    链路层向网络层提供的服务

    数据链路层的设计目标就是为网络层提供各种需要的服务。实际的服务随系统的不同而不同,但是一般情况下,数据链路层会向网络层提供以下三种类型的服务:

    1. 无确认的无连接服务

    “无确认的无连接服务”是指源计算机向目标计算机发送独立的帧,目标计算机并不对这些帧进行确认。这种服务,事先无需建立逻辑连接,事后也不用解释逻辑连接。正因如此,如果由于线路上的原因造成某一帧的数据丢失,则数据链路层并不会检测到这样的丢失帧,也不会恢复这些帧。出现这种情况的后果是可想而知的,当然在错误率很低,或者对数据的完整性要求不高的情况下(如话音数据),这样的服务还是非常有用的,因为这样简单的错误可以交给OSI上面的各层来恢复。如大多数局域网在数据链路层所采用的服务也是无确认的无连接服务。

    2. 有确认的无连接服务

    为了解决以上“无确认的无连接服务”的不足,提高数据传输的可靠性,引入了“有确认的无连接服务”。在这种连接服务中,源主机数据链路层必须对每个发送的数据帧进行编号,目的主机数据链路层也必须对每个接收的数据帧进行确认。如果源主机数据链路层在规定的时间内未接收到所发送的数据帧的确认,那么它需要重发该帧。 这样发送方知道每一帧是否正确地到达对方。这类服务主要用于不可靠信道,如无线通信系统。它与下面将要介绍的“有确认的面向连接服务”的不同之处在于它不需要在帧传输之前建立数据链路,也不要在在帧传输结束后释放数据链路。

    3. 有确认的面向连接服务

    大多数数据链路层都采用向网络层提供面向连接确认服务。利用这种服务,源计算机和目标计算机在传输数据之前需要先建立一个连接,该连接上发送的每一帧也都被编号,数据链路层保证每一帧都会被接收到。而且它还保证每一帧只被按正常顺序接收一次。这也正是面向连接服务与前面介绍的“有确认无连接服务”的区别,在无连接有确认的服务中,在没有检测到确认时,系统会认为对方没收到,于是会重发数据,而由于是无连接的,所以这样的数据可能会复发多次,对方也可能接收多次,造成数据错误。这种服务类型存在3个阶段,即:数据链路建立、数据传输、数据链路释放阶段。每个被传输的帧都被编号,以确保帧传输的内容与顺序的正确性。大多数广域网的通信子网的数据链路层采用面向连接确认服务。

    以太网采用无连接的工作方式,读发送的数据帧不进行编号,也不要求对方发回确认。目的站收到有差错的帧就把他丢弃,不采取其他行为。

    其他知识点

    • 局域网的优点:具有广播功能,从一个站点可以很方便的访问全网;便于系统的扩展和逐渐演变;提高了系统的可靠性、可用性和生存性。
    • 以太网采用的协议是具有冲突检测的载波监听多点接入CMSA/CD。协议的要点是:发送前先监听,便发送边监听,一旦发现总线上出现了碰撞,就立即停止发送。然后按照退避算法等待一段随机时间后再次发送。因此,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。以太网上各站点都平等的争用以太网信道。
    展开全文
  • 流量控制(基于速率/基于反馈)-在数据链路层通常采取基于反馈的模式,即由接收方向发送方提供处理能力大小,发送方根据处理能力提供对应流量 帧 (数据链路层处理的协议数据单元PDU) 帧的组成:帧头+载荷+帧尾 ...

    原文链接

    数据链路层概述

    保证数据传输的有效,可靠性

    • 差错的检测和控制
    • 流量控制(基于速率/基于反馈)-在数据链路层通常采取基于反馈的模式,即由接收方向发送方提供处理能力大小,发送方根据处理能力提供对应流量

    (数据链路层处理的协议数据单元PDU)

    帧的组成:帧头+载荷+帧尾

    • 帧头:包含定位所需要的地址,物理地址信息
    • 载荷:上层网络层传递下来的包
    • 帧尾:校验和,做帧的校验

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r640jeyc-1586083911078)(http://47.97.124.78:8000/wp-content/uploads/2020/03/帧的组成.png)]

    数据链路层使用物理层提供的服务,所以要将物理层处理的位流(bits)转换成数据链路层能够处理的帧,这个过程就叫做“成帧”。

    成帧

    将原始的位流分散到离散的帧中

    常见的四种成帧方法

    1. 字符计数法
    2. 字节填充的标志字节法
    3. 比特填充的比特标记法
    4. 物理层编码违例法

    字符计数法

    发送方:

    在每个帧头部中的第一个字段,标识该帧的长度共有多少字符

    接收方:

    通过第一个字段,就知道这个帧有几个字符,在哪里结束该帧

    优点: 实现简单

    缺点: 没有考虑重新同步问题,一旦出错,无法恢复,工程中极少使用

    字节填充的标志字节法

    考虑了重新同步问题,每一帧采用一个特殊字节做帧界,即当前帧的开始与上一个帧的结束

    标记数据标记数据

    将这个特殊字节称为标志字节(flag byte)

    存在问题:当传输数据中也存在标志字节时,会和真正的帧界混淆

    解决方案:当数据中存在标记字节时,在标记前添加转义字符(这种方式解决了一部分问题,但同时也带来了一些特殊情况,当数据中包含转义字符时,又必须在转义字符前添加转义字符避免混淆)

    特殊情况下传输数据内容:

    ESCFLAGESCFLAGESCFLAG

    在成帧过程中就变成了

    ESCESCESCFLAGESCESCESCFLAGESCESCESCFLAG

    缺点: 1.数据中存在帧界或转义符时容易混淆,大量的标志字节或转义字符会造成低效率的成帧(最坏情况50%)。2. 不适用于任意比特数的帧,必须是8位整数倍

    比特填充的比特标记法

    这是一种面向二进制位的帧格式,把所有需传输的数据以比
    特位一字排开,并以特殊的位模式01111110作为帧标志,即
    一个帧的开始(同时标志前一个帧的结束)

    当帧内容出现与帧标志相同位串01111110时:

    在5个1后插入一个0,即变成01111101,接收方将自动删除第5 个1后的0。这称为位填充法(零比特填充法),也称为透明传输。

    当扫描过程中出现错误导致部分帧没有被正确接收:

    接收方会继续扫描直到读取到下一个帧标志,开始重写转换同步数据

    优点: 可以传输任意比特数的帧,同时传输效率更高

    物理层编码违例法

    将冗余信号用作帧界

    例如:在4B/5B编码模式中,将4比特映射到5比特上,能够承载32位却只利用了16位,剩下的位就可以用作帧界

    例如:在曼彻斯特编码中,只利用了高到低表示1,低到高表示0,却没有利用高到高,低到低两种情况

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ya43z6Cd-1586083911080)(http://47.97.124.78:8000/wp-content/uploads/2020/03/曼彻斯特编码.png)]

    优点: 由于利用的是冗余信号,不会混淆,传输效率较高


    差错处理的概述

    处理错误的常见手段

    1. 纠错:恢复出正确的数据
    2. 检错:仅仅检出错误,不恢复,通常伴随重传

    常见错误类型

    1. 单个错误:分散在各个数据块中
    2. 突发错误:集中于一个数据块,整个数据块都是错误

    纠错码(前向纠错技术)

    发现错误,从错误中恢复出正确的来。

    由于纠错码需要纠错,这个过程中需要太多的冗余位,所以开销较大。在有线网络中极少使用,主要应用于无线网络中

    检错码

    只能发现错误,不能从错误中恢复,但可采用重传恢复

    主要应用于局域网


    码字:包含数据位和校验位的n位单元(模式)

    海明距离:两个码字的海明距离指,两个码字间不同位的数目

    例如:“11010101”与“10000101”的海明距离就是2

    海明距离可以利用异或运算,其中1的个数表示海明距离

    全部码字的海明距离:

    指在全部码字中任意两个码字间海明距离的最小值

    海明距离的意义:

    如果海明距离为d,则一个码字要变成另一个码字,需要跳变d位(发生d个一位错误)才能实现。

    海明距离与“检错”的关系:

    海明距离为d+1的编码能检测出d位的差错

    奇偶校验码:

    海明距离为2,能检验出1位错误

    奇偶校验码就是将一个校验位追加到传输数据中,分为奇校验和偶校验,校验位的值是“0”还是“1”取决于数据中“1”的个数。

    例如:

    DATA:100011

    偶校验:100011 1

    奇校验:100011 0

    因为Data中含义3个1,偶校验就是加入校验码后1为偶数个,所以添加1。对应的奇校验则加入0

    奇偶校验检错举例:

    有一组传输数据只有四种格式“00”,“11”,“01”,“10” 。
    经过偶校验,编码后变为“000”,“110”,“011”,“101”

    此时发送方向接收方传输数据“101”.产生一个跳变成为“111”.

    显而易见“111”这个数据不在四种基本数据内,所以接收方可以成功检错

    如果这个过程中发生两次跳变,可能变为“011”.

    这个数据虽然变化了,但也出现在基本数据内,所以接收方无法成功检错,说明接收方无法通过奇偶校验处理两次及以上跳变

    海明距离与“纠错”关系

    海明距离为2d+1的编码,能够纠正d位及以内的差错

    纠错的原理在于,此时即使码字发生d次跳变,这个错误码字与原码字之间的距离仍然是最近的。所以接收方只需要找到与这个错误码字海明距离最接近的码字就能将错误纠正

    例如:一个系统有4个合法码字(0000000000, 0000011111, 1111100000 , 1111111111)

    海明距离是 5=2*2+1,所以可纠正2位错误.

    发送方:0000011111

    发生两次跳变后:0000000111

    接收方发现差错并且找到海明距离最近的码字进行替换。

    收方纠正后: 0000011111

    假如发生3次跳变(超出纠错范围):0000000011

    收方找到的海明距离最近码字是:0000000000

    可以看到无法再进行纠错

    显而易见,随着海明距离增大,纠错能力就不断增强

    但是,海明距离越大意味着合法码字越少,传输效率也就越低

    二者只能找到一种平衡,而不能同时保持高纠察率以及高传输效率吧


    纠1位错的海明码

    假设一个系统,经过编码后的码字位数是n位,则n位的组成应该为n=m+r 。其中m表示传输的数据位,r表示冗余位。

    在海明码中,将这些冗余位用作纠错位

    如何确定冗余位个数r:

    在数据传输过程中有m位数据位,所以合法码字有2^m个,而总位数为n,所以一共 有2^n个码字。任取一个合法码字,要保证其跳变一位后能够被纠错,或者说其跳变一位就变成错误码字,就需要至少n+1个码字来表示它。

    例如:总位数为5的 “10010” 是一个合法码字,为了保证其跳变一位后会变成错误码字,就要求 “10011”,“10000”,“10110”,“11010”,“00010”这五个与其海明距离为1的码字全部为错,也就是“10010”需要5+1个码字来表示。

    综上,则有以下条件成立:

    ( n + 1 ) 2 m < = 2 n (n+1)2^m <= 2^n (n+1)2m<=2n

    n = m + r n=m+r n=m+r

    推导出:

    ( m + r + 1 ) < = 2 r (m+r+1)<=2^r (m+r+1)<=2r

    利用上式容易得出,纠正单个错误需要的校验位的下界满足:

    mrn
    123
    2~435~7
    5~1149~15
    12~26517~31
    27~57633~63

    海明纠错码

    1. 将每一个码字从左到右编号,最左边为第一位
    2. 规定凡编号为2的次幂的位是校验位,如1位,2位,4位,8位,16位…
    3. 其余各位均是数据位,如3,5,6,7,9…
    4. 每一个校验位的设置规则:包括自己在内的一些位的集合的奇偶值(奇偶校验)

    如何决定每个数据位的校验位:

    将某一位数据位的编号展开成2的次幂的和(例如11可以写作:1+2+8),那么每一项所对应的位即为该数据位的校验位(供接收方使用)

    如:一个系统中,码字的数据位是7位,根据上文公式求得冗余位是4位,所以码字位数一共11位,其中1,2,4,8位属于校验位(下图P表示校验位,D表示数据位)

    1234567891011
    P1P2D1P3D2D3D4P4D5D6D7
    1=2^0YYYYYY
    2=2^1YYYYYY
    4=2^2YYYY
    8=2^3YYYY

    上述图表中描述了我们在第四条中所说的每一个校验位所在的集合,例如第三行表示了1这个校验位的值由1,3,5,7,9,11这些位的值结合奇偶校验决定

    1234567891011
    P1P2D1P3D2D3D4P4D5D6D7
    信息码--1-001-000
    检验位00-1---0---
    海明码00110010000

    (上图采用了偶校验)


    海明码纠错过程

    1. 首先将差错计数器置0
    2. 当海明码数据到达接收端后,接收端逐个检查各个校验位的奇偶性。
    3. 如发现某一校验位和它所检测的集合的奇偶性不正确,就将该检验位的编号加到差错计数器中。
    4. Counter=0,无差错。Counter ≠0,出错,该值指明出错的位

    比如:

    接收到码字为00111000100,校验各校验位:(采用偶校验)

    第一位:00111000100,校验集合有3个1,错。counter+1

    第二位:00111000100,校验集合有1个1,错。counter+2

    第四位:00111000100,校验集合有2个1,对

    第八位:00111000100,校验集合有1个1,错。counter+8

    累加出错位编号:1+2+8=11

    可计算得其第11位出错,将该位由0改为1,即纠正得到正确结果: 00111000101


    利用海明码纠正突发错误

    突发错误虽然是整个数据块的错误,但可以利用海明码巧妙的逐个纠正

    1. 将连续的k个码字按行排列成矩阵
    2. 发送数据时,按列发送,每列k位
    3. 如果一个突发性错误长度是k位,则在k个码字中,至多只有一位受到影响,正好可用海明码纠错改位后恢复

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n800U5UW-1586083911081)(http://47.97.124.78:8000/wp-content/uploads/2020/03/海明码纠错.jpg)]


    检错码

    采用检错码的原因:

    纠错码占用太多冗余位,信道利用率不高

    在局域网中,主要使用的是检错码

    常见的检错码:

    • 奇偶校验码(海明距离为2,检一位错)
    • 互联网校验和
    • 循环冗余校验码

    奇偶校验码:

    奇偶位取值等同于对数据位进行模2和运算

    例如,采用偶校验: 1110000 -> 11100001

    接收方能够检查出是否存在单个比特的错误(或者奇数个)

    出错误的概率在50%(奇数跳变成功检验,偶数则不能)

    校验和

    校验和通常是按照N位码字来进行模2加/和运算,发送方将运算结果附加在数据报文尾部 ,作为校验位。

    例如:16位的互联网补码校验和

    特点:

    • 比奇偶检验更好的检错性能
    • 能检出高至N位的突发错误
    • 检错随机错误率1-2^N
    • 易受系统错误干扰,比如,增加的“0”

    互联网校验和计算文档:RFC1071(computing the internet checksum)

    (1)待校验的相邻字节成对组成16比特的整数一行,按列
    从低位开始计算其模2和;并将结果按位取反码,作为校验
    和取值。

    (2)检查校验和时,将所有字节,包括校验和,进行相加
    并求二进制反码。接收方:如果结果为全1 ,无错误

    注意:如果某列的模2和有溢出,向高位进位,如果高位产
    生进位,循环向低位进位。

    循环冗余检错码CRC

    任何一个k位的帧都可以看成一个k-1次的多项式

    例如:1011001 可以看成-> x 6 + x 4 + x 3 + x 0 x^6+x^4+x^3+x^0 x6+x4+x3+x0(k项k-1阶多项式)

    CRC系统里一定具有生成多项式:G(x),G(x)为r(冗余码个数)阶

    还具有m位帧的多项式:M(x),且一般 m>r , M(x)>G(x)

    接下来:

    x r M ( x ) G ( x ) = Q ( x ) + R ( x ) \frac{x^rM(x)}{G(x)}=Q(x)+R(x) G(x)xrM(x)=Q(x)+R(x)

    Q(x)表示商,R(x)表示余数

    易知:

    x r M ( x ) − R ( x ) G ( x ) = Q ( x ) \frac{x^rM(x)-R(x)}{G(x)}=Q(x) G(x)xrM(x)R(x)=Q(x)

    说明 x r M ( x ) − R ( x ) x^rM(x)-R(x) xrM(x)R(x)一定能被G(x)整除,所以将它作为转码后的数据传送给接收方

    接收方在收到后,将其与约定好的生成多项式G(x)相除:

    • 若为0,说明传输过程中没有发生错误
    • 若不为0,说明传输过程发生错误

    在二进制运算中,减法和加法都做异或运算,即相同得0,相异得1

    例如:11010+10100=01110,11001-10010=01011

    模2运算:模2加以及模2减等同于异或运算,即相同得0,相异得1

    0⊕0=0; 0⊕1=1;
    1⊕0=1; 1⊕1=0.


    CRC码计算:

    发送方

    传输的一帧:1101011011(m=10)

    易知: M ( x ) = x 9 + x 8 + x 6 + x 4 + z 3 + x + 1 M(x)=x^9+x^8+x^6+x^4+z^3+x+1 M(x)=x9+x8+x6+x4+z3+x+1

    规定:收发双方采用统一的 G ( x ) = x 4 + x + 1 G(x)=x^4+x+1 G(x)=x4+x+1

    计算得: T ( x ) = x 4 M ( x ) = x 4 ( x 9 + x 8 + x 6 + x 4 + z 3 + x + 1 ) = x 13 + x 12 + x 10 + x 8 + z 7 + x 5 + x 4 T(x)=x^4M(x)=x^4(x^9+x^8+x^6+x^4+z^3+x+1)=x^{13}+x^{12}+x^{10}+x^8+z^7+x^5+x^4 T(x)=x4M(x)=x4(x9+x8+x6+x4+z3+x+1)=x13+x12+x10+x8+z7+x5+x4 。(相当于在原码字后边加r个0)

    开始计算:(采用模2除法,用G(x)去除 X r M ( x ) X^rM(x) XrM(x),得余数)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pebCa1Qt-1586083911081)(http://47.97.124.78:8000/wp-content/uploads/2020/03/运算.png)]

    计算11010110110000/10011 得余数1110 ,采用模2减法,用XrM(x)减去余数,得到带CRC校验和的帧,11010110110000-1110=11010110111110,所以:

    最终得到发送给接收方的数据= 1101011011(帧数据)1110(余数)

    接收方

    接收方在得到传输过来的码字后,会利用规定的G(x)与之相除,能够整除则认为传输正确

    如果不能被整除,则检测为传输出错


    生成多项式国际标准

    CRC-12 :$x^{12} +x^{11} + x^3 + x^2 + x^1 + 1 $。用于字符长度为6位

    CRC-16 :$x^{16} + x^{15}+ x^2+ 1 $用于字符长度为8位

    CRC-CCITT : x 16 + x 12 + x 5 + 1 x^{16} + x^{12}+ x^5+ 1 x16+x12+x5+1。 用于字符长度为8

    CRC32 : G ( x ) = x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 3 + x + 1 G(x)=x^{32}+x^{26}+x^{23}+x^{22}+x^{16}+x^{12}+x^{11}+x^{10}+x^8+x^7+x^5+x^4+x^3+x+1 G(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x3+x+1

    CRC32广泛应用于以太网计算循环冗余校验时用

    例题:如果生成多项式是 G(x)= x^3 + x^2 + 1,待传送的原始码字分别是1111 和 1100,请计算采用CRC编码后的码字分别是多少?

    解题:生成多项式是3阶的,所以r=3,生成多项式对应的位(除数)是:1101

    待传输的1111,移位后变为:1111000(被除数),得到余数111

    用1111000-111,得到编码后的码字为:1111111


    三个单工协议-基本数据链路层协议

    单工:数据的传输在某时是单向的

    • 无限制的单工协议
    • 单工停-等协议
    • 有噪声信道的弹弓协议

    理想条件下假设:

    • 物理层,数据链路层和网络层是各自独立运行的进程(在工程中可能有各自不同的存在形式)
    • 机器A希望向B发送的是一个可靠的面向连接的长数据流
    • 假设机器不会崩溃,即使崩溃,我们不会处理因崩溃产生的错误
    • 从网络层拿到的数据是纯数据

    几个协议共用的数据类型,调用函数

    protocol.h文件

    #define MAX_PKT 1024                    /* packet size in bytes */
    
    typedef enum { false, true } boolean;   /* boolean type */
    typedef unsigned int seq_nr;            /* sequence or ACK numbers  序列号或确认号*/
    
    typedef struct {
        unsigned char data[MAX_PKT];
    } packet;                               /* 从网络层传输来的包/分组 */
    typedef enum { data, ack, nak } frame_kind; /* frame kind definition ack表示确认字符,nak表示否定应答或者非应答 */
    
    
    typedef struct {
        frame_kind kind;                    /* what kind of frame? 帧的类型 */
        seq_nr seq;                         /* sequence number 序列号*/
        seq_nr ack;                         /* ACK number 确认号/确认字符*/
        packet info;                        /* the Network layer packet 包/分组(来自网络层)直接作为帧的载荷定义在帧的结构中*/
    } frame;   //定义帧结构
    
    typedef enum {
    	frame_arrival,  //帧到达
    	cksum_err,   //检错码错误
    	timeout,   //时间超出
    	network_layer_ready,   //网络层完成准备(可以发送下一条数据)
    	ack_timeout  //延时确认计时器时间超出
    } event_type;  //定义事件类型
    
    
    /* wait for an event to happen; return its type of event */
    /*等待事件发生,并返回事件类型:即上文事件类型类中的内容*/
    void wait_for_event(event_type* event);
    
    /* fetch a packet from the network layer for transmission 从网络层获取数据*/
    void from_network_layer(packet* p);
    
    /* deliver information from an inbound frame to the network layer 向网络层发送数据*/
    void to_network_layer(packet* p);
    
    /* get an inbound frame from the physical layer 从物理层获取数据*/
    void from_physical_layer(frame* r);
    
    /* pass the frame to the physical layer 向物理层发送数据*/
    void to_physical_layer(frame* s);
    
    /* start the clock and enable the timeout event 重传定时器启动*/
    void start_timer(seq_nr k);
    
    /* stop the clock and disable the timeout event 重传定时器关闭*/
    void stop_timer(seq_nr k);
    
    /* start an auxiliary timer and enable the ack_timeout event 捎带确认定时器启动*/
    void start_ack_timer(seq_nr k);
    
    /* stop an auxiliary timer and disable the ack_timeout event 稍待确认定时器关闭*/
    void stop_ack_timer(seq_nr k);
    
    /* allow the network to cause a network_layer_ready event */
    void enable_network_layer(void);
    
    /* forbid the network to cause a network_layer_ready event */
    void disable_network_layer(void);
    
    /* macro inc */
    #define inc(k) if (k < MAX_SEQ) k = k + 1; else k = 0
    

    其中定义了很重要的帧结构,以及事件类型,基本操作等等…


    无限制的单工协议-协议1

    这种协议设定了很多理想条件,在现实中很难满足,所以被称为“乌托邦协议”

    理想条件:

    • 收发双方的网络层都处于就绪状态(随时待命)
    • 处理时间忽略不计(瞬间完成)
    • 可用的缓存空间无穷大(无限空间)
    • 假设DLL之间的信道永远不会损坏或者丢失帧(完美通道)

    代码实现:

    typedef enum { frame_arrival } event_type;
    #include "protocol.h"
    
    //封装发送过程
    void sender1(void)
    {
    	frame s; /*buffer for an outbound frame 为帧准备内存空间*/
    	packet buffer; /*buffer for an outbound packet*/
    	while (true) {
    		from_network_layer(&buffer); /*go get something to send 从网络层获取数据存入缓存 */
    		s.info = buffer; /*copy it into s for transmission 将数据写入帧的载荷*/
    		to_physical_layer(&s); /*send it on its way 将帧传递给物理层处理*/
    	}
    }
    
    //解封装发送过程
    void receiver1(void)
    {
    	frame r;
    	event_type event; /*filled in by wait, but not used here*/
    	while (true) {
    		wait_for_event(&event); /*only possibility is frame arrival 等待数据到达事件*/
    		from_physical_layer(&r); /*go get the inbound frame 接收来自物理层的数据并进行成帧*/
    		to_network_layer(&r.info); /*pass the data to the network layer 将数据中的包向上传递到网络层*/
    	}
    }
    

    单工停-等协议 协议2

    无限制的单工协议条件过于完美,现实中要想实现就需要不断解除这些完美条件。

    单工停-等协议首先取消了可用缓存空间无限大这一理想条件

    也因此,需要解决接收方有可能被发送方传输的大量数据淹没这一问题

    解决方法:

    接收方在每次接收到数据后,会向发送方返回一个哑帧,表示自己已经正常接收到数据,并且可以继续接收数据。发送方在收到返回的哑帧后,才会继续传输下一个数据。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6isDOE9a-1586083911082)(http://47.97.124.78:8000/wp-content/uploads/2020/03/停等协议.png)]

    代码实现:

    
    
    typedef enum { frame_arrival } event_type;
    #include "protocol.h"
    void sender2(void)
    {
    	frame s; /*buffer for an outbound frame*/
    	packet buffer; /*buffer for an outbound packet*/
    	event_type event; /*frame arrival is the only possibility */
    	while (true) {
    		from_network_layer(&buffer); /*go get something to send */
    		s.info = buffer; /*copy it into s for transmission*/
    		to_physical_layer(&s); /*bye - bye little frame */
    
    		/*
    		 *这里体现了与第一种协议的区别,
    		 *在发送一条数据后不会立即循环发送下一条
    		 *而是等待返回的哑帧再进一步操作
    		 */
    		wait_for_event(&event); /*do not proceed until given the go ahead*/
    	}
    }
    void receiver2(void)
    {
    	frame r, s; /*buffers for frames*/
    	event_type event; /*frame arrival is the only possibility */
    	while (true) {
    		wait_for_event(&event); /*only possibility is frame arrival */
    		from_physical_layer(&r); /*go get the inbound frame */
    		to_network_layer(&r.info); /*pass the data to the network layer */
    		/*
    		 *与第一种协议不同之处
    		 *收到信息并传到网络层后,没有立即进入接收状态
    		 *而是返回一段哑帧
    		 */
    		to_physical_layer(&s); /*send a dummy frame to awaken sender */
    	}
    }
    

    有噪声信道的单工协议-协议3

    有噪声的单工信道协议在前文基础上,取消了帧不会损坏或丢失这一理想条件

    认为信道中含有噪声,有噪声就会引发错误

    进而考虑如何处理以下衍生问题并解决

    发现错误后如何通知发送方,如何修正错误,恢复正确帧:(PAR肯定确认重传协议/ARQ自动重传请求)

    在接收方对数据进行检验并且检验正确后,会向发送方返回一个确认帧,发送方在收到确认帧后继续传输数据。

    发送方在数据发送的同时启动重传定时器(防止锁死),超过定时器规定时间还未收到确认帧(发送过程失败或者返回确认帧过程失败,或者检验错误),发送方就会重置计时器,并且重传原数据。

    在传输过程中,每个帧都具有自己独一无二的编码,防止数据帧成功到达接收方并且检验合格但返回确认帧失败的问题,同时方便重排

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HPq3IYbX-1586083911083)(http://47.97.124.78:8000/wp-content/uploads/2020/03/ARQ.png)]

    代码实现:

    typedef enum { frame_arrival } event_type;
    #include "protocol.h"
    void sender3(void)
    {
    	seq_nr next_frame_to_send; /*seq number of next outgoing frame 出站序列号-用于区别各个帧 */
    	frame s; /*scratch variable */
    	packet buffer; /*buffer for an outbound packet*/
    	event_type event;
    	next_frame_to_send = 0; /*initialize outbound sequence numbers 初始化出站序列号 */
    	from_network_layer(&buffer); /*fetch first packet 获取第一个数据包*/
    	while (true) {
    		s.info = buffer; /*construct a frame for transmission 将包放入帧的载荷*/
    		s.seq = next_frame_to_send; /*insert sequence number in frame */
    		to_physical_layer(&s); /*send it on its way 向物理层传输 */
    		start_timer(s.seq);  /*if answer takes too long, time out 开启重传计时器*/
    		wait_for_event(&event); /*frame arrival, cksum err, timeout 等待确认帧返回*/
    		if (event == frame_arrival) {  //判断是否返回确认帧
    			from_physical_layer(&s); /*get the acknowledgement 获取物理层回传的数据*/
    			if (s.ack == next_frame_to_send) {   //获得收方确认则执行以下操作
    				stop_timer(s.ack); /*turn the timer off 重置重传计时器*/
    				from_network_layer(&buffer); /*get the next one to send 从网络层获取下一个传输数据*/
    				inc(next_frame_to_send); /*invert next frame to send 转化序列号*/
    			}
    		}
    	}
    	//如果这个过程中没有收到返回的确认帧,或确认帧表明传输错误
    	//则通过while循环进行重传
    }
    void receiver3(void)
    {
    	seq_nr frame_expected;
    	frame r, s;
    	event_type event;
    	frame_expected = 0;
    	while (true) {
    		wait_for_event(&event); /*possibilities: frame arrival, cksum err*/
    		if (event == frame_arrival) {
    			/*a valid frame has arrived */
    			from_physical_layer(&r); /*go get the newly arrived frame */
    			if (r.seq == frame_expected) {  //获得正确传输的数据
    				/*this is what we have been waiting for*/
    				to_network_layer(&r.info); /*pass the data to the network layer 将数据向网络层传输*/
    				inc(frame_expected); /*next time expect the other sequence nr 下一阶段期待的序列号*/
    			}
    			s.ack = 1 - frame_expected; /*tell which frame is being acked 告知发送方需要传输的数据*/
    			to_physical_layer(&s); /*send acknowledgement 返回确认帧*/
    		}
    	}
    }
    

    提高传输效率的协议实现方式:

    全双工:

    在信道传输的过程中,不再是单向的数据流动,而是除去了常见的收发双方概念,两方同时进行接受与发送数据的工作,提高数据传输的效率

    捎带确认:

    接收方在发送确认帧时,不再新建一个帧,而实挂靠到一个将要前往发送方的数据帧末尾。提高了信道利用率,但要注意,有时收发双方数量是不对等的,也就是我们不一定能等到可以挂靠的数据帧,所以我们要建立一个稍待确认计时器,超时之后直接发送确认帧

    批发数据(管道化技术):

    在等待第一帧的确认帧返回时,不停止数据发送,而是持续发送数据,等第一帧的确认帧返回,再确定是否继续进行发送过程


    滑动窗口协议-协议4

    上文所提到的三种协议都是单工或半双工协议,在等待确认帧返回的空闲时间里不进行任何操作,所以信道的利用率非常低。协议4-6区别于前文三种协议,采用以下几种手段提高信道利用率

    全双工模式

    即在通讯过程中允许双方同时相互传输数据,整个过程模糊了收发双方的概念,因为双方都在同时进行收和发的操作

    管道化技术(批量发送)

    在等待上一帧的确认帧返回时,不是单纯等待,而是继续发送帧。它可以一次性发送多条数据,我们将这些数据的组合称为一个窗口,管道化技术就是在逐个发送窗口。所以我们也称其为滑窗技术

    滑动窗口

    整个过程中双方都对应拥有两个窗口:

    1. 发送窗口:对应着已经发送,未被确认的数据帧的序列号
    2. 期望接收的数据帧的序列号

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1RsM0F3m-1586083911084)(http://47.97.124.78:8000/wp-content/uploads/2020/03/滑动窗口.jpg)]

    可以看到整个滑动窗口的流程是首先从接收一方开始,接收方首先将窗口设置在0位置,表示期望接收到0序列号的帧,接下来发送方开始滑动窗口到0,并向接收方发送0数据帧,在接收方收到第一帧后,接收方返回确认帧并且滑动窗口到1位置表示期望收到1数据帧,发送方在接到确认帧后继续滑动窗口并发送对应帧

    协议代码实现

    #define MAX_SEQ 1			
    #include"protocol.h"
    
    void protocol4(void)
    {
    	seq_nr next_frame_to_send;  //将要发送的帧的序列号
    	seq_nr frame_expected;   //期望收到的帧的序列号
    	frame r, s;  
    	packet buffer;
    	event_type event;
    	next_frame_to_send = 0;  //初始化将要发送的帧的序列号,从0号帧开始发送
    	frame_expected = 0;   //表明期望接受到的帧是0号帧
    	from_network_layer(&buffer);   //从网络曾获取包
    	s.info = buffer;  //放入要发送的帧中
    	s.seq = next_frame_to_send;
    	s.ack = 1 - frame_expected;
    	/*
    	 *由于是双工协议,所以采用了稍待确认
    	 *也就是将确认帧放到数据帧中,提高了信道利用率
    	 */
    	to_physical_layer(&s);  //像物理层开始传输
    	start_timer(s.seq);  //启动计时器
    	while (true) {
    			wait_for_event(&event);  //接收对应事件
    			if (event == frame_arrival) {
    				from_physical_layer(&r);  //从物理层获取返回的确认帧+数据帧 
    				//通过帧的seq号判断是否是期望接受的帧
    				if (r.seq == frame_expected) {  
    					to_network_layer(&r.info); //如果是就将数据继续向网络层传输
    					inc(frame_expected);  
    					//这里调用了一个宏用来移动窗口
    					//这个宏的作用就是将期望的数据帧序列号+1,将期望窗口调整到下一位置
    				}
    				//通过帧的ack号与发送出的帧序列号比较,判断数据是否成功到达接收方
    				//以及是否继续发送下一帧或者重传
    				if (r.ack == next_frame_to_send) {
    					stop_timer(r.ack);
    					from_network_layer(&buffer);
    					inc(next_frame_to_send);
    				}
    			}
    			s.info = buffer;
    			s.seq = next_frame_to_send;
    			s.ack = 1 - frame_expected;
    			to_physical_layer(&s);
    			start_timer(s.seq);
    		}
    }
    

    窗口滑动条件

    接收方收到帧后,首先核对帧是否与期望相同,如果相同,则返回确认帧并且滑动接收窗口(frame_expected+1)然后将数据像网络层传输

    发送方在收到确认帧后,核对响应帧号next_frame_to_send,全部完成后,从网络层获取新的数据,并将响应帧号next_frame_to_send+1即移动发送窗口,然后像物理层传输信息,否则,不移动窗口

    滑动窗口基本概念

    每个待发送帧被赋予一个序列号seq,seq的取值范围是 0 ~ 2^n-1(n位字段)

    发送窗口

    • 顺序接收来自网络层的分组->成帧->赋予序列号
    • 最多保存W个已经发送、等待确认的帧
    • 窗口达到最大值W时强制关闭网络层

    接收窗口

    • 对进入窗口的帧顺序提交网络层,产生确认
    • 落在窗口外的帧被丢弃

    SEQ码和ACK码

    因为滑动窗口协议只涉及1个窗口,所以在传输过程中,SEQ码和ACK码的取值只有0和1两种,当SEQ码=1时,表示当前发送的数据为1序列号的帧,当ACK码为1时,表示已经成功接收序列号为1的帧,期望接收序列号为0的帧(这里与直观感受并不一致)

    通信双方初始值:seq =0, ack=1(期待接收seq=0)

    窗口滑动机制

    • A首先发送数据帧(seq=0, ack=1, A0)–发送0帧,期望收到0帧
    • B收到A0,发送捎带确认帧(seq=0, ack=0, B0)–发送0帧,成功收到0帧,期望收到1帧
    • A收到对A0的确认,滑动窗口,发送帧(seq=1, ack=0, A1)–发送1帧,收到0帧,期望收到1帧

    协议帧的差错控制

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2eyjMJu7-1586083911084)(http://47.97.124.78:8000/wp-content/uploads/2020/03/传输过程.png)]

    可以看到在发生错误后,由于计时器时间设置不合理,接收方收到重复帧,这种情况下接收方会发送同样的确认帧返回发送方,但不会接收当前传过来的重复帧,这就使得整个流程可以正常运行,不会因为错误帧而中断。但整个流程效率极低


    效率问题

    假设窗口每次只发送一帧,那么可以通过运算获得整个过程的信道利用率:

    信道传输速率是: b (bps)
    
    每帧的大小是: k (bits)
    
    来回时间是: R (sec)
    
    信道利用率=\frac{k}{k+bR}
    

    带入数据:信道容量 b = 50 kbps,传输延迟 R = 500 ms(双程),数据帧的长度 k = 1000 bit。(设接收方收到数据帧后马上回送确认短帧,没有延时)

    可以算的信道利用率为3.85%,不足4%,利用率极低。这是因为我们一个窗口只发送了一帧,这一帧到达之前,窗口始终处于空闲状态,所以需要设定窗口合理的帧数,使利用率提高(增加滑动窗口长度)

    设窗口长度为W(一个窗口发送字节的数量)

    在源端发送数据帧过程需要的时间=T_f =\frac{k}{b}
    
    从发送完毕到确认帧返回需要的时间(双程延迟)R
    
    从开始发送到确认返回总共需要的时间(T_f +R)
    
    线路的利用率=\frac{W*T_f}{T_f +R}
    

    上文实例中若假设信道利用率为100%,可以解得W=26,也就是一个窗口发送26帧时,信道利用率最高。当然,这只是理想状态下的假设,正常情况下一般无法达到信道100%的利用

    如何确定合适的W值

    信道上的容量:一帧从发送方传输到接收期间可容纳的帧数量

    带宽-延迟积:BD(B表示带宽,D表示时间)

    窗口值:w=2*BD+1

    实际上:w≤2*BD+1


    例题:

    主机甲和主机乙之间使用后退N帧协议(GBN)传输数据,甲的发送窗口尺寸为1000,数据帧长为1000字节,信道为100Mbps,乙每收到一个数据帧立即利用一个短帧(忽略其传输延迟)进行确认。若甲乙之间的单向传播延迟是50ms,则甲可以达到的最大平均传输速率约为?

    解题:

    假设平均传输效率为x(Mbps)

    根据w=2*BD+1

    易知: 1000 = 2 ∗ x ( M b p s ) ∗ 50 ( m s ) ∗ 1 0 − 3 + 1 1000=2*x(Mbps)*50(ms)*10^{-3}+1 1000=2x(Mbps)50(ms)103+1

    解得:x=80Mbps


    管道化技术面临的出错情况

    • 连续发送W个数据帧,其中有一帧出错,但其后续帧被成功
      发送

    接收方的接收策略选择

    • 丢弃错帧及后续帧,其后续帧因不是期望接收帧也被丢弃,对应协议5
    • 丢弃错帧,缓存后续正确接收帧,对应协议6

    回退n帧-协议5

    上文提到了使用管道化技术带来的新问题与两种解决方式

    1. 回退n帧
    2. 选择性重传

    这两种协议对应着不同的接收发送策略

    回退n帧

    接收方的接收策略与选择:

    直接将错误帧与后续帧丢弃,后续的正确帧到来后因不是期望帧也被舍弃

    发送方的发送策略:

    发送前将所有帧缓存,在收到确认帧后,未为成功发送的帧以及后续所有帧进行重传

    选择性重传

    接收方的接收策略与选择:

    丢弃错误帧,将剩余正确帧保留并缓存

    发送方的发送策略:

    在收到确认帧后只重传错误帧


    回退n帧

    基本概念

    • 定义了序列号seq,以及滑动窗口长度W
    • 发送方持续发送数据,直到达到最大窗口长度
    • 接收窗口为1,在接到错误帧后不确认(引发超时,进而重传)
    • 发送方超时后进行重传,从未收到的确认帧处开始

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oRW9PRW-1586083911085)(http://47.97.124.78:8000/wp-content/uploads/2020/03/回退n帧.jpg)]

    可以看到在发送过程中,从2号帧开始出错,则后续帧都被丢弃。之后接收方会返回1号帧的确认帧(注意!不是返回2号帧,而是返回错误帧的上一位帧的确认帧,因为1号帧成功被接收,发送方借此可以判断是从2号帧开始需要重传的)

    在这里插入图片描述

    累计确认

    在滑动窗口中采用了累计确认的方式来对帧进行确认

    也就是说在收到对于5号帧确认时,暗含的意思就是已经完成了对0,1,2,3,4,5这几个帧的确认,而不必要每一个都发送确认帧

    对于发送方,这样在接收到第n帧确认后,就可以删除n帧及以前所有的缓存

    但这同样也引发了新的问题(规定):

    滑动窗口最大长度W不能超过最大序列号
    比如:序列号用三位表示,则最大序列号=111。表示7,所以窗口长度不能等于8或超过8,超过8很好理解,因为如果窗口长度大于8,则,没有足够的序列号为每一个帧标记。

    当序列号等于8时,有足够标记(0,1,2,3,4,5,6,7)但这也是不允许的,因为这会引发新的问题。

    我们在返回确认帧时采取了累计确认,当第一个窗口的8个帧全部被顺利接收后,接收方会返回一个确认帧ACK=7,表示已经正常收到7号帧及之前元素,可以继续发送下一窗口了。

    这时如果发送方在发送第二个窗口时发生错误,接收方根本没收到期望帧,就会重新发送确认帧ACK=7表示自己期望接受第二个窗口,可这时就会发生混淆,发送方不能分别这个确认帧,是希望对窗口二进行重传还是表示已经正常接收到窗口二。 无法正确执行程序

    如果滑动窗口不超过8就不会有这种问题,比如滑动窗口为7,这样第一窗口的确认帧是ACK=6,第二窗口的确认帧是ACK=5(因为第二窗口帧的序列号是从7开始的:7,0,1,2,3,4,5)

    这样就避免了过程中可能产生的歧义,很好的解决了问题

    回退n帧需要发送方付出更大的缓存代价,缓存整个窗口的数据帧

    适合出错较少的高速信道


    选择性重传-协议6

    基本概念

    • 接收窗口接收错误帧后的所有正确帧,并将它们缓存起来
    • 发送方只重传错误帧
    • 接收方在接收到重传帧后,将其与其他帧按正确顺序排序,再提交至网络层

    选择重传协议的工作原理分析

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CbxpKp2C-1586083911086)(http://47.97.124.78:8000/wp-content/uploads/2020/03/接收方发送方2.png)]

    否定确认NAK

    • 在接收方收到错误帧时会发送否定确认NAK到发送方
    • 这样可以加快出错帧的重传
    • 对出错帧回送否定确认,使发方不再等到超时再重传

    滑动窗口长度选择

    接收窗口:W= (MAX_SEQ + 1) / 2

    发送窗口一般小于接收窗口

    原因:

    当发送窗口和接收窗口都比较大时,就会导致新老窗口序列号重叠,比如说序列号为3位(XXX),收发窗口大小都是7,则接收窗口第一次为(0,1,2,3,4,5,6),第二次为(7,0,1,2,3,4,5)。这其中(0,1,2,3,4,5)都为重叠部分。

    当接收方正确接收第一窗口并滑动窗口后,确认帧被发送出去,但在确认帧发送过程中,全部丢失。所以发送方超时进行重发(0,1,2,3,4,5,6)这个窗口,当0号帧到达时

    接收方不能判定他是重传帧,反而在第二个窗口发现了对应帧的序列号,这个重传帧就被错误的放在了第二个窗口,而实际上,它只是第一个窗口的重传帧而已


    当W遵守W= (MAX_SEQ + 1) / 2 的规定时,就可以保证新老窗口之间没有重叠部分。,可以正常通过帧的序列号判定帧的类型

    协议4:滑动窗口协议5:回退n帧协议6:选择性重传
    发送窗口(SWnd)0<SWnd<=10 <=SWnd<=MAX_SEQ0 <= SWnd<= RWnd
    接收窗口(RWnd)11(MAX_SEQ+1)/2

    两种策略比较

    回退n帧

    • 发送方需要较大的缓冲区,以便重传
    • 重传帧数多,适于信道出错率较少的情况

    选择重传

    • 接收方需要较大的缓冲区,以便按正确顺序将分组提交网络层
    • 重传帧数少,适于信道质量不好的情况
    展开全文
  • 一 HDLC概述 1.1 HDLC的发展历史 高级数据链路控制(High-Level Data Link Control或简称HDLC),是一个在同步网上传输数据、面向...1974年,IBM公司率先提出了面向比特的同步数据链路控制规程SDLC(Synchronous Data

    一 HDLC概述

    1.1 HDLC的发展历史

    高级数据链路控制(High-Level Data Link Control或简称HDLC),是一个在同步网上传输数据、面向比特的数据链路层协议,它是由国际标准化组织(ISO)根据IBM公司的SDLC(SynchronousData Link Control)协议扩展开发而成的.其最大特点是不需要数据必须是规定字符集,对任何一种比特流,均可以实现透明的传输。1974年,IBM公司率先提出了面向比特的同步数据链路控制规程SDLC(Synchronous Data Link Control)。

    随后,ANSI和ISO均采纳并发展了SDLC,并分别提出了自己的标准:

    1* ANSI的高级通信控制过程ADCCP(Advanced DataControl Procedure),

    2* ISO的高级数据链路控制规程HDLC(High-level Data LinkContl)。

    从此,HDLC协议开始得到了人们的广泛关注,并开始应用于通信领域的各个方面。

    1.2 HDLC的特点

    HDLC是面向比特的数据链路控制协议的典型代表,有着很大的优势:

    1*  HDLC协议不依赖于任何一种字符编码集;

    2* 数据报文可透明传输,用于实现透明传输的“0比特插入法”易于硬件实现;

    3*全双工通信,有较高的数据链路传输效率;

    4*所有帧采用CRC检验,对信息帧进行顺序编号,可防止漏收或重份,传输可靠性高;

    5*传输控制功能与处理功能分离,具有较大灵活性。

    由于以上特点,目前网络设计及整机内部通讯设计普遍使用HDLC数据链路控制协议。HDLC已经成为通信领域额不可缺少的一个重要协议。

    二 数据链路层的控制规程

    2.1数据链路结构

     

    数据链路结构可以分为两种:点-点链路和点-多点链路。

     

    在点-点链路中,发送信息和命令的站称为主站,接收信息和命令而发出确认信息或响应的站称为从站,兼有主、从功能可发送命令与响应的站称为复合站。在点-多点链路中,往往有一个站为控制站,主管数据链路的信息流,并处理链路上出现的不可恢复的差错情况,其余各站则为受控站。

    2.2 数据链路控制规程功能

    数据链路层是OSI参考模型的第二层,它在物理层提供的通信接口与电路连接服务的基础上,将易出错的数据电路构筑成相对无差错的数据链路,以确保DTE与DTE之间、DTE与网络之间有效、可靠地传送数据信息。为了实现这个目标,数据链路控制规程的功能应包括以下几个部分:

    1*帧控制

    数据链路上传输的基本单位是帧。帧控制功能要求发送站把网络送来的数据信息分成若干码组,在每个码组中加入地址字段、控制字段、校验字段以及帧开始和结束标志,组成帧来发送;要求接收端从收到的帧中去掉标志字段,还原成原始数据信息后送到网络层。

    2*帧同步

    在传输过程中必须实现帧同步,以保证对帧中各个字段的正确识别。

    3*差错控制

    当数据信息在物理链路中传输出现差错,数据链路控制规程要求接收端能检测出差错并予以恢复,通常采用的方法有自动请求重发ARQ和前向纠错两种。采用ARQ方法时,为了防止帧的重收和漏收,常对帧采用编号发送和接收。当检测出无法恢复的差错时,应通知网络层做相应处理。

    4*流量控制

    流量控制用于克服链路的拥塞。它能对链路上信息流量进行调节,确保发送端发送的数据速率与接收端能够接收的数据速率相容。常用的流量控制方法是滑动窗口控制法。

    5*链路管理

    数据链路的建立、维持和终止,控制信息的传输方向,显示站的工作状态,这些都属于链路管理的范畴。

    6*透明传输

    规程中采用的标志和一些字段必须独立于要传输的信息,这就意味着数据链路能够传输各种各样的数据信息,即传输的透明性。

    7*寻址

    在多点链路中,帧必须能到达正确的接收站。

    8*异常状态恢复

     当链路发生异常情况时,如收到含义不清的序列或超时收不到响应等,能自动重新启动,恢复到正常工作状态。

    2.3 数据链路层协议

    数据链路控制规程,根据帧控制的格式,可以分为面向字符型、面向比特型。

    1*面向字符型

    国际标准化组织制定的ISO 1745、IBM公司的二进制同步规程BSC以及我国国家标准GB3543-82属于面向字符型的规程,也称为基本型传输控制规程。在这类规程中,用字符编码集中的几个特定字符来控制链路的操作,监视链路的工作状态,例如,采用国际5号码中的SOH、STX作为帧的开始,ETX、ETB作为的结束,ENQ、EOT、ACK、NAK等字符控制链路操作。面向字符型规程有一个很大的缺点,就是它与所用的字符集有密切的关系,使用不同字符集的两个站之间,很难使用该规程进行通信。面向字符型规程主要适用于中低速异步或同步传输,很适合于通过电话网的数据通信。

    2*面向比特型

    ITU-T制定的X.25建议的LAPB、ISO制定的HDLC、美国国家标准ADCCP、IBM公司的SDLC等均属于面向比特型的规程。在这类规程中,采用特定的二进制序列01111110作为帧的开始和结束,以一定的比特组合所表示的命令和响应实现链路的监控功能,命令和响应可以和信息一起传送。所以它可以实现不编码限制的、高可靠和高效率的透明传输。面向比特型规程主要适用于中高速同步半双工和全双工数据通信,如分组交换方式中的链路层就采用这种规程。随着通信的发展,它的应用日益广泛。

    三HDLC协议

    3.1 HDLC的基本概念

    3.1.1主站、从站、复合站

    HDLC涉及三种类型的站,即主站、从站和复合站。

    1*主站的主要功能是发送命令(包括数据信息)帧、接收响应帧,并负责对整个链路的控制系统的初启、流程的控制、差错检测或恢复等。

    2*从站的主要功能是接收由主站发来的命令帧,向主站发送响应帧,并且配合主站参与差错恢复等链路控制。

    3*复合站的主要功能是既能发送,又能接收命令帧和响应帧,并且负责整个链路的控制。

    3.1.2 HDLC链路结构

    在HDLC中,对主站、从站和复合站定义了三种链路结构。

     

    3.2HDLC协议的主要内容

    3.2.1 HDLC帧结构

    HDLC的帧格式如图3所示,它由六个字段组成,这六个字段可以分为五中类型,即标志序列(F)、地址字段(A)、控制字段(C)、信息字段(I)、帧校验字段(FCS)。在帧结构中允许不包含信息字段I。

    1*标志序列(F)

    HDLC指定采用01111110为标志序列,称为F标志。要求所有的帧必须以F标志开始和结束。接收设备不断地搜寻F标志,以实现帧同步,从而保证接收部分对后续字段的正确识别。另外,在帧与帧的空载期间,可以连续发送F,用来作时间填充。

    在一串数据比特中,有可能产生与标志字段的码型相同的比特组合。为了防止这种情况产生,保证对数据的透明传输,采取了比特填充技术。当采用比特填充技术时,在信码中连续5个“1”以后插入一个“0”;而在接收端,则去除5个“1”以后的“0”,恢复原来的数据序列,如图4所示。比特填充技术的采用排除了在信息流中出现的标志字段的可能性,保证了对数据信息的透明传输。

     

    数据中某一段比特组合恰好      0 0 1 0 0 11 1 1 1 1 0 0 0 1 0 1 0

             出现和F字段一样的情况             会误认为是F字段

     

            发送端在5个连1之后          0 0 1 0 0 1 1 1 1 1 0 10 0 0 1 0 1 0

              填入0比特再发送出去                         填入0比特

     

    在接收端将5个连1之后        00 1 0 0 11 1 1 1 1 0 0 0 1 0 1 0

    图4 比特填充

    当连续传输两帧时,前一个帧的结束标志字段F可以兼作后一个帧的起始标志字段。当暂时没有信息传送时,可以连续发送标志字段,使接收端可以一直保持与发送端同步。

    2*地址字段(A)

    地址字段表示链路上站的地址。在使用不平衡方式传送数据时(采用NRM和ARM),地址字段总是写入从站的地址;在使用平衡方式时(采用ABM),地址字段总是写入应答站的地址。

    地址字段的长度一般为8bit,最多可以表示256个站的地址。在许多系统中规定,地址字段为“11111111”时,定义为全站地址,即通知所有的接收站接收有关的命令帧并按其动作;全“0”比特为无站地址,用于测试数据链路的状态。因此有效地址共有254个之多,这对一般的多点链路是足够的。但考虑在某些情况下,例如使用分组无线网,用户可能很多,可使用扩充地址字段,以字节为单位扩充。在扩充时,每个地址字段的第1位用作扩充指示,即当第1位为“0”时,后续字节为扩充地址字段;当第1位为“1”时,后续字节不是扩充地址字段,地址字段到此为止。

    3*控制字段(C)

    控制字段用来表示帧类型、帧编号以及命令、响应等。从图5-11可见,由于C字段的构成不同,可以把HDLC帧分为三种类型:信息帧、监控帧、无编号帧,分别简称I帧(Information)、S帧(Supervisory)、U帧(Unnumbered)。在控制字段中,第1位是“0”为I帧,第1、2位是“10”为S帧,第1、2位是“11”为U帧,它们具体操作复杂,在后面予以介绍。另外控制字段也允许扩展。

    4*信息字段(I)

    信息字段内包含了用户的数据信息和来自上层的各种控制信息。在I帧和某些U帧中,具有该字段,它可以是任意长度的比特序列。在实际应用中,其长度由收发站的缓冲器的大小和线路的差错情况决定,但必须是8bit的整数倍。

    5*帧校验序列字段(FCS)

    帧校验序列用于对帧进行循环冗余校验,其校验范围从地址字段的第1比特到信息字段的最后一比特的序列,并且规定为了透明传输而插入的“0”不在校验范围内。

    3.2.2 HDLC的帧类型

      1*信息帧(I帧)

      信息帧用于传送有效信息或数据,通常简称I帧。I帧以控制字第一位为“0”来标志。

      信息帧的控制字段中的N(S)用于存放发送帧序号,以使发送方不必等待确认而连续发送多帧。N(R)用于存放接收方下一个预期要接收的帧的序号,N(R)=5,即表示接收方下一帧要接收5号帧,换言之,5号帧前的各帧接收到。N(S)和N(R)均为3位二进制编码,可取值0~7。

      2*监控帧(S帧)

    监控帧用于监视和控制数据链路,完成信息帧的接收确认、重发请求、暂停发送

    求等功能。监控帧不具有信息字段。监控帧共有4种,表1是这4种监控帧的代码、名称和功能。

    表1监控帧的名称和功能

     

    记忆符

     

    名  称

    比特

     

    功        能

    b2

    b3

    RR

    接收准备好

    0

    0

    确认,且准备接受下一帧,已收妥N(R)以前的各帧

    RNR

    接收未准备好

    1

    0

    确认,暂停接收下一帧,N(R)含义同上

    REJ

    拒绝接收

    0

    1

    否认,否认N(R)起的各帧,但N(R)以前的帧已收妥

    SREJ

    选择拒绝接收

    1

    1

    否认,只否认序号为N(R)的帧

     

      可以看出,接收就绪RR型S帧和接收未就绪RNR型S帧有两个主要功能:首先,这两种类型的S帧用来表示从站已准备好或未准备好接收信息;其次,确认编号小于N(R)的所有接收到的I帧。拒绝REJ和选择拒绝SREJ型S帧,用于向对方站指出发生了差错。REJ帧用于GO-back-N策略,用以请求重发N(R)以前的帧已被确认,当收到一个N(S)等于REJ型S帧的N(R)的I帧后,REJ状态即可清除。SREJ帧用于选择重发策略,当收到一个N(S)等SREJ帧的N(R)的I帧时,SREJ状态即应消除。

    3*无编号帧(U帧)

    无编号帧用于数据链路的控制,它本身不带编号,可以在任何需要的时刻发出,

    不影响带编号的信息帧的交换顺序。它可以分为命令帧和响应帧。用5个比特位(即M1、M2)来表示不同功能的无编号帧。HDLC所定义的无编号帧名称和代码见表2。

    表2无编号帧的名称和代码

    记忆符

    名   称

    类型

    M1

    M2

    命令

    响应

    b3  b4

    b6  b7  b8

    SNRM

    置正常响应模式

    C

     

    0  0

    0  0  1

    SARM/DM

    置异步响应模式/断开方式

    C

    R

    1  1

    0  0  0

    SABM

    置异步平衡模式

    C

     

    1  1

    1  0  0

    SNRME

    置扩充正常响应模式

    C

     

    1  1

    0  1  1

    SARME

    置扩充异步响应模式

    C

     

    1  1

    0  1  0

    SABME

    置扩充异步平衡模式

    C

     

    1  1

    1  1  0

    DISC/RD

    断链/请求断链

    C

    R

    0  0

    0  1  0

    SIM/RIM

    置初始化方式/请求初始化方式

    C

     

    1  0

    0  0  0

    UP

    无编号探询

    C

     

    0  0

    1  0  0

    UI

    无编号信息

    C

     

    0  0

    0  0  0

    XID

    交换识别

    C

    R

    1  1

    1  0  1

    RESET

    复位

    C

     

    1  1

    0  0  1

    FRMR

    帧拒绝

     

    R

    1  0

    0  0  1

    UA

    无编号确认

     

    R

    0  0

    1  1  0

     

     

     

     

    3.2.3 HDLC的操作方式

    HDLC是通用的数据链路控制协议,当开始建立数据链路时,允许选用特定的操作方式。所谓链路操作方式,通俗地讲就是以主节点方式操作,还是以从节点方式操作,或者是二者兼备。

    在链路上用于控制目的的节点称为主节点,其他的受主节点控制的节点称为从节点。主节点负责对数据流进行组织,并且对数据上的差错实施恢复。由主节点发往从节点的帧称为命令帧,而由从节点返回主节点的帧称为响应帧。连有多个节点的链路通常使用轮询技术,轮询其他节点的节点为主节点,而在点到点链路中每个节点均可为主节点。在一个节点点连接多条链路的情况下,该节点对于一些链路而言可能是主节点,而对另外一些链路而言有可能是从节点。

    HDLC中常用的操作方式有3种:

    1*正常响应方式 NRM

    正常响应方式NRM(Normal Response Mode)一种非平衡数据链路操作方式,有时也称为非平衡正常响应方式。该操作方式使用于面向终端的点到点或一点到多点的链路。在这种操作方式下,传输过程由主节点启动,从节点只有收到主节点某个命令帧后,才能作为响应向主节点传输信息。响应信息可以由一个或多个帧组成,若信息由多个帧组成,则应指出哪一帧是最后一帧。主节点负责管理整个链路,且具有轮询、选择从节点及及向从节点发送命令的权利,同时也负责对超时、重发及各类恢复操作的控制。

    2*异步响应方式 ARM

    异步响应方式ARM(Asynchronous Response Mode)也是一种非平衡数据链路操作方式,与NRM不同的是,ARM下的传输过程由从节点启动。从节点主动发送给主节点的一个或一组帧中可包含有信息,

    也可以是仅以控制为目的而发的帧。在这种操作方式下,由从节点来控制超时和重发。该方式对采用轮询方式的多节点点链路来说是比不可少的。

    3*异步平衡方式 ABM

    异步平衡方式ABM(Asynchronous Balanced Mode)是一种允许任何节点来启动传输的操作方式。为了提高链路传输效率,节点之间在两个方向上都需要有较高的信息传输量。在这种操作方式下,任何时候任何节点都能启动传输操作,每个节点点即可以作为主节点又可以作为从节点,即每个节点都是组合节点。各个节点都有相同的一组协议,任何节点都可以发送或接受命令,也可以给出应答,并且各节点对差错恢复过程都负有相同的责任。

    整个数据通信一般分为3个阶段:数据链路建立阶段、信息帧传送阶段、数据链路释放阶段。第2阶段的完成需要用到信息帧和监控帧,第1、3阶段的完成需要用到无编号帧。

    图5画出了多点链路的建立和释放。主站A先向从站B发出置正常响应模式SNRM的命令,并将P置1,要求B站作出响应。B站同意建立链路后,发送无编号确认UA的响应,将F置1。A站和B站在将其状态变量V(S)和V(R)进行初始化后,就完成了数据链路的建立。接着A站开始与C站建立链路。

     

           图5 多点链路的建立和释放

    当数据传送完毕后,A站分别向B站和C站发出断链命令DISC,B站、C站用无编号确认帧UA响应,数据链路就释放了。

    图6为点对点链路中两个站都是复合站的情况。复合站中的一个站先发出置异步平衡模式SABM的命令,对方回答一个无编号响应帧UA后,即完成了数据链路的建立。由于两个站是平等的,任何一个站均可在数据传送完毕后发出DISC命令提出断链的要求,对方用UA帧响应,完成数据链路的释放。

     

     

     

    3.3 HDLC规程的特点

    与面向字符的基本型传输控制规程相比较,HDLC具有以下特点:

    1*透明传输

    HDLC对任意比特组合的数据均能透明传输。“透明”是一个很重要的术语,它表示:某一个实际存在的事物看起来好象不存在一样。“透明传输”表示经实际电路传送后的数据信息没有发生变化。因此对所传送数据信息来说,由于这个电路并没有对其产生什么影响,可以说数据信息“看不见”这个电路,或者说这个电路对该数据信息来说是透明的。这样任意组合的数据信息都可以在这个电路上传送。

    2*可靠性高

    在HDLC规程中,差错控制的范围是除了F标志的整个帧,而基本型传输控制规程中不包括前缀和部分控制字符。另外HDLC对I帧进行编号传输,有效地防止了帧的重收和漏收。

    3*传输效率高

    在HDLC中,额外的开销比特少,允许高效的差错控制和流量控制。

    4*适应性强

    HDLC规程能适应各种比特类型的工作站和链路。

    5*结构灵活

    在HDLC中,传输控制功能和处理功能分离,层次清楚,应用非常灵活。

    3.4 HDLC存在的问题

    3.4.1"0"位插入/删除技术

    如上所述,SDLC/HDLC协议规定以01111110为标志字节,但在信息场中也完全有可能

    有同一种模式的字符,为了把它与标志区分开来,所以采取了"0"位插入和删除技术。具体作法是发送端在发送所有信息(除标志字节外)时,只要遇到连续5个"1",就自动插入一个"0"当接收端在接收数据时(除标志字节)如果连续接收到5个"1",就自动将其后的一个"0"删除,以恢复信息的原有形式。这种"0"位的插入和删除过程是由硬件自动完成的,比上述面向字符的"数据透明"容易实现。

    3.4.2 SDLC/HDLC异常结束

    若在发送过程中出现错误,则SDLC/HDLC协议用异常结束(Abort)字符,或

    称失效序列使本帧作废。在HDLC规程中7个连续的"1"被作为失效字符,而在SDLC中失效字符是8个连续的"1"。当然在失效序列中不使用"0"位插入/删除技术。

    四 HDLC协议的应用与发展前景

    4.1 HDLC的应用特点

    1*应用场合

    就系统结构而言,HDLC适用于点到点或点到多点式的结构;就工作方式而言,HDLCHDLC适用于半双工或全双工;就传输方式而言,HDLC只用于同步传输;在传输速率方面考虑,HDLC常用于中高速传输。

    2*传输效率

    HDLC开始发送一帧后,就要连续不断地发完该帧;HDLCHDLC可以同时确认几个帧;HDLC中的每个帧含有地址字段A,在多点结构中,每个从节点只接收含有本节点地址的帧,因此主节点在选中一个从节点并与之通讯的同时,不用拆链,便可以选择其他的节点通讯,即可以同时与多个节点建立链路。

    由于以上特点,HDLC具有较高的传输效率。

    3*传输可靠性

    HDLC中所有的帧(包括响应帧)都有FCS,I帧按窗口序号顺序编号,传输可靠性比异步通讯高。

    4*数据透明性

    HDLC采用“0比特插入法”对数据进行透明传输,传输信息的比特组合模式无任何限制,处理简单。

    5*信息传输格式

    HDLC采用统一的帧格式来实现数据、命令、响应的传输,实现起来方便。

    6*链路控制

    HDLC利用改变一帧中的控制字段的编码格式来完成各种规定的链路操作功能,提供的是面向比特的传输功能。

    4.2 HDLC协议的发展前景

    HDLC作为面向比特的数据链路控制协议的典型代表,具有如下特点:协议不依赖于任何一种字符编码集;数据报文可透明传输,用于实现透明传输的“0比特插入法”易于硬件实现;全双工通信,不必等待确认便可连续发送数据,有较高的数据链路传输效率;所有帧均采用CRC校验,对信息帧进行编号,可防止漏收或重份,传输可靠性高;传输控制功能与处理功能分离,具有较大灵活性和较完善的控制功能。由于以上的优点,HDLC协议发展和普及的非常快,目前网络设计普遍使用HDLC作为数据链路层协议,HDLC协议的发展前景也被业内人士看好。

    五 结论

    本文通过对数据链路层的HDLC协议进行综述介绍,主要内容包括对HDLC的发展数据链路控制协议,HDLC协议的主要内容、存在的技术标准以及HDLC的应用和发展前景等进行了研究。HDLC作为面向比特的数据链路控制协议的典型代表,有着很大的优势: HDLC协议不依赖于任何一种字符编码集;并且数据报文可透明传输,用于实现透明传输的“0比特插入法”也易于硬件实现;另外它采用的是全双工通信,有较高的数据链路传输效率;它的所有帧采用CRC检验,对信息帧进行顺序编号,可防止漏收或重份,传输可靠性比较高;最后其传输控制功能与处理功能分离,具有较大灵活性。

    由于以上特点,HDLC的应用得很广泛。目前网络设计普遍使用HDLC作为数据链路层协议。所以说HDLC已经成为通信领域额非常重要的一个协议。

    展开全文
  • 数据链路层在网络层提供服务的基础上向网络层提供服务,其主要作用是在加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无错差的数据链路,使之对网络层表现为一条无差错的链路。...

    目录

    1、为网络层提供服务

    1.1、无确认的无连接服务

    1.2、有确认的无连接服务

    1.3、有确认的面向连接服务

    2、链路管理

    3、帧定界、帧同步与透明传输

    4、流量控制


    数据链路层在网络层提供服务的基础上向网络层提供服务,其主要作用是在加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无错差的数据链路,使之对网络层表现为一条无差错的链路。

    1、为网络层提供服务

    对网络层而言,数据链路层的基本任务是将源机器中来自网络层的数据传输到目标机器的网络层。数据链路层通常可为网络层提供如下服务:

    1.1、无确认的无连接服务

    源机器发送数据帧时不需要先建立链路连接,目的机器收到数据帧时不需要发挥确定。对丢失的帧,数据链路层不负责重发而交给上层处理。适用于实时通信或误码率较低的通信信道,比如以太网。

    1.2、有确认的无连接服务

    源机器发送数据帧时不需要先建立链路连接,但目的机器收到帧时必须发回确认。源机器在所规定的时间内未收到确定信号时,就重传丢失的帧,以提高传输的可靠性。该服务适用于误码率较高的通信信道,如无线通信。

    1.3、有确认的面向连接服务

    帧传输过程分为三个阶段:减六数据链路、传输帧、释放数据链路。目的机器对收到的每一帧都要给出确认,源机器收到确认后才能发送下一帧,因而该服务的可靠性最高。该服务适用于通信要求(可靠性、实时性)较高的场合。

    注: 有连接一定要有确认,即不存在无确认的面向连接服务

    2、链路管理

    数据链路层连接的建立、维持和释放过程称为链路管理,它主要用于面向连接的服务。链路两端的结点要进行通信,必须首先确认对方已处于就绪状态,并交换一些必要的信息对帧序号初始化,然后才能建立连接,在传输过程中则要能维持连接,而在传输完毕后要释放该连接。

    在多个站点共享同一物理信道的情况下(例如在局域网中)如何在要求通信的站点间分配和管理信道也属于数据链路层管理的范畴。

    3、帧定界、帧同步与透明传输

    两个工作站之间传输信息时,必须将网络层的分组封装成帧,以帧的格式进行传送。将一段数据的前后分别添加首部和尾部,就构成了帧。首部和尾部含有很多控制信息,他们的一个重要作用是确定帧的界限,即帧定界。而帧同步指的是接收方应能从接收到的二进制比特流中区分出帧的起始和中止。

    如在HDLC通信规程中,用表示位F(01111110)来标识帧的开始和结束。通信过程中,检测到帧标识位F即认为是帧的开始,然后一旦检测到帧标识位F即表示帧的结束。HDLC标准帧格式如图16.1所示

                                      图16.1、HDLC标准帧格式

    如果在数据中恰好出现于帧定界符相同的比特组合(会误认为”传输结束“而丢弃后面的数据),那么就要采取有效的措施解决这个问题,即透明传输。更确切地说,透明传输就是不管所传数据是什么样的比特组合,都应当能在链路上传送。

    4、流量控制

    由于收发双方各自的工作速率和缓存空间的差异,可能出现发送方的发送能力大于接收方的接收能力的现象,如果不适当限制发送方的发送速率(即链路上的信息流量),前面来不及接收到额帧会被后面不断发送来的帧“淹没”,造成帧丢失而出错。因此,流量控制实际上就是限制发送方对的数据流量,使其发送速率不超过接收方的接收能力。

    这个过程需要某种反馈机制使发送方能够知道接收方是否能跟上自己,即需要有一些规则使得发送方知道在什么情况下可以接着发送下一帧,而在什么情况下必须暂停发送,以等待收到反馈信息后继续发送

    流量控制并不是数据链路层特有的功能,许多高层协议中也提供此功能,只不过控制的对象不同而已。对数据链路层而言,控制的是相邻结点之间数据链路上的流量,而对运输层而言,控制的则是源端到目的端之间的流量

                                                     图16.2  数据链路层的流量控制

     

     

    人,总是要有一点精神的,不是吗

     

     

     

     

     

     

     

    展开全文
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    Spring Boot Spring Cloud 服务注册发现 服务配置 负载均衡 服务调用 服务限流 熔断降级 网关路由 服务权限 链路追踪 分布式事务 分布式缓存 分布式会话 日志收集 服务监控 消息驱动 数据处理流 自动化测试与部署 第...
  • 面向比特的链路控制规程HDLC(High-level Data Link Control):广域网上用得最多的链路层协议 特征: 1.面向连接,不支持身份鉴别 2.协议不依赖于任何一种字符编码集; 3.数据报文可透明传输,用于实现透明传输的...
  • 数据链路层的功能

    千次阅读 2017-03-22 09:47:00
    数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。...
  • 1、 早期关系型数据库之间的数据同步 1)、全量同步 比如从oracle数据库中同步一张表的数据到Mysql中,通常的做法就是 分页查询源端的表,然后通过 jdbc的batch 方式插入到目标表,这个地方需要注意的是,分页...
  • 目前,将JESD204B作为高速数据转换器首选数字接口的趋势如火如荼。JESD204接口于2006年首次发布,2008年改版为JESD204A,2011年8月再改版为目前的JESD204B。与LVDS等以前的技术相比,该接口在效率上技高一筹,同时...
  • LLC 逻辑链路控制

    千次阅读 2016-09-26 13:04:00
    它是在面向连接的数据链路上提供数据传输服务的,因此它必须提供建立、使用、终止以及复位数据链路层连接所需的操作手段,并且还要提供数据链路层的定序、流控和错误恢复等功能。这是一种虚电路服务。  LLC协议...
  • 用户行为数据链路解析

    千次阅读 2020-10-30 21:36:23
    数据上报、落表、分析全流程解读
  • 蓝牙基带与链路控制器协议

    千次阅读 2018-07-04 21:52:39
    接收数据时,射频将数据经过解调恢复空中数据上传给基带,基带再对数据进行信道解码,向高层传输。 信道分组编码遵循小端格式。 蓝牙设备地址可以分为三个部分:LAP地位地址(24位)、UAP高位地址(8位)和NAP无效...
  • 大数据开发平台-数据同步服务

    万次阅读 2017-09-21 13:38:35
    同步一切
  • 数据链路层的主要功能与服务

    千次阅读 2014-06-29 21:46:39
    为达到这一目的,数据链路层必须具备一系列相应的功能,主要有:如何将数据组合成数据块(在数据链路层中将这种数据块称为帧,帧是数据链路层的传送单位);如何控制帧在物理信道上的传输,包括如何处理传输差错,...
  • 计算机网络-数据链路层帧同步

    千次阅读 热门讨论 2018-02-25 17:35:38
    概念两个工作站之间以报文分组为单位传输信息时,必须将线路上的数据流划分成报文分组或HDLC(高级数据链路控制)规程的帧,以帧的格式进行传送。在HDLC通信规程中的帧的帧标识位F(01111110),就是用它来标识帧的开始...
  • OSI之数据链路层中的各个协议

    千次阅读 2018-10-28 18:48:17
    数据链路层中的协议1.数据链路层功能2.区分几个名词3.为什么采用数据链路控制规程?... 面向比特的链路控制规程HDLC8.1 帧结构8.2 零比特填充法8.3 HDLC特点9. 因特网的点对点协议PPP(面向无连接)...
  • 2. 点到点信道的数据链路2.1 点到点信道(1)点到点信道是指一条链路上就一个发送端和一个接收端的信道,通常用在广域网链路。如两个路由器通过串口相连或家庭用户使用调制解调器通过电话线拨号连接ISP。 (2)早期...
  • 用户同步数据信道:UserSynchronization US 用户等时数据信道:UserIsochronous UI UI 7、蓝牙的收发规则 上图为RX缓存。 上图为TX缓存。 新分组到达时,ACL链路的RX缓存器要流量控制,...
  • 计算机网络数据链路层题库

    万次阅读 多人点赞 2018-07-31 17:21:57
    目录 网络课课后题 王道与其他 综合应用题 网络课课后题 ...1. 以下哪点不是链路层需要解决的问题 ...3 在数据链路层上处理发送方和接收方的收发帧同步问题的是 A、差错控制 B、流量控制 C...
  • 3.1数据链路层的功能

    2016-08-25 22:55:15
    数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。...
  • 数据链路层的数据传输

    千次阅读 2016-12-22 12:02:40
    数据链路层的数据传输 在数据链路层,数据是以帧的形式传输的。帧由帧首部、数据部分、帧尾部这三个部分组成。帧的数据部分是从网络层传送到数据链路层的IP数据报,为了提高帧的传输效率,应当使数据部分的长度尽...
  • 计算机网络的数据链路层与网络层

    千次阅读 2019-05-05 21:36:00
    数据链路层 ...数据链路:把实现控制数据传输的通信协议的硬件和软件都加到链路上构成的(也称逻辑链路) 2、 数据链路层协议的基本传输单元——帧 3、 数据链路层协议解决的三个基本问题:封装成帧,透明...
  • 数据链路层的几种协议

    千次阅读 2016-09-14 16:25:49
    计算机网络在现在生活中越来越重要,所以我们... 在数据链路层主要是负责传输数据,有很多种协议,用的最多的是局域网中的以太网协议,和广域网中的PPP协议,HDLC协议。 Etherne II报头8目标地址6源地址6以太类型2...
  •  最早由IBM公司制定的面向比特型的数据链路控制规程——同步数据链路控制(SDLC)协议由于个有透明传输、可靠性高、传输效率高以及具有很大的灵活性等优点,已被越来越广泛地采用。但由于这种链路协仪功能比较完善...
  • 数据链路层的建立维护与删除,数据帧的包装,传输与同步, 以太网帧的格式,交换机的转发原理(环境,过程,原理) 交换机的命令行配置(用户,特权,接口,全局配置模式,)
  • 一、前言 数据链路层负责通过一条...其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造成为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。       ...
  • LTE概述

    千次阅读 2019-10-09 17:05:00
    :无线链路控制(Radio Link Control),MAC 3 , PDCP 4 RRC功能 资源调度 无线资源管理 无线接入控制 移动性管理 LTE协议栈 信令流 UE eNB MME 数据流: UE eNB S-GW LTE无线接口—用户...
  • 背景介绍闲鱼 2014 年成立至今已实现了千万级 DAU 的跃迁,业务决策方法和基于方法背后的能力亟需提升——从原始的经验驱动到更科学合理的数据驱动体系,这里需要越来越多的数据分析和报表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,822
精华内容 21,128
关键字:

同步数据链路控制