回退n帧协议c语言代码,[计算机网络]Ch.3 数据链路层

2023-05-16

数据链路层

1.DLL层设计问题

1.1 DLL层·功能

数据链路层使用物理层提供的服务在通信信道上发送和接收比特。

(1) 向网络层提供一个定义良好的接口

(2) 处理传输错误

(3) 调节数据流,确保慢速的接收方不会被快速的发送方淹没

提供的服务

(1) 无确认的无连接服务 (局域网)

(2) 有确认的无连接服务 (无线通信)

(3) 有确认的有连接服务 (电话)

无线通信,信道使用率很低但数据传输的误码率相对较高,确认是必要的

1.2 成帧

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

成帧的方法有:

(1)字符计数法

(2)带字节/字符填充的标志字节法

(3)比特填充的比特标志法

(4)物理层编码违例法

(1)字符计数法

字节计数法:利用帧头部的一个字段来标识该帧中的字符数

缺点:简单,无法恢复,已经很少使用

ef28f443bf65

字符计数法

(2)带字节/字符填充的标志字节法

该方法考虑了错误之后重新开始同步的问题,用一些特殊字节(FLAG)作为帧开始和结束标志,用转义字符(ESC)来区分二进制数据中存在的特殊字节。

ef28f443bf65

Paste_Image.png

(3)比特填充的比特标志法

以特殊的位模式01111110作为帧标志,即一个帧的开始(同时标志前一个帧的结束)

当帧内容中出现一个与帧标志相同的位串01111110,则在5个1后插入一个0,即变成01111101,接收方将自动删除第5 个1后的0。这称为位填充法,也称为透明传输。

ef28f443bf65

Paste_Image.png

(4)物理层编码违例法

采用冗余编码技术,如曼切斯特编码,即两个脉冲宽来表示一个二进制位

数据0:低-高电平对

数据1:高-低电平对

高-高电平对和低-低电平对没有使用,可用作帧边界

2. 纠错和检错

帧的校验

  超时与重发(计时器)

 帧的序号(解决重复帧的问题)

流控 基于反馈的流控 基于速率的流控(发送端确定,在DLL 中几乎不采用)

2.1帧的校验

差错的种类:

单个错误,错误分散在各块中

突发错误,错误集中在某块中

差错的处理:

纠错码(需要太多的冗余位,纠错开销太大,主要用于无线网络)

检错码 (不能恢复,可重传)

计算机网络中主要采用:

检错码:循环冗余码(CRC)

纠错码:海明码

2.1.1 海明码

海明距离的意义:如果海明距离为d,则一个码字需要发生d个1位错误才能变成另外一个码字

海明距离与检错和纠错的关系:

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

因为在距离为d+1的检验码中,只改变d位的值,不可能产生另一个合法码。如奇偶校验码,海明距离为2,能查出单个错。

海明距离为2d+1的编码,能纠正d位差错。

因为此时,如果一个码字有d位发生差错,它仍然距离原来的码字距离最近,可以直接恢复为该码。(奇偶校验码,海明距离为2,可以检出单个错)

纠正单比特错的冗余位下界,m为数据位数,r为校验位数

(m+r+1)≤2^r

每一个码字从左到右编号,最左边为第1位

校验位和数据位

凡编号为2的乘幂的位是校验位,如1、2、4、8、16、……。

其余是数据位,如3、5、6、7、9、……。

每一个校验位设置根据:包括自己在内的一些位的集合的奇偶值(奇校验或偶校验)。

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

将某一位数据位的编号展开成2的乘幂的和,那末每一项所对应的位即为该数据位的校验位(收方使用)。

如: 11 = 1 + 2 + 8

29 = 1 + 4 + 8 + 16

校验位1的检验集合为所有奇数位。

校验位2的检验集合:2、3、6、7、10、11、…

校验位4的检验集合:4、5、6、7、……

校验位8的检验集合:8、9、10、11、……

海明码纠错过程(只纠错1位)

首先将差错计数器置“0”。

当海明码数据到达接收端后,接收端逐个检查各个校验位的奇偶性。

如发现某一校验位和它所检测的集合的奇偶性不正确,就将该检验位的编号加到差错计数器中。

待所有校验位核对完毕:

若差错计数器仍为“0”值,则说明该码字接收无误。

非“0”值,差错计数器的值为出错位的编号,将该位求反就可得到正确结果。

例子:

计算"1001000"的偶校验时的海明码字?

经计算需要的检验字个数的最小值 r应满足 ( 所以r最小值为4,再根据校验位的对应规则可得下表:

ef28f443bf65

Paste_Image.png

海明码纠错实例

ef28f443bf65

Paste_Image.png

Data: 1011010

Even: 1011010 0 (偶校验)

Odd: 1011010 1 (奇校验)

2.1.2 循环冗余检错码CRC

可以检测到所有长度小于等于r的突发错误

广泛用于各种网络,几乎所有的局域网

使用CRC编码时发送方和接收方必须预先商定一个生成多项式G(x),假设有一个m为的帧M(x),使用G(x)生成的帧的步骤如下:

假设G(x)的阶为r, 那么M(x)在末尾添加r个0,得到 m+r位的位模式 。

利用模2出发,用G(x)去除 ,得到对应的余数(总是小于等于r位)。

利用 减去(模2减法)第2步中得到的余数,得到的位模式就是即将被传输的带校验和的帧

Sender

在数据帧的低端加上r个零,对应多项式为XrM(x)

采用模2除法,用G(x)去除XrM(x),得余数

采用模2减法,用XrM(x)减去余数,得到带CRC校验和的帧

Receiver

用收到的幀去除以G(x)

为零:无错误产生。非零:发生了错误,重传

3.基本DLL层协议

3.1 协议1 乌托邦式单工协议(理想的)

在一定条件下运作:

数据单向传送

收发双方的网络层都处于就绪状态(随时待命)

处理时间忽略不计(瞬间完成)

可用的缓存空间无穷大(无限空间)

假设DLL之间的信道永远不会损坏或者丢失帧(完美通道)

“乌托邦”

缺点:

不现实,没有任何流量控制

处理过程接近无确认的无连接服务,却没有差错检测

ef28f443bf65

协议1实现

3.2 协议2 无错信道上的单工停-等式协议

添加了确认帧

用于防止慢的接收方被数据淹没

收方回发一个哑帧,发送方收到哑帧,表明收方允许接收数据,

此时再次发送下一帧数据

采用一个半双工的物理信道

缺点:

新旧帧无区别对待(详情看协议3)

ef28f443bf65

协议2实现

3.3 协议3 有错信道上的单工停-等式协议(重传+确认)【ARQ/PAR】

对协议2的改进:

ef28f443bf65

Paste_Image.png

确认帧

只在接收无差错时才发确认帧,出错时不发确认帧。

重发

网络中采用检错码,无法纠正错误,由重发原来帧的方式来恢复正确的帧。

计时器

控制何时重发,防止无限期等待(死锁)。

帧序号

防止重发时接收端收到重复的帧,序号还用于接收时排序。

保证送给网络层的都是按序无重复的分组

帧格式:

ef28f443bf65

****

ef28f443bf65

协议3

ef28f443bf65

Paste_Image.png

ef28f443bf65

Paste_Image.png

3.3&3.4的夹缝 下一类协议:滑动窗口协议

与前三个协议不同,这是一个双向传递的协议。之后的三个协议都属于滑动窗口协议。

捎带确认:

当发送方的数据帧到来,抑制自己并开始等待,直到网络层传给他下一个要发的数据包,将确认信息搭载在下一个外发的数据帧(s.ack)上。

如无法“捎带”,当一个控制捎带确认的计时器超时后,单独发确认帧。

捎带确认的作用:更好的利用了信道的可用带宽。帧头的确认信息只占用很少的几位,而单独的帧需要一个帧头、确认信息和校验和

ef28f443bf65

滑动窗口本质

ef28f443bf65

Paste_Image.png

滑动窗口协议

如果发送端可以连续发送一批数据帧,必须考虑接收端是否来得及接纳与处理这么多的帧,这里就提出了网络流量控制问题

N回退协议和选择重传协议:

由于传输过程中存在延迟,即数据在传播过程中需要时间,那么如果使用上面所提及的协议,传输过程中有大量的时间存在阻塞状态,所以为了充分利用带宽,我们让发送方一次发送w个帧。所以就存在如何处理在传输过程中出现的帧错误的问题

3.4 协议4, 1位滑动窗口协议

协议四的基本工作原理:

窗口设置

滑动窗口最大值: MAX_SEQ = 1

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

窗口滑动机制

A首先发送数据帧( seq=0, ack=1, A0)

B收到A0,发送捎带确认帧(seq=0, ack=0, B0)

A收到对A0的确认,滑动窗口,发送帧(seq=1, ack=0, A1)

特点

序列号seq和确认值ack“0”“1”交替

滑动窗口长度W=1,收到确认才移动窗口

保证按顺序将接收到的正确帧只一次上交网络层

发送数据帧01,10交替,确认帧00,11交替

ef28f443bf65

协议4-实现

出错情况:

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

ef28f443bf65

Paste_Image.png

ef28f443bf65

Paste_Image.png

改进:针对出错情况接收方的接收策略选择

丢弃错帧及后续幁,其后续帧因不是期望接收帧也被丢弃

丢弃错帧,缓存后续正确接收帧

对应的发送方的重传策略选择

缓存在发送窗口中的出错帧以及其后续帧全部重发——协议5

只重发出错帧——协议6

3.5 协议5 回退N协议

ef28f443bf65

连续发送W帧的原因

接收方的接收策略:丢弃错帧,其后续帧因不是期望接收帧也被丢弃(接收窗口为1)。

发送方的重传策略:缓存在发送窗口中的出错帧以及其后续帧全部重发

3.5.1 基本概念:

定义序列号seq的取值范围和滑动窗口长度W

发送方连续发送至发送窗口满

接收窗口为1,对出错帧不确认(引发超时)

发送方超时重传,从未被确认帧开始

w值:

W<=2BD+1(个帧)

BD:带宽-延迟乘积,bit乘积出来之后换算成帧的个数

ef28f443bf65

Paste_Image.png

3.5.2 回退N协议:

ef28f443bf65

Paste_Image.png

ef28f443bf65

Paste_Image.png

该图的发送方和接收方的窗口大小都是7,那么也就是说发送方一次最多只能发送7个帧,刚开始发送方只能发送序号为0~6的数据帧,图中发送方收到序列号为第0和第1号帧的确认帧,那么整个窗口向前滑动,发送方可以发送序列号为7和8 的数据帧,但是不幸的是2号数据帧并没有收到确认帧,所以整个窗口并不会向前滑动,此时只能等待2号数据帧的计时器超时,那么超时后发送方将会从2号数据帧开始发送,重复这个过程。

实现

ef28f443bf65

回退N协议实现.png

ef28f443bf65

回退N协议实现.png

ef28f443bf65

回退N协议的累计确认

出错情况

ef28f443bf65

出错情况

3.6 协议6 选择重传协议

原因:如果错误很少发生,那么协议5可以很好的工作。一旦线路质量很差,那么重传帧需要浪费大量带宽。而选择重传节约了带宽,允许接收方缓存丢失帧之后的所有帧

接收方的接收策略:丢弃错帧,缓存后续正确接收帧

发送方的重传策略:只重发出错帧。

基本概念:

接收窗口存储差错帧后继的所有正确帧

发送方只重传差错帧

接收方接收重传帧,按正确顺序将分组提交网络层

选择重传策略:

接收方丢掉坏帧,但接受并缓存坏帧后面的所有好帧。

ef28f443bf65

选择重传策略常与否定重传策略一起使用

否定重传策略:

当接收方收到错误,他就发送一个否定确认(NAK)信息,而不需要等到相应的计数器超时,提高协议性能。

3.6.1 差错控制策略比较

回退n帧

发送方需要较大的缓冲区,以便重传

重传帧数多,适于信道出错率较少的情况

选择重传

接收方需要较大的缓冲区,以便按正确顺序将分组提交网络层

重传帧数少,适于信道质量不好的情况

滑动窗口长度w的选择

协议5(回退n帧)W = MAX_SEQ

协议6(选择重传)W= (MAX_SEQ + 1) / 2

发送方和接收方的窗口大小 W=((MAX_SEQ+1))/2,原因是防止窗口重叠,在确认帧丢失的情况下而导致的数据错误

ef28f443bf65

窗口重叠1

ef28f443bf65

重口重叠2.png

ef28f443bf65

窗口重叠3

ef28f443bf65

窗口重叠4

ef28f443bf65

窗口重叠5

接收方在某个帧出错后继续接受和缓存后续发送的数据包,直到整个窗口的填满后,把帧进行排序后才传递给网络层。

4. DLL层协议实例

4.1 高级数据链路控制(HDLC),面向位的数据链路协议

特性:

面向比特、 同步传输( bit-synchronous)

工作原理:数据帧的可靠传输

面向连接(建立/释放逻辑连接)

流控制(滑动窗口seq/ack )

差错控制( go back n / select repeat)

4.2 点到点协议PPP

面向字符的数据链路协议

PPP 是一种在链路上传输分组的常用方法

采用字节填充的帧界法 (0x7E)

“无序号帧” (无确认无连接) 用于承载IP分组

采用校验和检错

3个主要特性:

成帧:毫无歧义地区分出一帧的结束和下一帧的开始

链路控制协议(LCP)

网络控制协议(NCP)

PPP两种认证协议: PAP and CHAP

PAP是一种简单的明文验证方式

简单的C发送账号密码到S,S再返回值给C

这种验证方式的安全性较差,第三方可以很容易获取被传送的用户名和口令

CHAP是一种加密的验证方式,能够避免建立连接时传送用户的真实密码

1.S发送随机数序列给C,C将账号密码与序列运算后发送给S,S返回值给C

2.NAS 向远程用户发送一个挑战口令(challenge ),其中包括会话ID和一个任意生成的挑战字串(arbitrary challengestring )。远程客户必须使用MD5 单向哈希算法返回用户名和加密的挑战口令

3.因为服务器端存有客户的明文口令,所以服务器可以重复客户端进行

的操作,并将结果与用户返回的口令进行对照

4.在整个连接过程中,CHAP 将不定时的向客户端重复发送挑战口令,从而避免第3 方冒充远程客户(remote client impersonation )进行攻击。

PPP的帧格式

ef28f443bf65

PPP的帧格式.png

PPP成帧是面向字节填充的:

具体细节可以参考上面的字节填充法, 因为PPP重用了HDLC的技术,所以PPP使用标志字(0x7E 01111110)来标记帧的起始,使用0x7D来作为转义字符,具体操作如下:

使用0x7E来标记帧的开始

如果在Payload中存在0x7E则在该字节前,填充 0x7D(转义),把 0x7E 和 0x20 进行异或运算,对出现的0x7D 同样处理 0x7E --> 0x7D 0x5E 0x7D --> 0x7D 0x5D

若信息字段中出现ASCII码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个0x7D字节,同时将该字符的编码和0x20进行异或处理

接收方接收到帧后进行下面处理:

在帧中遇到0x7D 就把0x7D删除,在把紧跟在0x7D 后的字节和0x20进行异或运算,就得到对应的数据

地址域:固定为11111111 ,可省略

控制域:缺省为00000011,即无序号帧(即毋需确认),可省略

协议域:不同的协议不同的代码

载荷域:可变长,缺省1500字节

校验和:缺省为2字节,也可定义为4字节

LCP ( Link Control Protocol)提供了建立、配置、维护和终止点对点链接的方法

PPP的工作过程

发送端PPP首先发送LCP帧,以配置和测试数据链路

在LCP建立好数据链路并协调好所选设备之后,发送端PPP发送NCP帧,以选择和配置一个或多个网络协议

当所选的网络层协议配置好后,便可将各网络层协议的分组发送到数据链路上

配置好的链路将一直保持通信状态,直到LCP帧或NCP帧明确提示关闭链路,或有其它的外部事件发生(如用户干预等)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

回退n帧协议c语言代码,[计算机网络]Ch.3 数据链路层 的相关文章

  • matlab练习程序(c/c++调用matlab<dll>)

    这里的环境是windows7 43 vs2010 43 matlabR2010b 上一篇是通过engine来调用matlab中的语句 xff0c 本篇是通过调用m文件编译成的h lib dll文件而实现的 首先写一个函数mysvd m fu
  • CentOS7 命令行安装teamviewer遇到依赖包问题及完美解决

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 公司新到了几台服务器做Docker集群方面的应用 xff0c 将这几台服务器搭建成一个集群 由于要经常同时操作这几台服务器 xff0c 而我又不喜欢待在机房 TeamVie
  • Windows+VScode配置与使用git,超详细教程,赶紧收藏吧

    目录 第一步 xff1a 安装Git命令行工具 第二步 xff1a 配置VScode中的git 第三步 xff1a 使用 VScode 43 git xff0c 提交到仓库 当我们在VScode中编写代码后 xff0c 需要提交到git仓库
  • Python爬虫开发的3大难题,别上了贼船才发现,水有多深

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 写爬虫 xff0c 是一个非常考验综合实力的活儿 有时候 xff0c 你轻而易举地就抓取到了想要的数据 xff1b 有时候 xff0c 你费尽心思却毫无所获 好多Pytho
  • OpenStack推出最新版本Newton,显著提升单一云平台 对虚拟化、裸机和容器的管理...

    2016 年 10 月 1 0 日 北京 OpenStack社区日前发布其命名为 Newton 的第14个版本 OpenStack是用于构建云的部署最广泛的开源软件 此次推出的新功能包括 xff1a Ironic裸机开通服务 xff0c M
  • BGP Extended Communities for OSPF PE-CE Routing-域ID

    要让OSPF路由的特性能够穿过MPLS 骨干网络 xff0c 就需要额外定义一些BGP扩展团体属性 可以通过MP BGP 传递的OSPF属性包括 xff1a MP BGP 扩展属性可是使得OSPF的路由可以完全的在远端PE路由器上重建 LS
  • ESP32 Arduino http协议digest认证 接入海康威视摄像机

    注意 xff1a 使用的是ArduinoHttpClient xff0c 与ESP32内部的HTTPClient库有较大的差别 海康摄像机http接入时候 xff0c 由于没有认证信息 xff0c 会返回401无权限信息 xff0c 这时需
  • 头条 offer,记一次 JAVA 面试经历和总结

    作者 xff1a 想去大厂的小菜鸡 本文的 我 xff0c 不是我 xff0c 是文中的作者 国庆期间公司的项目很闲 xff0c 很多人觉得没意思陆续走了 xff0c 我也考虑到自己的发展 xff0c 从9月底开始面 xff0c 面到11月
  • Centos6.4部署OpenStack

    现在好多公司都使用Openstack xff0c 我做这个也是小菜鸟一个 xff1b 网上看了一些资料说的都是openstack xff0c 但是现在openstack的版本不一样 所以亲们安装的时候一定要注意看一下你要安装的是那个版本 x
  • 【论文笔记】多任务学习(Multi-Task Learning)

    1 前言 多任务学习 xff08 Multi task learning xff09 是和单任务学习 xff08 single task learning xff09 相对的一种机器学习方法 在机器学习领域 xff0c 标准的算法理论是一次
  • 常用 API 函数(5): 文本和字体函数

    AddFontResource在Windows系统中添加一种字体资源CreateFont用指定的属性创建一种逻辑字体CreateFontIndirect用指定的属性创建一种逻辑字体CreateScalableFontResource为一种T
  • ElasticSearch笔记系列(7)——删除文档和删除索引

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本文介绍删除文档和删除索引的基本方法 本来想把这几篇合成一篇的 xff0c 但最近事情太多 xff0c 好多比较长的文章总是写了一半便束之高阁 xff0c 其中有几篇还日久
  • 经验分享——嵌入式工程师必看书籍(转载)

    从事嵌入式研发行业十年 xff0c 认为学习就是要不断的吸纳知识 xff0c 在研发过程中 xff0c 经常会遇到一些问题 xff0c 这种发现问题并解决问题的过程就是进步 为什么选择学习嵌入式 xff1f 嵌入式系统无疑是当前最热门最有发
  • VS好用系列之代码片段

    背景 xff1a 同学们 xff0c 我们后台写接口 xff0c 有过没这样的困扰 每个接口都需要写这么一串相似的代码 xff0c 正常都是复制粘贴一下 xff0c 如下图代码所示 xff1a 那么我们有没更好 更方便快捷方法 xff0c
  • 在虚拟机里面安装Linux操作系统

    在这篇文章中以VMware14为例 xff0c Linux操作系统采用CentOS7进行讲解如何在虚拟机中安装Linux操作系统 一 选择创建新的虚拟机 二 在选择虚拟机配置界面选择 自定义 高级 选项 xff0c 然后点击 下一步 三 在
  • [译] OpenStack Pike 版本中的 53 个新功能盘点

    原文 xff1a https www mirantis com blog 53 things to look for in openstack pike 作者 xff1a Mirantis Nick Chase 发布日期 xff1a 08
  • vsftp锁定用户在家目录

    vsftpd锁定用户在家目录 1 锁定所有本地用户在家目录 xff1a 更改vsftpd conf配置文件 添加 chroot local user 61 YES 2 锁定列表中的用户在家目录 更改vsftpd conf 添加 chroot
  • 使用cas-overlay-template搭建cas服务器

    背景 在多服务统一帐号的应用集中 xff0c 单点登录是必不可少的 CAS就是成熟的单点登录框架之一 Github地址 https github com apereo cas 现在我们就通过一系列快速简单的构建方式实现一个简单的单点登录系统
  • /var/log目录下的20个Linux日志文件功能详解

    如果愿意在Linux环境方面花费些时间 xff0c 首先就应该知道日志文件的所在位置以及它们包含的内容 在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决 以下介绍的是20个位于 var log
  • 很喜欢博客园这个平台

    经朋友推荐来到博客园的 xff0c 非常喜欢 希望在这里能学到更多知识 转载于 https www cnblogs com rickons p 4580253 html

随机推荐