可靠性传输
1. 差错控制
发送方将数据帧发送, 但是当发送方发送的是一个 1的时候此时接受方却接受的是一个 0.
(1)校验
接收方如果帧校验接受到的帧没有问题, 则对发送方发送一个肯定性的确认, 当对这个数据帧进行校验发现这个帧有问题的时候, 此时接受方一种是将这个数据帧扔掉, 另一种就是告诉发送方接收的数据帧有问题, 此时向发送方发送一个否定性确认消息.
(2)差错检测和校正
检错就是如果发现数据帧传输的有问题, 则将接受的数据帧扔掉, 校正就是如果接收方发现接收到的数据帧有问题, 就将这个数据帧进行较正最常用的校验码是CRC校验码
(2)重发
在发送方定一个定时器, 当发送端在发送数据的时候定义个时间, 当发送端发送数据后如果在定时器时间以内发视频内发送端接收到了一个确认回复, 则发送端认为接收端接受到数据, 如果发送端在定时器以内没有接收到任何接受方的确认消息, 此时发送端就认为接收端没有接受到数据.
(3)帧的编号
一个帧中包含了数据真正的数据, 帧的校验码, 帧的序号, 确认号, 校验信息, 帧头, 帧尾. 接收方在接收到帧的时候向发送方发送一个确认消息, 而这个消息可能也会在中途丢失, 此时当定时器到达时间的时候, 发送方就会再次发送一个帧, 此时为了防止帧的重复接受, 数据帧中应该包含一个编号来标示数据帧的序号. 在接受的时候, 接收方也必须发送给发送方自己接受到了那个帧, 因此数据帧中也应该包含一个确认号, 来识别接受方接受的是那个数据帧.
2. 流量控制
发送方发送数据的速度太快, 而接收方接受数据的速度太慢, 此时发送方就需要降低自己的发送速度.当发送方发送数据速度非常快, 而接受方接收数据的速度又特别的满, 此时在接收方设置一个缓冲区, 当缓冲区满达到一定限度的时候, 此时的接受方就给发送方发送一个信息, 告诉发送方让其暂停发送等候通知.
基本数据链路协议
wait_for_evet(&event)
其中参数 event 就是需要等待的事件
每一层都是一个对应的进程, 它们都是处于一个等待的状态, 对于发送方来说, 网络层有数据要交给数据链路层, 数据链路层对应的进程就要等待网络层将准备好的数据交给自己, 然后数据链路层将数据进行封装交给物理层, 物理层将数据发送出去, 对于接收方, 数据链路层时刻准备着物理层将数据交给自己, 然后数据链路层将数据进行解包再将数据交给网络层.
1. 无限制的单工协议
(1)简化一
A 和 B 之间的信道传输不会出错, 因此在传输的过程中就不需要进行差错检验
(2)简化二
A 和 B 之间在传输的过程中不会接受端可以无限的进行数据的接收
因此有了上面两个简化的话, 那么对于数据链路层来说, 它只管进行数据的封装以及上下层之间的交互即可, 其他的任务都不用管. 发送方只管将物理层的数据发送出去即可. 数据链路层每次去问网络层看有没有数据需要自己去传送, 如果没有就继续dengdai,如果有数据需要自己传送, 那么就从 wait_for_event 这个函数中跳出
//发送方
void sender1(vod)
{frame s;packet buffer;while(ture){from_network_layer(&buffer);s.info - buffer;//数据链路层将网络层传下来的数据作为自己的数据部分放到 info 中, 帧的封装to_physicl_layer(&s);//数据链路层将自己的帧作为参数传给物理层}
}
对于接受方而言, 接收方只需要一直等待, 只要有物理层给自己发送数据, 接受方就将数据直接接受, 然后将数据解包送给上面的网络层
//接收方
void receiver1(void)
{frame r;event_type event;while(ture){wait_for_evnet(&event);//等待物理层给自己发送数据from_physical_layer(&r);//将物理层给出的数据进行解包to_network_layer(&r.info);//把解包的数据送给网络层}
}
2. 单工的停 - 等协议
由于接收方的接收数据的能力有限, 所以发送方不能一直发送消息, 发送方在发送完数据后就停下来, 等待接收方给自己发送一个信号, 接收方在接受到一个数据后, 将这个数据进行处理, 等到数据处理完之后接收方给发送方发送一个信号告诉发送方现在数据已经处理完毕可以进行发送了, 此时发送方接受到这个信号后才可以继续进行数据的发送.
//发送方
void sender2(vod)
{frame s;packet buffer;while(ture){from_network_layer(&buffer);s.info - buffer;//数据链路层将网络层传下来的数据作为自己的数据部分放到 info 中, 帧的封装to_physicl_layer(&s);//数据链路层将自己的帧作为参数传给物理层wait_for_event(&evet);//发送方等待接受方给自己一个信号告诉自己可以继续发送数据了}
}
//接收方
void receiver2(void)
{frame r;event_type event;while(ture){wait_for_evnet(&event);//等待物理层给自己发送数据from_physical_layer(&r);//将物理层给出的数据进行解包to_network_layer(&r.info);//把解包的数据送给网络层to_physical_layer(&s);//给发送方发送一个信号, 这个信号也是一个帧}
}
3. 有噪声的信道
在协议二的基础上加上一个定时器. 同时也有差错检验. 对于发送方必须有一个时间限制,当定时器时间已经到的时候, 接受方还没有给自己一个确认信号, 此时发送方就认为接受方没有接收到帧, 对于接受方而言, 在收到数据后将数据进行处理, 处理完数据后就需要在定时器的时间范围内给发送方一个信号, 告诉接受方自己接受到数据. 同时对于发送方而言, 为了防止帧的重复发送, 它必须有一个帧的序号, 来记录下一个发送的帧的序号, 而对于接受方为了防止接收帧的重复, 此时接受方就需要有一个帧的序号来记录下一个要接收帧的序号. 因此用一个比特位就可以记录帧的序号. 发送方发送一个 1 号帧, 接收方等待接收 1 号帧, 接受方接收到 1 号帧的时候就发送一个确认等待接受 0 号帧, 此时发送方再发送一个 0 号帧, 接收方等待接收 0 号帧, 接收方接收到 0 号帧的时候就发送一个确认信号等待接收 1 号帧. 同时协议三增加一个应答号, 应答号用来表示当前收到的是哪个帧.帧的序号是发送方发送的帧的序号, 一个比特位就好了, 应答号是接收方接收到的帧的序号, 只需一个比特位.
4. 双向传输
当接收方接收到数据后对其进行处理, 然后当它要将数据发送给上面的网络层的时候会给发送方发送一个确认信号, 而在此过程中这个信号每次都会被丢失, 此时接受方就会因为接受不到确认信号且定时器已经到达时间, 此时发送方会不断地发送重复帧, 接受方会不断地将接受到的重复帧扔掉, 此时系统会陷入死锁状态.
为了提高信道的利用率, 我们采用两条信道来解决发送方和接受方的通信. 对于发送方, 当发送方发送一个数据帧的时候, 就将它所发送的帧的类型也包括在这个帧中. 假如两个进程 A 和 B, 当 A 向 B 发送数据帧的时候, 在这个数据帧的首部加上一个帧的类型, B 接受到 A 发来的数据帧的时候就先检查数据帧的类型, 当 B 检查该数据帧的时候, 发现这是一个数据帧的时候, 此时就将这个数据帧交给上面的网络层, 再向 A 发送一个应答帧, 当 A 接收到这个帧的时候就先检查帧的类型, 当发现这是一个应答帧的时候就说明发给对方的帧对方成功接受, 此时就从网络层取下一个数据进行发送.
5. 滑动窗口
包含楼量控制, 差错处理. 每一方都有一个发送窗口, 发送窗口表示发送一次最多发送多少数据对方可以接收. 每一个接收方有一个接收窗口, 这个窗口的大小可以根据发送方的不同设定自己一次可以接收数据的接受量.
(1)滑动窗口原理(设 Wt = 5, Wr = 3)
发送方发送数据时一次发送 5 个数据帧(0 ~ 4)之后就停下来, 接受方接受数据的时候一次接受多个, 其中它接受一个数据初处理一个数据, 接受到第三个数据的时候就处理第三个数据, 当处理完第三个数据(2)的时候给发送方一个确认消息2, 此时发送方就知道接收方接受到了第三个数据了, 于是下次从 2 号数据开始发送.
(2) 一维滑动窗口协议
A 发送一个数据帧发送窗口满了, 此时就必须等待 B给 A 发送确认消息, B 接受到一个数据帧后等给 A 发送一个确认消息,A 接受到这个确认消息后知道 B 成功接受到了 自己的消息, 于是发送下一个数据帧, 到了 B 之后, B 发送一个数据给 A 时, 此时 B 的窗口已满, 于是它就停下来等待 A 的确认消息, A 接受到这个消息后就发送一个确认消息给 B, 此时 B 就知道 A 成功接受到了消息
A 发送一个帧后 B 接受到一个帧, 然后发送一个确认消息给 B, B接收到确认消息后发送
(3)后退 n 帧协议
发送方有大于 1 个的发送窗口, 接受方只有一个接受窗口. 发送端每次发送数据帧的时候一次发送一批数据帧. 当有一个帧出错, 将后面的所有的帧全部重发. 加入发送方发送 0, 1, 2, 3, 4, 5, 6 七个帧, 接受方此时接受一个 0 号帧, 处理完 1 号帧后就发送一个0 号确认消息, 此时发送方滑动窗口转过就可以发送第八个数据帧了, 接着接受方接收到了一个 1 号帧, 处理 1 号帧, 处理完之后发送一个 1 号确认消息给 发送方, 发送方就可以发送第九个数据帧了, 但是此时 2 号帧丢失了, 此时丢失的这个帧就必须等到发送方的定时器时间到的时候发送方才知道对方没有接受到 2 号帧, 于是就将2号后面所有的数据帧进行重新发送. 信道利用率较低, 适用于出错率较低的信道. 是一种实用的 PPP 可靠传输. 当数据帧的序号是 n 位的时候, 此时发送方的发送窗口是 2 ^ n - 1 个滑动窗口, 接收方的窗口数是 1
(4) 选择性重发
在后退 n 帧协议上的基础上增加的功能是对于出错的数据帧, 刚才已经发过的数据帧不用重新发送, 只对出错的数据帧进行重新发送.发送窗口大于 1, 接受窗口大于 1.