UDP消息格式
![](https://img-blog.csdnimg.cn/20200319114215687.png)
UDP校验和(checksum)
目的:检测UDP段在传输中是否发生错误(如位翻转)
发送方
- 将段的内容视为16-bit整数
- 校验和计算:计算所有整数的和,进位加在和的后面,将得到的值按位求反,得到校验和
- 发送方将校验和放入校验和字段
接收方
- 计算所收到段的校验和
- 将其与校验和字段进行对比
不相等:检测出错误
相等:没有检测出错误(但可能有错误)
注意: 最高位进位必须被加进去
可靠数据传输协议基本结构
rdt 可靠数据传输协议
rdt1.0
rdt1.0是基于理想情况下的协议,假设所有信道都是可靠的,没有比特位的翻转,没有数据包的丢失与超时,所以rdt1.0的传输功能就是发送方发送数据,接收方接受数据。
rdt2.0
rdt2.0在rdt1.0的基础上解决了比特位翻转的问题,这里的比特位防撞发生在运输层下面的不可信信道中数据包中的1可能会变0,0可能会变成1。rdt2.0增加了3种新机制:1.错误检验 2.接收者反馈接受信息(ACK,NAK)3.重传机制。在运输层对应用层的数据进行打包处理时,新checksum(校验和),从而接收端可以对其数据包进行检验,如果正确,返回ACK,发送者继续发送下一个数据包;如果不正确,返回NAK,发送者重传数据。
rdt2.0只考虑了发送方到接收方的数据传输,如果反馈信息ACK,NAK传输时发生比特位翻则会出错。如果ACK发生翻转,那么发送方会再次重复的发送相同的数据包;如果NAK发生翻转,那么发送方会认为数据传输情况很好,但是接收方却已经收到了一个错误的数据包。
rdt 2.1
在rdt2.0的基础之上,发送方在打包数据包时添加了0或者1编号,同样ACK,NAK字段上也添加了0,1字段,表示0,1号字段的确认或者否定。发送方就有了2种状态发送0号数据包,1号数据包,接收方也有了2种状态等待0号数据包和等待1号数据包。现在假设情景发送方向接收方发送0号数据包,如果接收方接收到0号数据包,返回ACK,但是ACK出现翻转,发送方重复发送0号数据,接收方处于等待1号数据状态,接收方会拒绝0号数据,避免重复。如果接收方接收到0号数据包出现错误,返回NAK,但是NAK出现翻转,接收方处于等待0号数据状态,发送方继续发送1号数据,接收方会拒绝1号数据,避免错序。
rdt2.2
dt2.2是在rdt2.1上的基础之上做了小小的改善,摒弃了NAK,只需采用ACK。我们在ACK的信息上加上了期望的顺序号,现在假设情景发送方向接收方发送0号数据包,如果接收方接收到0号数据包,返回(ACK,1),发送方接着发送1号数据包。如果接收方接收到0号数据包出现错误,返回(ACK,0),发送方重传0号数据包。
rdt2.2之前的版本都重在处理数据包的比特位翻转情况,却没有考虑到数据包在传输过程中出现的数据包丢失问题,这样数据包丢失会使得网络处于拥塞状态。
rdt 3.0
rdt3.0在rdt2.2的基础之上处理了数据包丢失的情况,增加了计时器的机制,如果在RTT时间段内,发送方没有接收到反馈信息,那么发送方默认数据包已经丢失了,会自动重传。
Rdt 3.0性能分析
主要原因是在RTT时间段内,网络处于空闲状态,而RTT时间段比较长,使得利用率十分的低
在此基础上采用流水线协议来改进rdt3.0
流水线协议
允许发送方在收到ACK之前连续发送多个分组
- 更大的序列号范围
- 发送方和/或接收方需要更大的存储空间以缓存分组
滑动窗口协议
Go-Back-N(GBN)协议
1.发送者在流水线中最多有 N 个未确认的数据报。
2.接收者仅发送累计的确认 ,如果中间有数据报缺失,就不予以确认。
3.发送者对最久未确认的数据报进行计时,如果计时器到点, 重传所有未确认的数据报。
4.发送窗口大于1,接受窗口等于1(也就意味着如果某一个报文段出现错误,那么接受窗口会停留再次,之后收到的数据将会被丢弃)
Selective Repeat协议
1.发送者在流水线中最多有 N 个未确认的数据报。
2.接收者对单个数据报进行确认。
3.发送者对每一个未确认的数据报进行计时,如果计时器到点, 仅重传该个未确认的数据报。
4.发送窗口大于1,接受窗口大于1(意味着可以缓存出错位置之后的报文段),最好是两者相同,