DataLinkLayer(数据链路层)
DataLinkLayer(数据链路层)
The Reference Model(参考模型)
layer | name |
---|---|
5 | Application layer |
4 | TransPort layer |
3 | NetWork layer |
2 | data link layer |
1 | physical layer |
Main Functionality(主要功能)
- 提供网络层的接口
- 通过单向连接传输数据帧
- 处理传输过程中发生的错误
- 控制数据流,防止快速的发送方淹没慢速的接受方
Data Link Layer Design Issues(数据链路层的设计问题)
Frames(帧)
1.数据链路层从网路层接受接受数据包
2.数据链路层会在将其发送到物理层之前,将这些数据包封装成包
每一帧包括一个帧头、一个帧尾、和一个有效荷载域(用于存放分组)
Relationship between packets and frames(包和帧的关系)
1.一个来自网络层数据包变成数据链路层中的有效荷载域
2.数据链路层通过给这个包加上帧头和帧尾,把这个包放到对应的帧中
Placement of the data link protocol(数据链路协议的位置)
1.一个WAN(广域网)子网包含了好多路由器,它们通过租用点到点的电话线连接起来。
2.某一帧到达一个路由器的时候,硬件会首先检查它是否有错误,然后将该帧传递给数据链路层软件
3.数据链路层软件检查这一帧,看是否有自己期望的帧,如果有,就把包含有效载荷域中的分组交给路由软件,接着路由软件选择正确的输出线路,并且把分组向下传递给数据链路层软件,然后数据链路层软件把它发送出去,进过两个路由器的数据流情况如图。
4.路由代码总是希望所有的工作都能正确的完成,也就是说,在每一条点到点线路上建立起可靠、有序的连接。它并不希望老是陷入到分组丢失的境地。如图总虚线框所示,数据链路层使得不可靠的通信看起来更加完美,至少比原来更好,另一方面,尽管我们在每一个路由器中显示了多份数据链路层软件的版本,但是实际上,只有一份数据链路层软件,它负责处理所有的线路,每条线路有不同的表和数据结构。
Possible Services(为网络层提供的服务)
可能提供的服务
1.无确认的无连接服务
帧在无连接的情况下被传送或者在错误恢复的情况下被传送
例如: 以太网
无确认的无连接服务是指源机器向目标机器发送独立的帧,目标机器并不对这些帧进行确认,事先并不建立逻辑连接,事后也不释放逻辑连接,若由于线路上有噪声导致某一帧丢失,则数据链路层不会检测这种丢帧现象,也不会恢复,当错误率很低的时候,这一类服务是十分合适的比如语音传递,这种实时通信中数据迟到比数据损坏更不好,绝大多数LAN(局域网)在数据链路层上都是使用的无确认的无连接服务。
2.有确认的无连接服务
在必要的情况下,帧在重传的情况下被传送
例如:802.11
为了提供可靠性,引入了有确认的无连接服务,当提供这种服务的时候,仍然没有使用逻辑连接,但是所发送的每一帧都需要单独确认,这样,发送发就知道每一帧是否已经正确的到达,如果有一帧在指定的时间内没有到达的话,则发送方将再次发送该帧,这类服务尤其适合不可靠的新道,比如无线系统。
3.有确认的面向连接的服务
在帧被传送之前,连接就已经建立起来了
这种服务是源机器和目标机器在传输之前首先建立一个连接,该连接上发送的每一帧都会被编号,数据链路层保证每一帧被真正接受到,而且它保证每一帧只被接受一次,并且所有的帧按正确的顺序接收,相反,在无连接服务中,如果报文丢失了,则一个分组可能会发送多次,因而也会接受多次。于此相反,面向连接服务相当于为网络层进程提供了一个可靠的位流。
Framing Methods(成帧方法)
Byte Count(字节计数法)
这种成帧方法利用头部一个域来指定帧中的字节数。当目标端的数据链路层看到这个字符值的时候,它世道后面跟着多少字符,也就是知道该帧的结束在哪里。
但是这种方法的问题是,你前面错了的话,你后面都错,所以现在用的少了。
Flag bytes with byte stuffing(含字节填充的分界符法)
这种成帧方法考虑了错误之后同步的问题,它的做法是让每一帧都用一些特殊的字节作为开始和结束,在过去,起始和结束字节是不同的,但是现在绝大多数的协议倾向于使用相同的字节,作为标志字节
但是这种方法也有一种很严重的问题,当标志字节的位模式出现在数据中,这个问题很容易发生,这种位模式往往会干扰帧的分界。解决这种问题的办法是,发送方在这种偶尔出现的每个标志字符前面插入一个特殊的转义字节ESC,接受端的数据链路层在将数据送给网络层之前会删除掉这种转义字节。这种技术叫做字节填充技术
但是如果转义字符也在数据中间怎么办?答案是同样用转义字节来填充
Flag bits with bit stuffing(含位填充的分界标志法)
每一帧的开始和结束都有一个特殊的位模式,01111110实际上就是一个标志字节,当发送方的数据链路层碰到数据中5个连续的位1的时候,它自动在输出流中填充一个位0,这种位填充机制与字节填充机制非常的相似,在字节填充机制中,当发送方看到数据中的标志字节的时候,它就在其前面填充一个转义字符,然后传送到输出字节中。
当接收方看到5个连续输入位1,并且后面是位0,它自动去掉该0位,就好像字节填充过程对于两方计算机中的网络完全透明一样,位填充的过程也对网络层完全透明。如果用户数据包含了标志模式01111110,则该标志当做011111010来传输,但是存储在接收方内存中的是0111110.
在为填充机制中,通过标志模式可以明确的识别出两帧之间的边界。因此如果接受方失去了帧同步,它只需要在输入流中扫描标志序列即可,因为标志序列只可能出现在帧边界上,永远不可能出现在数据中。
Physical layer coding violations(物理层编码违例法)
适用于物理介质上的编码方法中包含冗余信息的网络,LAN中用两个物理位来编码1位数据,通常1位是高-低电平对,0是低-高电平对,每一位数据位都有一个中间电平的越变,这使得接受方容易定位到边界上。
Error Control(错误控制)
- 修复受到的错误的帧
- 要求接受方可以检测出错误
- 通常下发送方会重新发送无确认的帧
- 使用计时器防止确认丢失
Flow Control(流控制)
- 防止快速的发送方发送的数据淹没接受方
- 接受方提供它所能接受数据量的反馈
- 由于NIC以“线速”运行,因此在Link层中很少见
- 接收器可以尽快获取数据
- 链接和传输层中的主题
Error Detection and Correction(错误的发现和纠正)
- 错误代码为数据增加了结构冗余,因此可以检测或纠正错误
- 错误检测代码
- 二维奇偶校验
- 校验和
- 循环冗余校验码
- 错误纠正码
- 海明码
- 二进制卷积码
- 里德-所罗门和低密度奇偶校验码
- 数学复杂
- 广泛用于实际系统
错误检测
Hamming’s Work(海明码的工作)
- Codeword(码字)
- m: data bits(m个数据位)
- n :redundancy bits (check bits)(冗余位也称校验位)
- 代码将m位的数据转换为m + r位的代码字
- 基本的规则
- 对于汉明距离为d的任何两个码字,将一个码字转换为另一个码字将需要d个单位错误
- 完整代码的汉明距离
- 代码中任何两个代码字之间所有可能的汉明距离的最小值
- 汉明距离
- 将一个有效码字转换为另一个有效码字所需的最小位数的翻转
- 两个码字之间的差值(按位数)
- 可以使用异或(XOR)来确定
- 例子
- 10位的4个码字
- 0000000000, 0000011111, 1111100000, and 1111111111
- 汉明码是5
- 将一个有效码字转换为另一个有效码字所需的最小位数的翻转
- 带距离的代码的界限
- 检测d位错误
- 需要d + 1的距离
- 例如:上面的4个错误
- 更正d位错误
- 需要2d + 1位的距离
- 例如:上述2个错误
- 检测d位错误
- 校正比检测困难
- 纠正=检测+纠正措施
- 检错特性
- 代码的汉明距离d + 1需要检测d个错误
- 通过检测非法代码字来检测错误
- 例子
- 0000000000, 0000011111
1111100000, 1111111111 - 汉明距离5
- 检错能力:4个单位错误
- 原因:5个单位错误可能将一个有效代码字转换为另一个有效代码字
- 0000000000, 0000011111
Parity(奇偶校验)
- 将奇偶校验位用于ASCII代码
- 偶校验:1011010→10110100
- 奇数校验:1011010→10110101
- 奇偶校验位被添加为数据位的模2和
- XOR-偶校验
- 例如:1110000->11100001
- 检测检查总和是否错误,即是否存在错误
- 检测奇数错误的简单方法
- 示例:1错误→11100101
- 由于总和错误而被检测到
- 示例:3个错误→11011001
- 由于总和错误而被检测到
- 示例:2个错误→11101101
- 由于总和正确,因此未检测到
- 示例:1错误→11100101
- 奇偶校验位本身也可能发生错误
- 检测随机错误的可能性:½
- 交织N个奇偶校验位可检测高达N个的突发错误
- 每个奇偶校验和是在不相邻的位上进行的
- 甚至多达N个错误的突发仍然会使奇偶校验正常工作
Checksum(校验和)
- 定义
- 与消息相关联的一组校验位,无论其计算方式如何
- 通常放在消息的末尾
- 作为求和函数的补充
- 通过将整个接收到的码字,数据位和校验和相加来检测错误
- 如果结果为零,则说明没有检测到错误
CRC(多项式编码)
- 多项式代码
- 又名 循环冗余校验(CRC)
- 性质
- 多项式算术以模2进行(无进位或借位)
- 加法和减法与XOR相同
- 10011011 + 11001010 = 01010001
- 01010101 – 10101111 = 11111010
- CRC校验和计算
- G(x)
- 生成多项式
- 发送者和接收者都同意使用
- 高位和低位均为1
- G(x)度:r
- M(x)
- 带有m位的帧
- 用度为m-1的多项式表示
- 比G(x)长
- G(x)
- 计算校验和的算法
- 将r个零位附加到M(x)的低端,使其具有m + r个位的M’(x)
- 使用模2除法将M’(x)除以G(x)
- 从M’(x)减去余数使其成为M’(x)
- 结果M’(x)是要发送的校验和帧
- 接收者可以将M’(x)除以G(x)
错误纠正
- 纠错属性
- 需要距离为2d + 1的代码来纠正d个错误
- 通过将非法代码字转换为就汉明距离而言最接近的合法代码字,可以纠正错误。
- 例
- 具有4个有效代码字的代码
- 0000000000,0000011111
- 1111100000、1111111111
- 汉明距离:5
- 纠错能力:2个单位错误
- 原因:3个单位错误可能将一个码字转换为另一个
- 具有4个有效代码字的代码
Hamming Method(汉明码方式)
- 一种纠正错误的方法
- 在发送者处
- 位从1开始从左到右编号
- 2的幂的位用作校验位
- 1、2、4、8、16、32等
- 其余的充满数据位
- 3、5、6、7、9、10、11等
- 每个校验位强制某些位集合(包括其自身)的奇偶校验为偶数(或奇数)
- 在发件人处(2)
- 每个数据位表示为2的幂的和
- 11 = 1 + 2 + 8
- 29 = 1 + 4 + 8 + 16
- 数据位有助于上述形式的表达式中出现的校验位
- 位11有助于检查位1、2和8
- 位29有助于检查位1、4、8和16
- 在接收器处
- 以与发送方检查相同的方式检查每个校验位(1)(2)3(4)567(8)9……
- 总结不能产生正确奇偶校验的校验位
- 结果表明数据位已更改,即错误
- 例
- 如果数据位11发生更改,即发生错误,则校验位1、2和8将更改
- 例
- 在发送者处
- M:1001000
- 码字:(1)(2)1(4)001(8)000
- 3 = 1 + 2; 5 = 1 + 4; 6 = 2 + 4; 7 = 1 + 2 + 4; 9 = 1 + 8; 10 = 2 + 8; 11 = 1 + 2 + 8
- (1)=1⊕0⊕1⊕0⊕0= 0
- (2)=1⊕0⊕1⊕0⊕0= 0
- (4)=0⊕0⊕1= 1
- (8)=0⊕0⊕0= 0
- 在发送者处
- 因此,代码字= 00110010000
- 范例(2)
- 在接收器处
- 码字= 00110010000
- (1)=(3)⊕(5)⊕(7)⊕(9)⊕(11)= 0
- (2)=(3)⊕(6)⊕(7)⊕(10)⊕(11)= 0
- (4)=(5)⊕(6)⊕(7)= 1
- (8)=(9)⊕(10)⊕(11)= 0
- 如果更改了数据位11,则检查位1、2和8也已更改(1 + 2 + 8 = 11)
Burst Error(突发错误)
使用汉明码纠正突发错误
Elementary Data Link Protocols(基本数据链接协议)
Link layer environment(链路层环境)
- 通常实现为NIC和OS驱动程序
- 网络层(IP)通常是OS软件
使用库函数实现链路层协议
- 协议中需要遵循一些定义
在文件protocol.h中定义
Utopian simplex protocol(乌托邦单纯形协议)
- 理想协议(p1)
- 没有错误,接收者的运行速度与发送者一样快
- 仅单向数据传输
- 既没有错误也没有流控制……
Stop-and-Wait protocol for error-free channel(无错误通道的停止等待协议)
- 协议(p2)确保发送方永远不会超过接收方
- 接收器准备好后返回一个虚拟帧(ack)
- 一次仅显示一帧,因此称为停止等待
- 添加了流量控制
Stop-and-Wait protocol for noisy channel(嘈杂通道的停止等待协议)
- ARQ(自动重复请求)添加了错误控制
- 接收方以“ ack”帧答复已正确接收的帧
- 如果未收到预期的“ ack”,则发送方设置计时器并重新传输帧
- 为了确保正确性,必须对车架和车架进行编号
- 接收方需要区分重发(由于丢失的确认或早期计时器)和新帧
- 对于停止等待,两个数字(使用1位)就足够了
Sliding Window Protocols(滑动窗口协议)
Concept of Sliding Window(滑动窗口协议)
- 发件人维护它可以发送的帧窗口
- 它需要缓冲帧以进行可能的重发
- 窗口随着下一个确认前进
- 接收方维护它可以接收的帧窗口
- 它需要保留到达的缓冲空间
- 窗口按顺序到达
- 较大的窗口将启用流水线以有效使用链接
- 停止等待(w = 1)对于长链接效率不高
- 最佳窗口(w)取决于带宽延迟(BD)
- 使w≥2BD+ 1以实现高链路利用率
- 流水线导致错误/缓冲的不同设计选择
- 后退-N
- 选择性重复
A One-Bit Sliding Window Protocol(一位滑动窗口协议)
- 通过停止和等待双向传输数据
- 搭载反向数据帧以提高效率
- 处理传输错误,流量控制,早期计时器
- 协议的两种情况
- 由于重复传输,同时启动[右]与正常[左]相比导致正确但缓慢的操作
- 由于重复传输,同时启动[右]与正常[左]相比导致正确但缓慢的操作
A Protocol Using“Go Back N”(使用“返回N”的协议)
- 接收方仅接受/确认按顺序到达的帧
- 接收方丢弃跟随丢失/错误帧的帧
- 发件人超时并重新发送所有未完成的帧
- 由于错误而重新传输
- 接收方的窗口大小为1(a)
- 接收方的窗口大小很大(b)
- 在软件中模拟多个计时器
- 排队超时(a)
第一次超时后的情况(b)
A Protocol Using “Selective Repeat”(使用“选择性重复”的协议)
- 接收器在接收窗口中的任何位置接受帧
- 累积确认表示最高有序帧
- NAK(负确认)会导致发送方在超时重新发送窗口之前重新发送丢失的帧
- 选择性重复的权衡
- 由于在接收者处进行缓冲并在发送者处使用多个计时器,因此比Go-Back-N更复杂
- 由于仅重新传输丢失的帧(错误率低),因此可以更有效地利用链路带宽
- (a)窗口大小为7的初始情况
- (b)在发送和接收了七个帧之后,但未确认
- (c)窗口大小为4的初始情况
- (d)在发送和接收四个帧之后,但未确认
- 为了正确起见,我们要求:序列号至少是窗口的两倍
Example Data Link Protocols(示例数据链接协议)
Packet over SONET(SONET上的数据包)
- 通过SONET光纤链路承载IP数据包的方法
- 使用PPP(点对点协议)进行成帧
PPP (Point-to-Point Protocol)(PPP(点对点协议))
- 跨链路传送数据包的一般方法
- 帧使用标志(0x7E)和字节填充
- "无编号模式”(无连接的未确认服务)用于承载IP数据包
使用校验和检测错误
链接控制协议,可打开/关闭PPP链接
ADSL (Asymmetric Digital Subscriber Line)(ADSL(非对称数字用户线))
- 广泛用于本地环路上的宽带Internet
- ADSL从调制解调器(客户)运行到DSLAM(ISP)
- IP数据包通过PPP和AAL5 / ATM发送(通过)
- PPP数据通过ATM信元以AAL5帧发送
- ATM是使用短的固定大小信元(53字节)的链路层
- 每个单元都有一个虚拟电路标识符
- AAL5是一种通过ATM发送数据包的格式
- PPP帧转换为AAL5帧(PPPoA)
HDLC (High-level Data Link Control)(高级数据链接控制)
- 历史
- SDLC(同步数据链接控制)
- 对于IBM大型机
- ADCCP(高级数据通信控制程序)
- ANSI标准
- HDLC(高级数据链接控制)
- ISO标准
- LAP(链接访问过程)
- X.25网络接口的CCITT标准
- SDLC(同步数据链接控制)
Data link layer in the Internet(互联网中的数据链路层)
- 充当互联网主机的个人计算机
DataLinkLayer(数据链路层)的更多相关文章
- 高可用与负载均衡(1)之linux系统的数据链路层负载均衡
preface 在蓝厂就职到时候,每台缓存服务器都能够跑到2G的流量,这么大的流量,有人会问,服务器是不是安装的万兆网卡,no no no,仅仅是3张千兆网卡绑定在一块.万兆网卡的服务器少见,大多数都 ...
- TCP/IP详解学习笔记(2)-- 数据链路层
1.概述 数据链路层属于计算机网络的底层,使用的信道主要有点对点信道和广播信道两种类型. 在TCP/IP协议族中,数据链路层主要有三个目的: 1)为IP模块发送 ...
- TCP/IP详解学习笔记(2)-数据链路层
数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RARP请 求和接收RARP应答 ip大家都听说过.至于ARP和RARP,ARP ...
- 数据链路层-点对点协议PPP
在通信质量较差的年代,在数据链路层使用可靠传输协议曾是一个好的办法.因此,能实现可靠传输的高级数据链路控制HDLC(High-Level Data Link Control)就称为当时比较流行的数据链 ...
- TCP/IP笔记(三)数据链路层
数据链路的作用 数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范.通信媒介包括双绞线电缆.同轴电缆.光纤.电波以及红外线等介质.此外,各个设备之间有时也会通过交换机.网桥.中继器等中转数据. ...
- 三十天学不会TCP,UDP/IP编程--MAC地址和数据链路层
这篇文章主要是来做(da)推(guang)介(gao)的!由于这两年接触到了比较多的这方面的知识,不想忘了,我决定把他们记录下来,所以决定在GitBook用半年时间上面写下来,这是目前写的一节,后面会 ...
- TCP/IP(三)数据链路层~1
前言 其实前面一堆讲的物理层的概念,会感觉特别的难理解,因为这是一个非常强大的计算机网络体系的底层知识,没有关系!我们大致了解一下就行了. 一.数据链路层概述 这是百度的简介 看图:理解一下,数据链路 ...
- 【网络】 数据链路层&物理层笔记
数据链路层 简称链路层,功能在于将数据包封装成帧,控制帧对介质的访问.链路层连接了物理介质和其之上抽象层,可以使上层不用关心用什么方法在什么介质中传输信息. 在帧被传输时经过的每一跳,每个中间设备(通 ...
- 软件开发架构介绍||OSI七层协议之物理层、数据链路层、网络层、传输层(mac地址、ip协议、断开协议、tcp协议之三次握手四次挥手)
一.网络编程 软件开发架构 C/S架构 C:客户端 想体验服务的时候才会去找服务端体验服务 S:服务端 24小时不间断的提供服务,即时监听,随时待命 B/S架构 B:浏览器 想体验服务的时候 ...
随机推荐
- Beyong Compare 2.4.10刷新剩余日期bat批处理文件
@echo off % start )(window.close)&&exit REG DELETE "HKCU\Software\Scooter Software\Beyo ...
- C# 使用vs2013 写 windows服务
第一步:添加windows服务项目 并起一个 好看的名字 第二步:添加安装程序 第三步:右键点击serviceProcessInstaller1属性,在Account中选择LocalSystem 第四 ...
- Java多线程和并发(十二),Java线程池
目录 1.利用Executors创建线程的五种不同方式 2.为什么要使用线程池 3.Executor的框架 4.J.U.C的三个Executor接口 5.ThreadPoolExecutor 6.线程 ...
- LOJ #6145. 「2017 山东三轮集训 Day7」Easy 点分树+线段树
这个就比较简单了~ Code: #include <cstdio> #include <algorithm> #define N 100004 #define inf 1000 ...
- Spring Boot教程(二十七)整合Spring Security
在这一节,我们将对/hello页面进行权限控制,必须是授权用户才能访问.当没有权限的用户访问后,跳转到登录页面. 添加依赖 在pom.xml中添加如下配置,引入对Spring Security的依赖. ...
- hive单用户多点模式配置
简介 单用户多点模式也称远程服务模式,用户非java客户端访问元数据库,在服务端启动MetaStoreServer,客户端利用Thrift协议通过MetaStoreServer访问元数据库. mysq ...
- [JZOJ6400]:Game(贪心+线段树+二分)
题目描述 小$A$和小$B$在玩一个游戏,他们两个人每人有$n$张牌,每张牌有一个点数,并且在接下来的$n$个回合中每回合他们两人会分别打出手中的一张牌,点数严格更高的一方得一分,然而现在小$A$通过 ...
- SQLite 数据类型与C#数据类型对应表
SQLite 数据类型 C# 数据类型 BIGINT Int64 BIGUINT UInt64 BINARY Binary BIT Boolean 首选 BLOB Binary ...
- C++11获取当前毫秒数
获取当前毫秒数 主要是打印日志的时候用到 / CLOCKS_PER_SEC); 头文件为ctime
- leetcode-easy-others-268 Missing Number
mycode 80.25% class Solution(object): def missingNumber(self, nums): """ :type nums ...