概述
一.数据链路层的设计问题
数据链路层涉及两台相邻机器实现可靠有效的完整信息块(称为帧〉通信。
相邻指两台机器通过一条通信信道连接起来,通信信道在概念上就像一条线路(比如同轴电缆、电话线或者无线信道〉。信道像一条线路的本质特性使得信道上传递的比特顺序与发送顺序完全相同。
利用物理层提供的不可靠的比特传输服务(功能),在两台相邻机器之间实现可靠高效的数据通信的算法和协议。或者可以说成将一条不可靠的物理线路(line)通过协议提升为一条可靠的数据链路(data link)。
1.主要功能
- 使用物理层提供的服务,向上给网络层提供服务。
- 无确认的无连接服务:差错率较低,差错交给上层处理;实时应用
- 有确认的无连接服务:一帧一确认不可靠、较短延迟信道
- 有确认的有连接服务:卫星信道或长途电话电路;流水发送+批量捎带确认,不可靠、较长延迟信道
- 处理传输错误。
- 调节数据流,确保慢速的接收方不会被快速的发送方淹没。所谓淹没,则是发送方发送的太快,使得接收方来不及接收所有的数据,造成数据的丢失。
帧:数据链路层对等体之间交换的协议数据单元
发送方实体将从网络层接收到的分组添加额外的字段(协议字段)封装而成。接收方实体根据协议字段的取值执行相应的操作(协议算法)。判定接收的数据正确后,最终将协议字段去掉,将分组提交给自己所在设备的网络层。
帧的长度是有限制的。每个传输线路都有一定的差错率,帧的最大长度限制是为了让一个帧在传输过程中出现差错这个现象成为“小概率事件”,从而易于处理出错的帧。在网络中经常使用重传处理差错。
数据链路层从网络层获得数据包,然后将这些数据包封装成**帧(frame )**以便传输。每个帧包含一个帧头、一个有效载荷(用于存放数据包〉以及一个帧尾。帧的管理构成了数据链路层工作的核心。
2.差错控制
接收方一定要能够检测差错。
校验和:通信双方为了对传输的数据进行检错和纠错而根据一定的规则添加的额外的位(组合)。
最简单的检验和是奇偶检验。在数据之外增加一位,这一位的目的就是将原有数据加上增加的这一位具有某种明显的特征。如“数据+校验位”中“1”的个数是奇数个(偶数个)。
发送方发送帧时,根据原来数据中1的个数决定校验位的取值。
以1位偶校验为例。“数据+校验和”中“1”的个数为偶数个。这就是约定的特征。
接收方收到帧后,检查“数据+校验和”中“1”的个数是否为偶数个。是,则认为帧传递正确。不是,则认为传输过程出现了错误,需要重传。
对于无确认的无连接服务,不管发出去的帧是否正确抵达目标机器,发送方只要把出境帧留存就可以了。但是对于可靠的、面向连接的服务,这样做肯定还远远不够。
确保可靠传递的常用方法是向发送方提供一些有关线路另一端状况的反馈信息。通常情况下,协议要求接收方发回一些特殊的控制帧,在这些控制帧中,对于它所接收到的帧进行肯定的或者否定的确认。如果发送方收到了关于某一帧的肯定确认,那么它就知道这帧己经安全地到达了。另一方面,否定的确认意味着传输过程中产生了错误,所以这帧必须重传。
问题:
有时候由于硬件的问题,一个帧被完全丢失了(比如一个突发噪声〉。在这种情况下,接收方根本不会有任何反应,因为它没有根据做出反应。类似地,如果确认帧丢失,发送方也不知道该如何处理。显然,如果在一个协议中,发送方发出了一帧之后就等待肯定的或者否定的确认,那么,若由于硬件故障或通信信道出错等原因而丢失了某一帧,则发送方将永远等待下去。
解决办法:计时器
当发送方发出一帧时,通常还要启动一个计时器。该计时器的超时值应该设置得足够长,以便保证在正常情况下该帧能够到达接收方,并且在接收方进行处理后再将确认返回到发送方。一般情况下,在计时器超时前,该帧应该被正确地接收,并且确认帧也被传了回来。这种情况下,计时器被取消。
然而,如果帧或者确认被丢失,则计时器将被触发,从而警告发送方存在一个潜在的问题。显然需要重新发送该帧。
- 为了顺利重传,则发送方需要有一个缓存还存储这些发送出去但是还没有收到确认消息的帧。
新问题:
当有的帧被发送了多次之后,可能会出现这样的危险 接收方将两次或者多次接收到同一帧,并且多次将它传递给网络层。
解决办法:
通过增加额外的字段,要给发送出去的帧分配序号,这样接收方可以根据帧的序号来有效区分原始帧和重传帧。
由于帧和帧之间的传输间隔是随机的因此要有一个固定的头尾来区分每一个帧。
3.成帧
成帧的主要工作是将每一段来自上层的数据封装起来,使得数据链路层的接收方实体能够正确识别一个帧的开始和结束(能够确定帧的边界),并能依据帧中携带的各种控制字段(额外添加的协议字段)判断所接收帧的正确性(是否在传输过程中出错、是否是想要的那一帧)。
确定帧的边界有一些基本的要求:容易识别一个帧的开始和结束(出错时容易同步);开销尽可能少。
a.字节计数法
利用头部中的一个字段来标识该帧中的字符数。
当接收方的数据链路层看到字符计数值时,它就知道后面跟着多少个字节 因此也就知道了该帧在哪里结束。
这个算法的问题在于计数值有可能因为一个传输错误而被弄混。
b.字节填充的标志字节法
考虑到了出错之后的重新同步问题,它让每个帧用 些特殊的字节作为开始和结束。
这些特殊字节通常都相同 称为标志字节( flag byte ),作为帧的起始和结束分界符。
两个连续的标志字节代表了 帧的结束和下一帧的开始。因此,如果接收方丢失了同步,它只需搜索两个标志字节就能找到当前帧的结束和下一帧的开始位置.
问题:当数据本身存在FLAG怎么办?
解决办法:使用转移字节ESC。
只要看它数据中标志字节的前面有没有转义字节,就可以把作为帧分界符的标志字节与数据中出现的标志字节区分开来。接收方的数据链路层在将数据传递给网络层之前必须删除转义字节。
新问题:当数据本身存在ESC怎么办?
解决办法:即用一个转义字节来填充,在接收方,第一个转义字节被删除,留下紧跟在它后面的数据字节(或许是另一个转义字节或者标志字节)。
上图描述的字节填充方案是**PPP协议(Point-to-Point Protocol)**使用的略微简化形式。
c.比特填充的标志比特法
这种方法区分比特流边界的方法考虑了字节填充的缺点,即只能使用8比特的字节。
帧的划分可以在比特级完成,因而帧可以包含由任意大小单元(而不是只能以8比特为
单元)组成的二进制比特数。
每个帧的开始和结束由一个特殊的比特模式, 01111110 或十六进制 Ox7E标记。
每当发送方的数据链路层在数据中遇到连续五个 1,它便自动在输出的比特流中填入一个0比特 。
当接收方看到5个连续入境比特 1,并且后面紧跟一个比特0 ,它就自动剔除0(即删除)比特0 。比
特填充和字节填充一样,对两台计算机上的网络层是完全透明的。如果用户数据中包含了标志模式
01111110 ,这个标志传输出去的是 011111010 ,但在接收方内存中存储还是 01111110。
d.物理层编码违禁法
比特编码成信号通常包括一些元余比特,以便帮助接收器同步接收。这种元余意味着一些信号将不会出现在常规数据中。例如,在 4B/5B 线性编码模式下,4 个数据位被映射成5 个信号比特,通过这种方法确保线路上的信号有足够的跳变。这意味着 32 个可能的信号中有 16 个是不会被使用的。我们可以利用这些保留的信号来指示帧的开始和结束。实际上,我们使用“编码违法”来区分帧的边界。这种方案的优点在于,因为这些用作分界符的信号是保留不用的,所以很容易通过它们找到帧的开始和结束,而且不再需要填充数据。
4.流量控制
流量控制的本质是发送方发送的速率应该与接收方的接收速率相匹配。
首先是接收方,一般有一个或多个缓存帧的缓冲区来接收数据帧,处理程序处理缓冲区里面的帧,这样可以避免边接收边处理造成的数据丢失。
即使有缓冲区缓存数据,当发送方的速率长时间超过接收方的速率时,缓冲区会满,从而造成数据丢失。
基于反馈的流量控制(feedback-based flow control ),接收方给发送方返回信息,允许它
发送更多的数据,或者至少告诉发送方自己的情况怎么样。
基于速率的流量控制 Crate-based flow control) ,使用这种方法的协议有一种内置的机制,它能限制发送方传输数据的速率,而无须利用接收方的反馈信息。
高效性:
流水发送:为了避免一帧传递完后再传递下一帧带来的线路带宽的浪费,尤其是在线路较长时,发送方可以流水发送多帧。这需要发送方有多个缓冲区来缓存已经发送还没有收到确认的帧(没有传输完成的帧)。
捎带确认:为了避免单独的确认帧浪费资源,将确认使用接收方发送的数据帧携带。这要求双工通信。
批量确认:在流水场景中,接收方收到多个帧时返回一个确认,从而减少确认帧的个数。尽最大可能不触发已正确接收帧的重传。
二.差错检验和纠正
CRC循环冗余校验码(多项式编码)
多项式编码的基本思想是:将位串看成是系数为0或1 的多项式。
一个 k位帧看作是一个 k-1 次多项式的系数列表,该多项式共有 k项,从 x(k-1)到x0 。这样
的多项式认为是 k-1 阶多项式。高次(最左边〉位是 x^(k-1) 项的系数,接下来的位是 x^(k-2)
的系数,依此类推。例如, 110001 位,因此代表了一个有 6项的多项式,其系数分别
1 、1、0、 0、 0、 1
使用多项式编码时,发送方和接收方必须预先商定一个生成多项式 (generator polynomial) .
生成多项式的最高位和最低位系数必须是1.
传输的数据等于原数据加上校验和,校验和的位数一般就是余数位,比生成多项式位数少一。
接收方接收到数据之后除以生成多项式,如果能够整除,证明传输的数据没有错误。
三.基本数据链路层协议
假设网络层、数据链路层和物理层都是独立的进程。
物理层的功能实现驻留在网络接口卡中,主要功能包括按照一定速率将数据转换为信号发送出去和将接收到的信号转换为数据。数据链路层的功能实现部分分布在网卡中,部分分布在操作系统中。网卡中的数据链路层功能主要包括对发送的数据生成校验和,对接收的数据检查校验和。(硬件实现)
数据链路层的部分功能(本章关心的协议内容)在操作系统中实现,主要包括可靠性和高效性所涉及的各种功能。如重传、确认、编号、流量控制、流水等。网络层的功能也在操作系统中实现。操作系统中发送和接收的数据都存放在操作系统管理的缓冲区中,由位于操作系统中的数据链路层和网络层进程使用。应用层有单独的缓冲区。数据需要在应用层缓冲区和操作系统缓冲区交换数据。(软件实现)
物理层进程和某些数据链路层进程运行在一个称为网络接口卡 (NIC, Network Interface Card)的专用硬件上。因此可以说网卡是一个2层设备。
当数据链路层收到一个网络层传来的数据包,就在数据包的前后增加一个头一个尾,封装到一个帧中。
帧由一个内嵌的数据包,一些控制信息(在头中),和一个校验和(在尾部)组成。
我们假设有一个现成的代码库,其中过程 to_physical_ layer 发送一帧,from_physical_ layer
接收一帧。刚开始时,接收方什么也不做。它只是静静地等待着某些事情的发生。在本例协议中,我们用过程调用 wait for event (&event )标示数据链路层正在等待事情发生。只有当确实发生了什么事情(比如,到达了一个帧),该过程才返回。
当一帧到达接收方,校验和被重新计算。如果计算出的帧校验和不正确(即发生了传输错误),则数据链路层会收到通知( event = cksum err )。如果到达的帧没有受到任何损坏,数据链路层也会接到通知( event=frame arrival ),因此它可以利用from_physical layer得到该帧,并对其进行处理。
为了说明后面使用的协议,这里定义了5个数据结构: boolean seq_nr、 packet、frame_kind 和frame。seq_nr是一个小整数,用来对帧进行编号,以便我们可以区分不同的帧。
一个帧由4个字段组成: kind seq ack info ,其中前3个包含了控制信息,最后一个可能包含了要被传输的实际数据。这些控制字段合起来称为帧头(frame header )。
kind 字段指出了帧中是否有数据,因为有些协议需要区分只有控制信息的帧和同时包
含控制信息和数据信息的帧。seq ack 分别用作序号和确认。数据帧的 info 字段包含了一个数据包:控制帧的 info 字段没有用处。
数据包和帧的传递:wait for event 是一个严格的循环过程,它等待事情发生。过程 to_network_ layer 和from_network layer 被数据链路层用来向网络层传递数据包或者从网络层接收数据包。注意,from_physical_layer to_physical layer 在数据链路层和物理层之间传递帧。
在大多数协议中,我们假设信道是不可靠的,并且偶尔会丢失整个帧。为了能够从这种灾难中恢复过来,发送方的数据链路层每当发出一帧,就要启动一个内部计时器或者时钟。如果在预设的时间间隔内没有收到应答,则时钟超时,数据链路层会收到一个中断信号。
定时器:在我们的协议中,这个过程是这样实现的 让过程 wait for event 返回 event= timeout 过程 start_timer 和stop_timer 分别打开和关闭计时器。只有当计时器在运行并且调用stop_timer 之前,超时事件才有可能发生。在计时器运行的同时,允许显式地调用 start_timer:这样的调用只是重置时钟,等到再经过一个完整的时钟间隔之后引发下一次超时事件(除非它再次被重置,或者被关闭〉。
辅助定时器:过程 start_ack timer stop_ack timer 控制一个辅助计时器,该定时器被用于在特定条
件下产生确认。(比如捎待确认,流水发送,流水确认等)
1.一个乌托邦式的单工协议—不考虑差错和流量控制
协议只有两个单独过程,一个发送方一个接收方,然后发送方运行在原机器上,接收方运行在目标机器上的数据链路层。这里没有用到序号和确认,唯一可能的时间就是frame_arrival,即到达了一个完好无损的帧。发送过程只用到了帧的info字段,其他字段都和差错控制和流量控制有关,这里都不考虑。
接收过程也很简单,等待的结果就只有frame_arrival。调用from_physical_ layer 将新到达的帧从硬件缓冲区中删除,并且放到变量r中,以便接收方的代码可以访问该帧。最后,该帧的数据部分被传递
给网络层,数据链路层返回继续等待下一帧的到来,即实际上它把自己挂起来, 到下一帧到来为止。
不现实的协议。
2.无错信道上的单工停—等式协议(考虑流量控制,不考虑差错控制)
发送方发送一帧,等待对方确认到达后才能继续发送,这样的协议称为停—等式协议(stop-and wait )。
虽然这个例子中的数据流量是单工的,即只是从发送方传到接收方,但是帧可以在两个方向上传送。因此,两个数据链路层之间的通信信道必须具备双向传输信息的能力。然而,这个协议限定了流量的严格交替关系 首先发送方发送一帧,然后接收方发送 帧:接着发送方发送另一帧,然后接收方发送另一帧,以此类推。这里采用 个半双工的物理信道就足够了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5dxIp2ZV-1666851169835)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/fd36bd38-6c7b-4677-8362-156af0207ad3/Untitled.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EhP7GnQe-1666851169836)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4b2ae1b2-5f32-4eba-971d-e490eb286917/Untitled.png)]
就像在协议一中那样,发送方首先从网络层获取一个数据包,用它构造一帧,然后发送出去。但现在,与协议一不同的是,发送方在开始下一轮循环从网络层获取下一个数据包之前必须等待,直到确认帧到来。发送方的数据链路层甚至根本不检查接收到的帧,因为对它而言只有一种可能性,即入境帧总是来自接收方的确认。
接收方在进行下一轮循环等待之前必须给发送方发送一个确认帧。对于发送方来说,确认帧的
到来比帧内包含什么内容更重要,因此接收方根本不需要往确认帧中填充任何特别的信息。
3.有错信道上的单工停—等式协议(考虑流量控制,考虑差错控制)
增加约束条件:信道(线路)有差错,信息帧可能损坏或丢失。
解决办法:出错重传。
带来的问题:
什么时候重传 —— 定时
响应帧损坏怎么办(重复帧)—— 发送帧头中放入序号
为了使帧头精简,序号取多少位 —— 1位
发方在发下一个帧之前等待一个肯定确认的协议叫做PAR带有重传的肯定确认(Positive Acknowledgement with Retransmission)或ARQ自动重复请求(Automatic Repeat reQuest)
协议3与其前任协议的不同之处在于,当发送方和接收方的数据链路层处于等待状态时,两者都用一个变量记录下了有关的值。发送方在 next frame to send 中记录了下一个要发送的帧的序号:接收方则在frame_expected 中记录了下一个期望接收的序号。每个协议在进入无限循环之前都有一个简短的初始化阶段。
运行过程:发送方发送出一帧之后就启动定时器,应该保证超时值足够长,确保帧能够顺利达到接收方,并返回确认帧。等待相关事件发生,只有3种事件:确认帧完好无损地返回、确认帧受到损伤蹒跚而至或者计时器超时。
1.如果到达了一个有效的确认帧,则发送方从它的网络层获取下一个数据包,并把它放入缓冲区覆盖掉原来的数据包,同时它还会递增帧的序号。
2.如果到达了一个受损的确认帧,或者计时器超时,则缓冲区和序号都不作任何改变,以便重传原来的帧。
当一个有效帧到达接收方时,接收方首先检查它的序号,确定是否为重复数据包。如
果不是,则接受该数据包并将它传递给网络层,然后生成一个确认帧。重复帧和受损帧都
不会被传递给网络层,但它们的到来会导致最后一个正确接收到的数据帧的确认被重复发
送,返回给发送方,以便发送方做出前进到下一帧或重发那个受损帧的决策。
四.滑动窗口协议
实现全双工传递方法:
在前面的协议中,数据帧只在一个方向上传输。
实现全双工数据传输的一种办法是运行前面协议的两个实例,每个实例使用一条独立的链路进行单工数据传输(在不同的方向上〉。因此,每条链路由一个“前向”信道(用于数据〉和一个“逆向”信道(用于确认〉组成。两种情况下的逆向信道带宽几乎完全被浪费了。
一种更好的做法是使用同一条链路来传输两个方向上的数据。毕竟,协议2 和协议3己经在两个方向上传输帧,而且逆向信道与前向信道具有同样的容量。在这种模型中,从机器A到机器B的数据帧可以与从机器A到机器B的确认帧混合在一起。接收方只要检查入境帧头部的 kind 宇段,就可以区别出该帧是数据帧还是确认帧。
捎带确认技术:
当到达一个数据帧时,接收方并不是立即发送一个单独的控制帧;而是抑制自己并开始等待,直到网络层传递给它下一个要发送的数据包。然后,确认信息被附加在往外发送的数据帧上**(使用帧头的 ack 宇段〉。实际上,确认信息搭了下一个出境数据帧的便车。这种暂时延缓确认以便将确认信息搭载在下一个出境数据帧上的技术就称为捎带确认 (piggybacking )**。
捎带确认好处:
更好地利用了信道的可用带宽。帧头的 ack 宇段只占用很少几位,而一个单独的帧则需要一个帧头、确认信息和校验和。而且,发送的帧越少,也意味着接收方的处理负担越轻。
滑动窗口协议概述:窗口是我们关心的内容,滑动代表它是变化的
接下去的3个协议都是双向协议,它们同属于一类称为滑动窗口( sliding window )的协议。
如同所有的滑动窗口协议一样,在这3个协议中,任何一个出境帧都包含一个序号,范围从0到某个最大值。最大值通常为(2^n)-1。这样序号正好可以填入到一个n位的字段中。停—等式滑动窗口协议使用 n=1 ,限制了序号只能是 0或1,但是更加复杂的协议版本可以使用任意的n。
所有滑动窗口协议的本质是在任何时刻发送方总是维持着一组序号,分别对应于允许
它发送的帧。我们称这些帧落在发送窗口(sending window )内。类似地,接收方也维持着
一个接收窗口(receiving window ),对应于一组允许它接受的帧。
数据链路层基本需求:
数据链路层协议将数据包递交给网络层的次序必须与发送机器上数据包从网络层被传递给数据链路层的次序相同。
物理通信信道就像一根“线”,也就是说,它必须按照发送的顺序递交所有的帧。
1.1位滑动窗口协议
发送窗口大小为1,1个发送缓冲区
接收窗口大小为1,1个接收缓冲区
发送方关心的是发送出去但是还没有收到确认的那些信息,而接收方关心的是期望接收到的但是还没有收到的一个帧,如果接收方没有拿到自己期望的帧,那么是不能向网络层提交数据包的。
1位窗口滑动协议代表发送方和接收方都各自只有一位缓冲区。
next_frame_to_send代表发送方视图发送的那一帧。
expected_frame代表接收方期望接收的那一帧。
1位窗口滑动协议对于问题的处理能力:
假设计算机A试图将它的0号帧发送给计算机 ,同时B也试图将它的0号帧发送给 A。假定A发出一帧给B ,但是A的超时时间隔设置得有点短。因此,A可能会不停地超时而重发 一系列相同的帧,并
有这些帧的 seq=0 ,以及 ack=1。当第一个有效帧到达计算机B,被接受,B的expected_frame变成1,其他所有剩余的帧将被拒绝。因为B目前等待seq为1的帧,且B目前等待ack=0的确认,因此不会从网络层拿到新的数据包发送。
在每一个被拒绝的重复帧到达后,B向A 发送一帧,其中包含 seq=0 ack=0 。最后,这些帧中总会有一帧正确地到达 ,引起A开始发送下一个数据包。
在上图a中没有问题,b中两个机器同时发送消息时,即使没有任何传输错误,也会有一半的帧是重复的。类似的情形发送在过早超时的情况下,即使有一方明显先开始传输也会出现这样的情况。如果发生多个过早超时,则每一帧都有可能被发送三次或者更多次,严重浪费了宝贵带宽。
2.回退N协议
发送窗口大小大于1,多个发送缓冲区
接收窗口大小为1,1个接收缓冲区
如果我们放松发送方在发送下一帧之前必须等待前一帧的确认这一规则,则可以获得更好的带宽利用率。这个方案的基本思想是允许发送方在阻塞之前发送多达 w个帧,而不是一个帧。通过选择足够大的w值,发送方就可以连续发送帧,因为在发送窗口被填满之前前面帧的确认就返回了,因而防止了发送方进入阻塞。
为了找到一个合适的w值,我们需要知道在一帧从发送方传播到接收方期间信道上能容纳多少个帧。这种容量由比特/秒的带宽乘以单向传送时间所决定,或数据链路层有责任以链路的**带宽·延迟乘积(bandwidth-delay product )**序列把数据包传递给网络层。
我们可以将这个数量拆分成一帧的比特数,从而用帧的数量来表示。我们将这个数值称为 BD 。因
此, w应设置为 2BD+1。如果考虑发送方连续发送帧并且在往返时间内收到一个确认,那么两倍的带宽-延时就是发送方可以连续发送的帧的个数:“+1 ”是因为必须接收完整个帧之后确认帧才会被发出。
例子:50kbps带宽,250ms单向传播时间,BD为12.5kb或者12.5个长度为1000位的帧。2BD+1是26帧。假设发送方还和以前一样开始发送0号帧,并且每隔 20 毫秒发送一个新帧。到 t=520s 时,它已经发送了 26 帧,这时0号帧的确认刚好返回。此后,每隔 20 毫秒就会到达一个确认,因此必要时发送方总是可以发送帧。从那时起, 25或 26 个未被确认的帧将始终在旅途中。换言之,发送方的最大窗口尺寸是 26。
保持多个帧同时在传送的技术是管道化(pipelining )的一个例子。
记住:接收方的数据链路层有责任按正确的顺序把数据包传递给网络层。
当出现错误时有两种基本办法来处理:
3.选择重传协议
如上图的b,为选择重传情况。
发送窗口大小大于1,多个发送缓冲区
接收窗口大小大于1,多个接收缓冲区
选择重传策略通常跟否定策略结合起来一起使用,即当接收方检测到错误(例如,帧
的校验和错误或者序号不正确),它就发送一个否定确认(NAK., negative acknowledgement )。
NAK 可以触发该帧的重传操作,而不需要等到相应的计时器超时,因此协议性能得以提高。
接收方为其窗口内的每个序号保留一个缓冲区。与每个缓冲区相关联的还有一个标志位(arrrived),
用来指明该缓冲区是满的还是空的。每当到达一帧,接收方通过 between 函数检查它的序号,看是否落在窗口内。如果确实落在窗口内,并且以前没有接收过该帧,则接受该帧,并且保存在缓冲区。
不管这帧是否包含了网络层所期望的下一个数据包,这个过程肯定要执行。当然,该帧只能被保存在数据链路层中,直到所有序号比它小的那些帧都己经按序递交给网络层之后,它才能被传递给网络层。
4.窗口滑动情况
最后
以上就是饱满唇膏为你收集整理的山东大学软件学院计算机网络知识总结---第三章数据链路层一.数据链路层的设计问题二.差错检验和纠正三.基本数据链路层协议四.滑动窗口协议的全部内容,希望文章能够帮你解决山东大学软件学院计算机网络知识总结---第三章数据链路层一.数据链路层的设计问题二.差错检验和纠正三.基本数据链路层协议四.滑动窗口协议所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复