为什么会有重传?重传的阈值是怎么计算的?重传有哪几种方式?
①网络的传输大小不可能无限大,那么就会有限制,如果超过这个限制就会导致网络拥塞,拥塞就会丢包,丢包就需要重传。
②动态的,无法精确计算。
③快速重传,超时重传
1.慢启动
刚建立连接,发送方对网络不了解,如果一次发送太多就可能拥塞,RFC建议把初始拥塞窗口设置为2-4个MSS的大小,然后每收到n个确认,就把拥塞窗口增加n个MSS。
2.拥塞避免
慢启动一段时间以后,拥塞窗口会达到较大的值,RFC建议在每个往返时间增加1个MSS。
疑问:为什么平时感觉不到拥塞呢?
① OS对接收窗口的最大设定很小(windows是64kb),触碰不到拥塞点
②大部分的场景是交互式的,拥塞的可能性较小
③传输时如果是同步的,需要的窗口很小
④偶发可能也感觉不到
3.超时重传后的窗口调整
RFC5681建议是发生拥塞时没被确认的数据量的1/2,但不能小于2个MSS。
超时重传对传输性能有较大的影响:
①在RTO(发出原始包到重传该包的时间段就是RTO)阶段没有传数据,浪费一段时间;②拥塞窗口的急剧减小
4.快速重传
当接收方收到的包的seq比期望的大的时候,就会ack期望的seq号,来提醒发送方重传。当发送方收到3个或以上的重复确认(Dup Ack)时,就会开始重传,这就是快速重传。
为什么需要凑满3个?包会乱序,对于乱序的包重传是没有必要的。
5.重传哪个包?
如果丢的包很多,怎么重传呢?重传哪个呢?怎么确认谁是谁呢?
①重传所有丢的,效率差
②RFC2582和RFC3782定义了NewReno,通过ack下一个丢失的包,达到重传的目的,坏处是当丢包量较大时,需要花费多个RTT(往返时间)来重传所有丢失的包。
NewReno:1-8号包,2、3号包丢了,当接收方收到重传的2号包以后,就ack 3,发送方就重传3号包,这时已经没有丢的包了,就ack 9,发送方就开始发送新的包。
③接收方在ack 2号包(重传的包)时,顺便把收到的包号告诉发送方。
例:收到4号时,告诉发送方:我已收到4号,请给我2号
收到5号时,告诉发送方:我已收到4、5号,请给我2号
这就是SACK。RFC2018里面定义的。
小结:
①没有拥塞时,发送窗口越大,性能越好。
②如果常发生拥塞,限制发送窗口性能会更好。
③超时重传性能影响最大、快速重传性能较好,而且拥塞窗口减小幅度没那么大。
④SACK和NewReno有助于提高重传效率,提高传输性能
⑤丢包对极小文件的影响比大文件严重。因为小文件,需要的包数很少,往往凑不满3个Dup Ack,只能超时重传。