680 likes | 838 Views
The Data Link Layer. Chapter 3. 内容. 数据链路层设计要点 错误检测和纠正 基本数据链路协议 滑动窗口协议 协议验证 数据链路层协议示例. 数据链路层设计要点. 为网络层提供的服务 分帧 错误控制 流控. 数据链路层功能. 向网络层提供一个定义良好的接口 处理传输错误 调节数据流 确保慢速的接收方不会被快速的发送方淹没 分组和帧之间的关系. 为网络层提供的服务. (a) 虚拟通信过程 . (b) 实际通信过程. 无确认的无连接服务 有确认的无连接服务 有确认的面向连接服务 P156.
E N D
The Data Link Layer Chapter 3
内容 • 数据链路层设计要点 • 错误检测和纠正 • 基本数据链路协议 • 滑动窗口协议 • 协议验证 • 数据链路层协议示例
数据链路层设计要点 • 为网络层提供的服务 • 分帧 • 错误控制 • 流控
数据链路层功能 • 向网络层提供一个定义良好的接口 • 处理传输错误 • 调节数据流 • 确保慢速的接收方不会被快速的发送方淹没 分组和帧之间的关系.
为网络层提供的服务 (a)虚拟通信过程. (b)实际通信过程. • 无确认的无连接服务 • 有确认的无连接服务 • 有确认的面向连接服务 • P156
示例:为网络层提供的服务 数据链路层协议的位置 3层看来,2层提供了某种连接服务
成帧 • 目标:把位流分解到离散的帧中 • 字符计数法 • 含字节填充的分界符法 • 含位填充的分界符法 • 物理层编码违例法
字符计数法成帧 字符流. (a)无错. (b)一位差错. 101111,计数值被破坏
含字节填充的分界符法成帧 (a)使用标志字节作为帧的开始和结束 (b)字节填充前后的4个字节序列例子 缺点是依赖于8位字符模式
含位填充的分界符法分帧 位填充 标志位模式为01111110,每5个1填充1个0 (a)原始数据. (b)线路上的数据. (c)删除填充之后存储在接收方存储器中的数据.
物理层编码违例法成帧 • 如果物理介质上的编码方法中包含冗余信息,可以使用 • 例: • +1表示高电平、-1表示低电平 • +1-1表示比特“1”;-1+1表示比特“0”,而+1+1和-1-1不表示数据,有可能用于帧分界 注:多种方法的联合使用可能会提高帧边界检测的速度
内容 • 数据链路层设计要点 • 错误检测和纠正 • 基本数据链路协议 • 滑动窗口协议 • 协议验证 • 数据链路层协议示例
错误检测和纠正 • 纠错码 • 检测码 突发错误:集中在某些比特位产生错误。 例如 1000×100位数据块,每一位错误概率0.001; 如果错误是孤立的,那么每个1000位数据块都可能有某1位发生错误; 如果错误每次发生都是连续的100位,那么这些错误可能只发生在1-2块数据块中,大部分数据块没有错误。
编码基础知识 • 汉明距离:两个码字中不相同的位的格式,设码字x,y,其汉明距离为w(xy),其中w(z)表示z比特串中1的个数 • 若x和y的汉明距离为d,则x至少需要d个错误位才会变成y。 • 所有可用码字之间最小的汉明距离称为最小汉明距离 • 一些结论: • 为了检测d位错误,需要d+1的最小汉明距离 • 为了纠正d位错误,需要2d+1的最小汉明距离
编码基础知识 • 奇偶校验码: • 数据后面增加1位奇偶位,奇偶位的取值保证码字中1的数目是偶数(偶校验)或者奇数(奇校验) • 例如1011010,偶校验时发送10110100,奇校验时发送10110101 • 奇偶校验编码方法汉明距离为2?可以检测单个错误 • 一种距离为5的编码方案 • A=0000000000 B=0000011111 C=1111100000 D=1111111111 • 可以纠正2个错误,例如0000000111会被纠正为B码字
纠错码之汉明码 考虑n位码字n=m+r 其中m位为报文,r 位为校验位。 r下界:m+r+12r 当m=7时,8 2r-r 可以计算r最小值4
汉明码手工计算 汉明码也能够纠正突发错误,只需要把传输的码字按照矩阵排列即可。 (1) (2) 3 (4) 5 6 7 (8) 9 10 11 偶校验 H: 1 0 0 1 0 0 0 3=1+2; 5=1+4; 6=2+4; 7=1+2+4; 9=1+8; 10=2+8; 11=1+2+8; 3|5|7|9|11 3|6|7|10|11 5|6|7 9|10|11 0 0 1 0 m: 1 1 0 1 1 0 1 1 1 0 0 通常用于出错概率比较高的链路
检错码 • (7,4)汉明码可以纠正单个错误,可以检测2位错误(最小汉明距离为3) • 奇偶校验编码方法汉明距离为2,可以检测单个错误 • 为了增加突发性错误的检测概率,可以使用分组的奇偶校验码 • 可以纠正单个错误 • 是否能检测3位错误呢? • 码流A B…M-1 M • 坏块被接受每一列都有正确的奇偶位2-n
检错码 • 循环冗余校验码 • 一帧有m位,对应M(x) • 发送方和接收方有共同的生成多项式G(x),阶为r • 发送方M(x)×xr ÷G(x) = S(x) + R(x),发送方发送 T(x)=M(x)×xr -R(x) • 接收方计算T(x)/ G(x) ,如果整除则认为没有错误;如果不整除,则认为发生了错误,错误可以用E(x)表示 • 所有长度小于等于r位的错误,可以检测(G(x)为r+1位) • 当G(x)含有x+1因子时,可以检测只影响奇数个位的突发错误 • 当长度大于r时,如果所有位模式等概,则错判概率约为(1/2)r • 标准化的G(x)多项式 • P167
检测码 多项式编码校验和的计算过程.
基本数据链路层协议 • 无限制的单工协议 • 单工的停-等协议 • 有噪声信道的单工协议
通用头文件-1 5种数据类型: 帧类型可以是数据、ACK帧、NAK帧 帧的序列号用于接收方检测重复的帧 ACK序列号指出了接收方刚接收到的帧的序列号 分组信息在数据帧时有效,包含网络层分组
通用头文件-2 • 接口函数 • 初始状态 • wait_for_event • 层间接口 • from/to_network_layer • from/to_physical_layer • 定时器 • 发送方数据定时器 • start/stop_timer • 接收方ACK定时器 • start/stop_ack_timer • 层交互 • enable/disable_n.._l.. • 内联宏 • inc
无限制的单工协议 • 信道单向 • 信道不会损坏或者丢失帧 • 网络层始终就绪 • 接收方缓存空间无限 • 处理时间可以忽略
无限制的单工协议 发送数据 高层->低层 单向 接收数据 低层->高层
单工的停-等协议 • 信道半双工 • 信道不会损坏或者丢失帧 • 网络层始终就绪 • 接收方只能处理一帧,没有缓存和排队机制 • 处理时间不可忽略,发送方需要考虑接收方的处理时间
单工的停-等协议 需要等待 接收方响应 给发送方 响应
有噪声信道的单工协议 • 信道半双工 • 网络层始终就绪 • 信道会损坏和丢失帧 • 接收方只能处理一帧,没有缓存和排队机制 • 损坏和丢失帧:定时器 • 避免冗余:序列号 • 序列号的位数? • 接收方只需要判断一帧是新帧还是已经接收的帧
发送方 Wait for ACK0 Wait for ACK1 n=1 n=0 发送0帧 s.info=buffer; s.seq=n; to_phical_layer(&s) start_timer 正确接收了一帧 && 该帧是ACK0 正确接收了一帧 && 该帧是ACK1 stop_timer Inc(n) stop_timer Inc(n) 发送1帧 s.info=buffer; s.seq=n; to_phical_layer(&s) start_timer
接收方 等待 帧n=0 等待 帧n=1 接收到一帧&&帧序号为0 to_network_layer; Inc(n); 发送ACK0 接收到一帧&& 不是帧1 接收到一帧&& 不是帧0 发送ACK0 发送ACK1 接收到一帧&&帧序号为1 to_network_layer; Inc(n); 发送ACK1
滑动窗口协议 • 1位滑窗协议 • Go Back N • 选择重传
滑窗协议概述 • 全双工数据传输 • 两条数据单工信道 • 一条信道,数据帧和ACK帧混合,用帧头部信息区分不同帧 • 捎带确认:确认信息附在往外发送的数据帧上 • 需要增加定时器来决定是否使用捎带确认 • 滑动窗口协议 • 发送窗口 • 发送方已经发送但没有确认的帧,和允许发送的帧。窗口大小可能动态变化 • 接收窗口 • 接收方可以接受的帧
示例:窗口大小为1 序列号为3比特长. (a)初始时. (b)第一帧发送以后 (c)第一帧接收以后 (d)第一个确认帧收到以后.
1位滑窗协议-1 通常只有某一个数据链路层程序需要首先发送一帧,然后才进入循环 Continued
1位滑窗协议-2 两个if条件,4种程序流程 更新buffer内容,不执行时buffer依旧是刚发送的帧
1位滑窗协议-3 (a)通常的情形. (b)双方并发地发送初始分组(进入循环之前,都发送了一帧) 向量含义是(seq, ack, 分组号);星号表示网络层接受了一个分组
停等协议的性能 • 考虑传播延迟,即考虑分组在路上的时间 • 使用停-等协议(窗口大小为1) • 例: 1 Gbps链路, 15 ms 端到端传播延迟, 1KB 分组: L (packet length in bits) 8×210/pkt T = = 8 us transmit R (transmission rate, bps) 10^9 b/sec • U sender: 利用率–发送方忙于发送数据的时间与发送时间之比 • 约每30ms可以发送1KB 分组 -> 每秒约33kB、即约0.26Mbps,而链路带宽是 1 Gbps • 后果:网络协议限制了物理资源的使用!
管道化 • 基本思想是允许发送方在阻塞(wait_for_event)之前发送w帧,w>1 • w的取值与带宽时延积有关。带宽R为Xbps,时延为Ys,那么带宽时延积为XYb,即时延期间发送方可以发送的数据量,或者发送方填满链路所需要的数据量 • 把链路看作管道,则带宽时延积说明了管道的容量 • 管道化:在链路上发送多帧,使得链路上的数据量逼近管道容量 • 管道化问题:在一个很长的帧流中,某一帧被损坏或者丢失,接收方该如何损坏帧之后到达的正确帧呢?
Go Back N && 选择重传 回退n帧 接收方丢弃错误帧之后的所有帧 发送方在没有被确认的帧超时后,退回该帧,重新发送 管道化与错误回复 (a)接收窗口大小为1. (b)接收窗口尺寸较大. 选择重传 接收方缓存错误帧之后的正确帧;发送方在没有被确认的帧超时后重新发送该帧 使用NAK提高性能 检测到错误时,接收方主动向发送方发送NAK,激发重传操作
使用 Go Back N的滑窗协议 • 双向数据流 • 信道会损坏帧,丢失帧 • 网络层希望发送分组时,需要引发network_layer_ready事件;链路层使用enable_network_layer和disable_network_layer来阻止链路层引发ready事件
使用 Go Back N的滑窗协议 用于检查b是否在窗口 [a,c)内部 捎带确认发送数据 作为GBN接收方,当期望接收的帧是frame_expected时,意味着刚接收到frame_expected-1这一帧 没有接收到任何帧时,使用MAX_SEQ Continued
Sliding Window Protocol Using Go Back N ack_expected指向发送方发送出去但没有被确认的第一个帧 next_frame_to_send指向发送方发送下一帧时使用的帧号 所以[ack_expected, next_frame_to_send)表示发送方的发送窗口 nbuffered在发送一帧以后增加1,在正确接收到一帧的ack后减少1,所以指明了已经发送但是没有被确认的帧的数量,说明了窗口大小 frame_expected接收方期望接收的帧,在GBN中,接收方按序接收,所以frame_expected帧左侧的帧恰好是接收到需要ACK的帧 Continued
Sliding Window Protocol Using Go Back N 发送 接收 Continued
Sliding Window Protocol Using Go Back N 发送方接收到ack,滚动窗口 超时发送
关于nbuffered大小 Assume MAX_SEQ=7 • nbuffered=8 • 0…7 • 0…7 • 0…7 • … • 0…7 Assume MAX_SEQ=7 • nbuffered=7 • 0…6 • 7…5 • 6…4 • … • x…y Ack0 … ACK5 ACK6 ACK6 Ack0 Ack1 … ACK7 ACK7
关于定时器 用软件来模拟多个定时器 三个超时事件分别在 10:00:00.5 10:00:00.5+00:00:00.8 10:00:00.5+00:00:00.8+00:00:00.6
缓存接收到的失序帧 • 线路质量比较差,就不应该把正确的帧抛弃,而应该利用起来
例: 序列号: 0, 1, 2, 3 窗口大小=3 接收方区分不了到底是窗口大小只有3个还是序列号小于等于3! 接收方会不正确的把冗余数据作为新的数据发送给上层 Q: 序列号大小与窗口大小的关系是什么? 选择重传:序列号与窗口大小 (MAX_SEQ+1)/2