实现说明:一些实现以字节为单位维持cwnd,另外一些实现以满尺寸数据段为单位 。
后者很难使用等式(2),因此可能会选择上一段讨论的计算方法 。
当一个TCP用重传定时器检测到数据段丢失时,ssthresh的值必须设定大于等式(3)
中给出的值:
ssthresh=max(FlightSize/2,2*SMSS)(3)
正如上面所讨论的,FlightSize是仍在网络中传送的数据量 。
实现说明:一个轻易犯的错误是一味地使用cwnd而不使用FlightSize,FlightSize
在一些实现里可能比rwnd增长得更快 。
此外,一旦超时,cwnd值必须设定不大于丢失窗口尺寸,LW,它和一个满尺寸数据
段的大小相等(不管IW的值) 。因此,在重发丢失数据段之后,TCP发送端使用慢启动算法将
窗口尺寸从一个满尺寸数据段增加到ssthresh的新值,此时拥塞避免再次发挥决定作用 。
3.2快速重传/快速恢复
当一个次序紊乱的数据段到达时TCP接受端应该迅速发送一个重复ACK 。这个ACK
的目的是通知发送端收到了一个次序紊乱的数据段,以及期望的序列号 。从发送端的观点来
看,重复ACK可以由许多网络问题引起 。首先,可以由数据段丢失引起 。在这种情况下,所
有在丢失的数据段之后发送的数据段都将触发重复ACK 。第二,可以由网络对数据的重新排序
引起(这在某些网络路径上并不少见[Pax97]) 。最后,重复ACK可以由网络对ACK或数据数
据段的复制引起 。另外,当接收数据段填补了全部或部分序列号间隔时,TCP接收端应该立即
发送一个ACK 。这将为一个通过重传超时机制来从数据丢失中恢复的发送端提供更多的及时的
信息,此机制可能是一个快速重传,或者一个实验性的数据丢失恢复算法,比如
NewReno[FH98] 。
TCP发送端应该使用“快速重传”算法来探测或者修复数据丢失,以收到的重复ACK
为基础 。快速重传算法以三个重复ACK的到达(收到四个一样的ACK,其间没有任何其他包到
达)为一个数据段已经丢失的标志 。在收到三个重复ACK之后,TCP不等重传定时器超时就重
传看来已经丢失的数据段 。
在快速重传算法发送了看来已经丢失的数据段之后,“快速恢复”算法支配了新数据
的传送,直到一个非重复ACK到达 。不进行慢启动的原因是收到重复ACK不仅意味着一个数
据段已经丢失,而且意味着数据段非常可能从网络丢失(尽管网络产生大量的重复数据段可
以保证不丢失) 。换句话说,因为接收端只有在当一个数据段已经到达时才产生一个重复ACK,
由此我们可以知道,已经脱离网络,存储在接收端的缓冲区里的数据段不会再消耗网络资源 。
另外,因为ACK"clock"保存起来了,TCP发送端可以继续发送新的数据段(尽管传送必须
继续使用一个减小的cwnd) 。
快速传送和快速恢复算法经常像下面那样一起实现 。
1. 当第三个重复ACK收到时,设置ssthresh不大于等式3给定的值 。
2. 重传丢失的数据段并设置cwnd的值为ssthresh乘以3*SMSS 。这将人为地按已经离开网
络的报文段数目(3)和接收端缓冲数据量来扩充拥塞窗口 。
3. 对每个接收到的附加的重复ACK,将cwnd增大SMSS字节 。这将人为地扩充拥塞窗口以反
映已经离开网络的附加数据段 。
4. 发送一个数据段,假如cwnd和接收端的通知窗口的值答应的话 。
5. 当下一个确认新数据的ACK到达时,设定cwnd值为ssthresh(步骤1设置的值) 。这称
作“deflating"窗口 。这个ACK必须是步骤1触发的重发引起的确认,重发之后一个RTT
推荐阅读
- HTCP/0.0 超文本缓存协议
- WINS 服务的基本概念
- 最大分段 小议TCP的MSS以及MTU
- TCP的首部
- TCP的服务
- 学习心得 TCP/IP攻击原理分析总结
- touch+将平面都能变成触摸板 用手势控制设备视频介绍
- 1 TCP/IP详解学习笔记-基本概念
- 1 TCP/IP协议数据报结构详解
- 小型猪场如何控制猪舍环境
