如果要实现可靠传输,就要做到不错不丢不乱。
1. 不错
通过增加校验和,来判断数据是否发生错误,当发生错误需要通知发送方,引入确认机制,对于正确的回复ACK,错误的回复NAK。所以在这里要增加停止等待协议。当接收方收到NAK时,可以进行重传。
同时这里要保证ACK和NAK消息段不发生错误。如果又增加一个校验和判断的话,会陷入套娃,所以可以采用超时重传机制 ,如果NAK或者ACK坏掉了,就直接重传。这样子可能会产生重复分组。
所以这里需要引入序列号,通过序列号判断是否重复了。
因为增加了序列号,所以可以通过ACK返回最后一个确认分组,就可以取消掉NAK了。
2. 不丢
假设发送方发送的消息在中间丢失了,这时候接收方不会进行任何行动,发送方会无休止等待。
所以可以增加一个定时器,当在一定的时间内,没有收到消息后,接受方会进行重传。
因为时间机制并不完善,分组可能只是延迟,不是丢失,这时候就会产生重复分组,通过序列号就可以解决了。同时ACK也需要显示的告知获取到了哪个分组。
3. 不乱
在上述过程中,通过添加序列号,解决了分组顺序混乱的问题。
上述方式,实现了可靠传输,但是性能很差,因为在等待接收方回复的过程中,发送方一直处于空闲状态,如果需要提高效率的话,需要采用滑动窗口协议