| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> 计算机网络——数据链路层 -> 正文阅读 |
|
[网络协议]计算机网络——数据链路层 |
引言??我们先来回顾一下计算机网络的结构,计算机网络的设计目的是在不可靠物理链路实现两台相邻机器之间可靠、有效的通信。
??在上一章我们介绍了物理层,那么在数据链路层,我们提出如下问题:
??计算机网络中有两种链路:
数据链路层的设计问题
提供网络层服务
??计算机网络最主要的服务就是将数据从源机器的网络层传输到目标机器的网络层。在源机器的网络层有一个实体(称为进程),它将一些比特交付给数据链路层,要求传输到目标机器。数据链路层的任务就是将这些比特传输给目标机器,然后再进一步交付给网络层。
成帧
??为什么要成帧呢?数据链路层需要处理传输错误,调节数据流的快慢。为了达到处理传输错误的目的,数据链路层将数据流分成帧并且计算每一帧的校验和,接收方对校验和进行检验,在发现有数据传送错误时,只需要将有差错的帧再次进行传送即可,而不需要将全部数据的比特流进行重传,这将会大大提高传送效率;不仅如此,封装成帧还可以根据发送接收双方的能力调节数据流的快慢,当接收方速度过慢时,数据链路层可以停止发送下一帧并保持数据的完整性。 ??那么,我们要如何确定一帧的开始和结束分界呢? 字节计数法??字节计数法就是利用帧头部的一个字段来标识该帧中的字符数。
字节填充的标志字节法??用一些特殊字节(FLAG)作为帧开始和结束标志,用转义字符(ESC)来区分二进制数据中存在的特殊字节。
比特填充的标志比特法??这是一种面向二进制位的帧格式,把所有需传输的数据以比特位一字排开,并以特殊的位模式01111110作为帧标志,即一个帧的开始(同时标志前一个帧的结束) ??当帧内容中出现一个与帧标志相同的位串01111110,则在5个1后插入一个0,即变成01111101,接收方将自动删除第5 个1后的0。这称为位填充法(零比特填充法),也称为透明传输。 ??如果由于干扰,一个帧没有正确接收,则可扫描接收串,一旦扫描到01111110,即新的一帧从此开始。即可以再同步 ??比特填充的标记比特法,可以传输任意比特数的帧了,同时,它的传输效率也比 字节填充的标记字节法要高。 练习数据链路协议使用了下面的字符编码:
为了传输一个包含4个字符的帧:A B ESC FLAG,试问使用下面的成帧方法时所发送的比特序列(用二进制表达)是什么?
0111 1110(FLAG) 0100 0111(A) 11010 0011(B) 11010 0000(ESC) 0111 11010(FLAG) 0111 1110(FLAG) 流量控制
差错控制
差错检测和纠正
??冲击噪声是引起差错的主要原因。 冗余码分为两种:
一些概念
码字
海明距离??两个码字的对应比特取值不同的比特数称为这两个码字的海明距离。对于一种编码集,在这个码字的集合中,可以得到所有的任意两个码字的海明距离,其中最小的海明距离称为该编码集的海明距离d。 ??计算两个码字之间的海明距离的方法是对这两个码字进行异或运算,结果有a个1,则海明距离为a。 检错能力定理1: 如 果 d ≥ e + 1 , 则 该 编 码 可 以 检 测 出 任 何 e 个 或 e 个 以 下 的 错 误 。 如果d\ge e+1,则该编码可以检测出任何e个或e个以下的错误。 如果d≥e+1,则该编码可以检测出任何e个或e个以下的错误。 解释: 对于一种编码集,在这个码字的集合中,可以得到所有的任意两个码字的海明距离,其中最小的海明距离称为该编码集的海明距离d。如果出现的错误为e + 1位,那么直接认定它为编码集的其它编码而非检测出错,故海明距离为e + 1的检错编码,只能检测出e位数据错误。 纠错能力
??如果一个码字有t位发生差错,它仍然距离原来的码字距离最近,可以直接恢复为该码。 CRC参考文章:CRC校验码
基本数据链路层协议
??由于计算机网络中各个层次之间相互独立,因此我们在设计数据链路层协议时,排除那些与数据链路层无关的工作,总是基于以下假设:
一个乌托邦式的单工协议??该协议基于以下假设:
数据链路交换规则(Protocol1)
无错信道上的单工停-等协议(Protocol2)??很显然,这样的乌托邦协议在实际应用中根本不现实,那么我们进一步放宽假设:
??该协议和乌托邦协议的区别在于接收方数据处理能力有限,因此我们可以进行流量控制,通过接收方的反馈机制限制发送方的数据发送流量,使其适应接收方的处理速度。即发送方在收到接收方反馈信息之前停止发送。 数据链路交换规则(Protocol2)
有错信道上的单工停-等式协议??无措的信道上的单工停-等式协议显然也不能满足我们的需求,因为信道不可靠,因此我们再放宽一下假设:
差错控制??差错控制,即帧不出错、帧不丢失、帧不乱序。 正常传输数据帧被破坏??数据帧出错的话,可以发送否认帧NAK请求发送方重新发送。
数据帧丢失
??经过实际验证,将timeout设置为稍大于2t+的处理时间(t为传输时间)
序号的比特数??任何一个编号系统的序号所占用的比特数一定是有限的,因此,经过一段时间后,发送序号就会重复。序号占用的比特数越少,数据传输的额外开销就越小。 ??序号位的多少取决于是否能够确保接收端不会出现接收重复帧即可。混淆帧只出现在两个相邻帧之间,只需要两个序号,即1bit。 ??对于ARQ协议,发送序号有0和1即可,每发送一个新的数据帧,发送序号就和上次发送的不一样,重发的数据帧发送序号不变。
数据链路交换规则(Protocol3)
错误控制设 : 单 程 传 输 时 延 为 T d , 数 据 帧 发 送 时 间 为 T f , 数 据 传 输 率 为 C , 数 据 帧 长 度 为 L 信 道 利 用 率 C r = 总 时 间 ? 等 待 时 间 传 输 一 帧 的 总 时 间 忽 略 应 答 帧 长 度 和 处 理 时 间 C r ≈ T f T f + 2 T d = 1 1 + 2 T d C L 数 据 帧 L 越 短 , 信 道 利 用 率 越 低 。 设:单程传输时延为T_d,数据帧发送时间为T_f,数据传输率为C,数据帧长度为L\\ 信道利用率C_r = \frac{总时间-等待时间}{传输一帧的总时间}\\ 忽略应答帧长度和处理时间\\ C_r\approx\frac{T_f}{T_f + 2T_d} = \frac{1}{1 + 2T_d\frac{C}{L}}\\ 数据帧L越短,信道利用率越低。 设:单程传输时延为Td?,数据帧发送时间为Tf?,数据传输率为C,数据帧长度为L信道利用率Cr?=传输一帧的总时间总时间?等待时间?忽略应答帧长度和处理时间Cr?≈Tf?+2Td?Tf??=1+2Td?LC?1?数据帧L越短,信道利用率越低。 停止等待协议ARQ的优缺点
滑动窗口协议有噪声信道的全双工协议&ems;?我们基于以下假设:
&ems;?那么我们要如何进行全双工数据传输呢?如果采用ARQ协议的方法,我们要设置四条信道:两条传输数据,两条进行应答,这样成本会很高,而且利用率低,通信效率也很低。因此我们要想办法减少信道的数量。 &ems;?我们采取如下的方法。这样我们可以只用两条信道:一条A到B,一条B到A。
&ems;?为了区分数据帧和接收帧,我们在帧头中添加了kind,这样帧头就由kind, seq, ack, info, cksum组成了。 数据链路规则(Protocol4)
??在一般情况下,两个数据链路层中的某一个首先开始,发送第一帧。换句话说,只有一个数据链路程序应该在主循环外面包含to_physical_layer和start timer过程调用。如果这一帧正是接收方所期望的,则将它传递给网络层,并且接收方的窗口向前滑动。 ??我们来比较一下下面两种情况:
情况1
情况2??如果A和B同时发起通信,则它们的第一帧就会交错,即使没有传输错误,也会有一半的帧是错误的,类似的情况同样发生在过早超时的情况下,即使有一方明显地首先开始传输也会发生这样的情况。 滑动窗口协议??我们基于以下假设:
管道化的问题??如果一个帧出错或者丢失,接收方如何处理后续到来的正确帧?
退后N协议??当接收方检测出失序的信息帧后,要求发送方重发最后一个正确接收的信息帧之后的所有未被确认的帧;或者当发送方发送了N个帧后,若发现该N帧的前一个帧在计时器超时后仍未返回其确认信息,则该帧被判为出错或丢失,此时发送方就不得不重新发送出错帧及其后的N帧。这就是GO-DACK-N(退回N)法名称的由来。因为,对接收方来说,由于这一帧出错, 就不能以正常的序号向它的高层递交数据,对其后发送来的N帧也可能都不能接收而丢弃。 选择重传协议??为了进一步提高信道的利用率,可设法只重传出现差错的数据帧或者是定时器超时的数据帧。但这时必须加大接收窗口,以便先收下发送序号不连续但仍处在接收窗口中的那些数据帧。等到所缺序号的数据帧收到后再一并送交主机。这就是选择重传ARQ协议。 三个问题
|
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 2:51:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |