tcp 差错恢复
作者:互联网
TCP的差错恢复:tcp确认是累积式的,接收方不会确认失序的报文段,
发送方仅需维护已发送但未确认的最小序号,以及下一个要发送的序号
这样看来,tcp是GBN风格的,但tcp又会缓存失序的报文段,
并对缓存的报文段进行选择确认(SACK)
回退N步(Go-Back-N,GBN),也常被称为滑动窗口协议
发送方超时后,重传所有已发送且未确认的分组,
这些分组是连续的,有的是到达接收方然后被丢弃的。
如果只重传第一个未被确认的分组,就退化成了停等式。
所以接收方累积确认的话,发送方超时后必须重传所有未被确认的分组
假设接收方已连续收到base ~ k的分组,
如果新收到的分组为k+1,则发回一个对k+1的ack,
否则直接丢弃,并发回一个对k的ack
接收方丢弃所有失序的分组,这些分组将来会被重传。这种方式的优点是接收方缓存简单,只需要维护下一个希望收到的序号即可,不需要缓存失序的分组。缺点是造成更多的重传。
GBN里的ack是累积确认的,对n的ack表示n以前的所有分组都接收到了。
选择重传(Selective Repeat,SR)
发送端:每个分组拥有自己的逻辑定时器,可以使用一个硬件定时器模拟多个逻辑定时器。
收到ack,将对应分组标记为已接收,如果该分组序号等于send_base,
则将窗口移动到下一个未确认的分组处。
接收方:确认所有接收到的分组,缓存乱序的分组。接收到一个已缓存的分组,必须发回ack。
窗口长度必须小于等于序号空间大小的一半。序号用4位表示,0~15,窗口长度最大为8。
标签:缓存,重传,ack,恢复,确认,tcp,差错,分组,接收 来源: https://www.cnblogs.com/ts65214/p/12968269.html