ARQ
协议也就是超时重传机制。通过确认和超时机制保证了数据的正确送达,ARQ
协议包含停止等待ARQ
和连续ARQ
两种协议。
停止等待 ARQ
正常传输过程
只要
A
向B
发送一段报文,都要停止发送并启动一个定时器,等待对端回应,在定时器时间内接收到对端应答就取消定时器并发送下一段报文。
报文丢失或出错
- 在报文传输的过程中可能会出现丢包。这时候超过定时器设定的时间就会再次发送丢失的数据直到对端响应,所以需要每次都备份发送的数据。
- 即使报文正常的传输到对端,也可能出现在传输过程中报文出错的问题。这时候对端会抛弃该报文并等待
A
端重传。 PS
:一般定时器设定的时间都会大于一个RTT
的平均时间。
第三次握手
B
如果此时还有没发完的数据会继续发送,完毕后会向A
发送连接释放请求,然后B
便进入LAST-ACK
状态。PS
:通过延迟确认的技术(通常有时间限制,否则对方会误认为需要重传),可以将第二次和第三次握手合并,延迟ACK
包的发送。
第四次握手
A
收到释放请求后,向B
发送确认应答,此时A
进入TIME-WAIT
状态。该状态会持续2MSL
(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃) 时间,若该时间段内没有B
的重发请求的话,就进入CLOSED
状态。当B
收到确认应答后,也便进入CLOSED
状态。
- 为什么
A
要进入TIME-WAIT
状态,等待2MSL
时间后才进入CLOSED
状态? - 为了保证
B
能收到A
的确认应答。若A
发完确认应答后直接进入CLOSED
状态,如果确认应答因为网络问题一直没有到达,那么会造成B
不能正常关闭。
ACK 超时或丢失
- 对端传输的应答也可能出现丢失或超时的情况。那么超过定时器时间
A
端照样会重传报文。这时候B
端收到相同序号的报文会丢弃该报文并重传应答,直到A
端发送下一个序号的报文。 - 在超时的情况下也可能出现应答很迟到达,这时 A 端会判断该序号是否已经接收过,如果接收过只需要丢弃应答即可。
- 从上面的描述中大家肯定可以发现这肯定不是一个高效的方式。假设在良好的网络环境中,每次发送数据都需要等待片刻肯定是不能接受的。那么既然我们不能接受这个不那么高效的协议,就来继续学习相对高效的协议吧。
连续 ARQ
在连续
ARQ
中,发送端拥有一个发送窗口,可以在没有收到应答的情况下持续发送窗口内的数据,这样相比停止等待ARQ
协议来说减少了等待时间,提高了效率。
累计确认
连续
ARQ
中,接收端会持续不断收到报文。如果和停止等待ARQ
中接收一个报文就发送一个应答一样,就太浪费资源了。通过累计确认,可以在收到多个报文以后统一回复一个应答报文。报文中的ACK
标志位可以用来告诉发送端这个序号之前的数据已经全部接收到了,下次请发送这个序号后的数据。
但是累计确认也有一个弊端。在连续接收报文时,可能会遇到接收到序号
5
的报文后,并未接收到序号6
的报文,然而序号7
以后的报文已经接收。遇到这种情况时,ACK
只能回复6
,这样就会造成发送端重复发送数据的情况