作者回复: 1、TCP的序列号是连续的,所以收到ACK9,就相当于6、7、8也确认了。 2、重新看了下,其实你的问题是,为什么快速恢复中cwnd会超过ssthresh。 因为,ssthresh在发生快速重传时,减为cwnd/2,这是最终目标,原因是发生了丢包,所以要减速。但为什么快速恢复中,cwnd会超过ssthresh呢?这是因为,此时网络不是那么差,还能够收到ACK,也许只丢了窗口中最早的那一个报文,如果不允许cwnd超过ssthresh,那么重发第一个报文再等到ACK,就是一个RTT的时延,这太长了。所以允许在这个过程中cwnd超过ssthresh,这仍然能保持着速度不会降得太快。但结束后已经没有丢包了,还是得回到最初的目标,把速度降下来,防止再次丢包。 https://www.isi.edu/nsnam/DIRECTED_RESEARCH/DR_WANIDA/DR/JavisInActionFastRecoveryFrame.html,这篇文章解释得很清楚,你可以看下。 3、网络中是会重复发送报文的,比如某个路由器出现故障。
作者回复: 基于当时调研过的网络环境的经验数据
作者回复: 是的
作者回复: 每次仍然返回应收、但未收到的sequence
作者回复: 1、中转路由器可能出现重启、队列满丢包、变更网络路径等,所以会出现重复报文。 2、TCP报文段都有sequence,接收方凭这个字段来判断是否失序; 3、是的。 后两个问题都靠sequence字段的设计解决。但这个设计也导致了基于TCP的多路复用协议出现队头阻塞,所以http3才选择抛弃tcp