可靠数据传输的原理
让我们反过来想,可靠传输会遇到什么问题
会遇到的问题
- 信道可能会使得原有数据遭到更改(使得0变1,1变0)
- 接收方收到的包的顺序乱了
- 包在传输过程中丢失了
如何处理?
- 使用Automatic Repeat reQuest (ARQ)协议
- 错误检测
- 接收方的回复
- 重新传输
Stop-and-Wait(停止并等待)
关键技术
- checksum(校验和)
- ACK
- 超时重传(Timer)
- 序号
过程
- 发送方将checksum和序号放入每一个包
- 接收方使用checksum检查损坏的包
- 接收方用序号保证没有包丢了且包的顺序是对的
- 接收方发送ACK来通知发送方一个包被正确接收了
- 如果接收方发送的ACK在一个指定时间内没有到达(timeout),发送方会再次发送包
四种情况
- 正常情况
- 包损坏/丢失
- ACK丢失
- 过早超时/ACK延时
正常情况
发送方 | 接收方 |
---|---|
向包中添加checksum和序号,每次都发送一个包然后等待ACK,直到ACK到来才发送下一个包 | 收到包之后检查checksum |
开始计时 | 如果checksum是对的,发送ACK通知发送方包裹正确收到,ACK中会特定指出下一报文段的序号 |
在timeout前,收到ACK | |
停止计时 |
包损坏/丢包
发送方 | 接收方 |
---|---|
发送packet然后等待ACK | 情况1:检查checksum发现包损坏,悄悄丢弃 情况2:根本就没收到包(包丢失了) |
开始计时 | |
超时了(因为一定不会有ACK来,所以肯定超时),重新发送包 |
ACK丢了
发送方 | 接收方 |
---|---|
发送方发送包然后等待ACK,开始计时 | 接收方成功收到包,检查checksum,一切完美,发送ACK |
没收到ACK | |
超时重发 | 接收方又收到了重复的包裹,直接丢弃,再次发送ACK |
过早超时/ACK延时
发送方 | 接收方 |
---|---|
发送包1等ACK,开始计时 | 收到包1,一切无误,发送ACK0 |
没有接收到ACK0(ACK0延迟) | |
超时重发包1,开始计时 | 收到重复的包1,直接丢弃,发送ACK0 |
收到延迟的ACK0,停止计时 | |
收到另一个ACK0,直接忽略 |
然而,停止并等待的效率不够高,因为发送一个packet并接收一个ACK需要等待两倍的传播时间(一来一回),所以出现了Go-Back-N和Selective Repeat的方法。 这两种方法都是协议管道传输,是基于滑动窗口的思想的。
Go-Back-N
过程
发送方可以在“管道”中存放N个packets,并按顺序发送,但接收方收到后是按顺序发送ACK,也就是如果发送方管道中有其中一个packet丢失或损坏从而使得接收方没有收到,那么接收方就会丢弃该丢失或损坏包裹后收到的其他包裹,并且仍然回复收到的最后一个包裹所对应的ACK。因为这里的接收方没有缓存来暂时容纳收到的packet
Selective-Repeat
过程
发送方可以在“管道”中存放N个packets,并按顺序发送,接收方可以按收到的包裹发送对应的ACK。因为这里有缓存容纳收到的packet