⚠️ 自己写:超时定太短
本节的超时小工具:
rto_trace(samples) RFC 6298 的整数版:第一次 SRTT = R、RTTVAR = R // 2;之后 RTTVAR = (3·RTTVAR + |SRTT − R|) // 4、SRTT = (7·SRTT + R) // 8;RTO = SRTT + 4·RTTVAR;交回每个样本后的 (SRTT, RTTVAR, RTO)
backoff(rto, n) 连续超时 n 次后的 RTO:每次翻倍
resend(segs, plan, rtt, rto) 停等 + 超时重传:plan 每次发送一个字符(. 到 x 丢),丢了等 rto 再发、rto 翻倍;交回 (发了几次, 花了多少时间)
fast_retransmit(acks) 同一个 ack 连着第 4 次出现(原始 + 3 个重复)就触发,交回触发位置(从 1 数),没有交回 0往返 100,一个都没丢。RTO 定成 300 时每段发一次就够;定成 40 时定时器在 ack 回来之前会到期好几次,每到期一次就白发一次。补全 sends_no_loss(nsegs, rtt, rto):交回一共发了几次(每段 1 + 在 rtt 之内到期的次数 = (rtt − 1) // rto)。两种各算一次:
全部评论