其他分享
首页 > 其他分享> > TCP/IP卷一:75---TCP超时与重传之(带选择确认选项(SACK)的选择性重传)

TCP/IP卷一:75---TCP超时与重传之(带选择确认选项(SACK)的选择性重传)

作者:互联网

一、带有选择确认选项的重传

采用SACK的好处

  • TCP发送端的任务是通过重传丢失的数据来填补接收端缓存中的空缺,但同时也要尽可能保证不重传已正确接收到的数据
  • 在很多环境下,合理采用SACK信息能更快地实现空缺填补,且能减少不必要的重传,原因在于其在一个RTT内能获知多个空缺

使用SACK的相关概念

  • 当采用SACK选项时,一个ACK可包含三四个告知失序数据的SACK信息。每个SACK信息包含32位的序列号,代表接收端存储的失序数据的起始至最后一个序列号(加1)
  • SACK选项指定n个块的长度为8n+2字节,因此40字节可包含最多4个块
  • 通常SACK会与TSOPT一同使用,因此需要额外的10个字节(外加2字节的填充数据),这意味着SACK在每个ACK中只能包含3个块。3个块表明可向发送端报告3个空缺。若不受拥塞控制限制,利用SACK选项可在一个RTT时间填补3个空缺。包含一个或多个SACK块的ACK有时也简单称为“SACK”

二、SACK接收端行为

不同SACK块的内容

  • 在上面介绍我们知道一个含有SACK选项的ACK,可以将SACK分为好几个块:
    • 第一个SACK块内包含的是最近接收到的报文段的序列号范围。由于SACK选项的空间有限,应尽可能确保向TCP发送端提供最新信息
    • 其余的SACK块包含的内容也按照接收的先后依次排列
  • 也就是说,最新一个块中包含的内容除了包含最近接收的序列号信息,还需重复之前的SACK块(在其他报文段中)

在一个ACK中包含多个SACK块的目的

  • 在一个SACK选项中包含多个SACK块,并且在多个SACK中重复这些块信息的目的在于,为防止SACK丢失提供一些备份
  • 若SACK不会丢失,[RFC2018]指出每个SACK中包含一个SACK块即可实现SACK的全部功能。不幸的是,SACK和普通的ACK有时会丢失,并且若其中不包含数据(SYN或FIN控制位字段不被置位)就不会被重传

三、SACK发送端行为

发送端的工作原理

  • 避免重传正确数据:
    • SACK发送端记录接收到的累积ACK信息(像大多数TCP发送端一样),还需记录接收到的SACK信息,并利用该信息来避免重传正确接收的数据
    • 一种方法是当接收到相应序列号范围的ACK时,则在其重传缓存中标记该报文段的选择重传成功
  • 当SACK发送端执行重传时,通常是由于其收到了SACK或重复ACK,它可以选择发送新数据或重传旧数据。SACK信息提供接收端数据的序列号范围,因此发送端可据此推断需要重传的空缺数据。最简单的方法是使发送端首先填补接收端的空缺,然后再继续发送新数据[RFc3517](若拥塞控制机制允许)。这也是最常用的方法

一个特殊情况

  • 该行为有一个例外。在[RFC2018]中,SACK选项和SACK块的当前规范是建议性的。这意味着接收端可能提供一个SACK告诉发送端已成功接收一定序列号范围的数据,而之后做出变更(“食言”)。由于这个原因,SACK发送端不能在收到一个SACK后立即清空其重传缓存中的数据只有当接收端的普通TCP ACK号大于其最大序列号值时才可清除
  • 这一规则同样影响重传计时器超时的行为。当TCP发送端启动基于计时器的重传时,应忽略SACK显示的任何关于接收端数据失序的信息。如果接收端仍存在失序数据,那么重传报文段的ACK中就包含附加的SACK块,以便发送者使用。幸运的是,食言情况很少出现,也应尽量避免出现

四、演示案例

江南、董少 博客专家 发布了1368 篇原创文章 · 获赞 918 · 访问量 27万+ 他的留言板 关注

标签:重传,接收端,ACK,IP,SACK,发送,TCP,序列号
来源: https://blog.csdn.net/qq_41453285/article/details/104100004