- 接收方不通告小窗口 。通常的算法是在窗口增大一个MSS或者增大到缓冲区一半之前,接收方不通告一个比当前窗口大的窗口(宁可为0) 。
- 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据:
- 需要发送的数据是一个满长度(MSS)的报文段,可发送 。
- 需要发送的数据长度大于等于接收通告窗口值的一半时 , 可发送 。
- 没有飞行数据时(即是没有已发送但是未收到ACK的数据时),可发送 。
- 禁用了Nagle算法时,可发送 。
ssthresh
。所以需要尽量避免超时重传 。拥塞控制:避免出现拥塞 。
拥塞控制算法包括慢启动、拥塞避免、拥塞发生(超时重传、快重传)、快恢复 。
这几种算法下面会介绍到 。
12.8.1 RTT和RTO计算RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起 , 超过这个时间便执行重传 。RTT和RTO 的关系是:由于网络波动的不确定性,每个RTT都是动态变化的,所以RTO也应随着RTT动态变化 。
12.8.1.1 RTT测量两种方法:
- 方法一:TCP Timestamp选项:TCP时间戳选项可以用来精确的测量RTT:RTT = 当前时间 -数据包中Timestamp选项的回显时间 。这个回显时间是该数据包发出去的时间,知道了数据包的接收时间(当前时间)和发送时间(回显时间),就可以轻松的得到RTT的一个测量值 。
- 方法二:选择一个指定SEQ的数据包,在发出时记录系统当前时间,在收到该SEQ的ACK后,用当前时间 减 发出时的时间就是本次RTT 。
假设每次实测的RTT值为SampleRTT 。
估计RTT值为EstimatedRTT 。
TCP会通过多次SampleRTT来维护EstimatedRTT 。
算法:
EstimatedRTT = (1-a)* EstimatedRTT + a * SampleRTT
。- 其中a通常取值为0.125
RTO = 2 * EstimatedRTT
由于新测量SampleRTT的权值只占EstimatedRTT的12.5%(通常情况下),当实际RTT变化很大的时候,即便测量到的SampleRTT变化也很大,但是所占比重小,最后EstimatedRTT的变化也不大,从而RTO的变化不大,造成RTO过?。?容易引起不必要的重传 。因此对RTT的方差跟踪则显得很有必要 。
在TCP规范中定义了RTT偏差DevRTT,用于估算SampleRTT一般会偏离EstimatedRTT的程度:
DevRTT = (1-B) * DevRTT + B * |SampleRTT - EstimatedRTT|
- 其中B的推荐值为0.25,当RTT波动很大的时候 , DevRTT的就会很大 。
RTO = EstimatedRTT + 4 * DevRTT
。在[RFC 6298]中,推荐初始超时重传时间为1秒,当出现超时后,超时重传时间将以指数退避的方法加倍,以免即将被确认的后继报文段过早出现超时 。
12.8.2 慢启动在设备启动往网络上发送数据时,并不知道网络状况,所以进行试探,发少量数据在逐步增加数据量 。
慢启动为发送方的 TCP增加了另一个窗口:拥塞窗口 (congestion window),记为cwnd 。
拥塞窗口初始化为1个报文段(1个MSS) 。每收到一个报文段的ACK , 拥塞窗口就增加大一个报文段 。收到两个,就增大两个 。
文章插图
12.8.3 拥塞避免当拥塞窗口增大到慢开始上门限值
ssthresh
时,就开始拥塞避免算法 。每次只增加一个报文段 。文章插图
12.8.4 拥塞发生当网络出现拥塞,也就是会发生数据包重传 , 而重传机制主要有两种:
- 超时重传 。
- 快速重传 。
推荐阅读
- vulnhub靶场之DOUBLETROUBLE: 1
- 亚索怎么玩呢(亚索大招怎么才能释放)
- 如何打好亚索(亚索的打法技巧)
- 无期迷途钻石获取途径有哪些
- 传奇九层妖塔祖玛阁怎么走(传奇祖玛阁攻略)
- 【深入浅出 Yarn 架构与实现】2-4 Yarn 基础库 - 状态机库
- 【Azure API 管理】Azure APIM服务集成在内部虚拟网络后,在内部环境中打开APIM门户使用APIs中的TEST功能失败
- DNF里浓缩的异界精髓怎么获得(浓缩的异界精髓作用)
- 小孩沉迷手机网络游戏怎么办(儿童玩手机游戏沉迷怎么办)
- 带你了解NLP的词嵌入