You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
*** New Reno
可以看出Reno的快速重传算法是针对一个包的重传情况的,然而在实际中,一个重传超时可能导致许多的数据包的重传,因此当多个数据包从一个数据窗口中丢失时并且触发快速重传和快速恢复算法时,问题就产生了。因此NewReno出现了,它在Reno快速恢复的基础上稍加了修改,可以恢复一个窗口内多个包丢失的情况。具体来讲就是:Reno在收到一个新的数据的ACK时就退出了快速恢复状态了,而NewReno需要收到该窗口内所有数据包的确认后才会退出快速恢复状态,从而更一步提高吞吐量。
流控制是通过发送方的 =SWS= 实现的,流控制有两个方面:流量控制和拥塞控制。
流量控制的相关变量是接收方给发送方的 =AdvWin=,拥塞控制的相关变量是发送方的 =CongWin=。
这两个量决定发送方的 =SWS=,即
SWS = min(AdvWin,CongWin)。** 流量控制
流量控制是为防止发送方发的太快,耗尽接收方的资源,从而使接收方来不及处理。
方法:
** 拥塞控制
#+attr_org: :width 600px
[[file:tcp_congestion_control.png]]
*** 表现
*** 发送端如何知道
*** TCP 拥塞控制
超时或收到 3 个重复ack就认为丢包了,看作拥塞发生了。
TCP协议通过减少发送速率来控制拥塞。发送速率与发送窗口大小有关:
发送速率 rate = SWS(Sending Window Size)/RTT引入 拥塞窗口变量 CongWin来 限制SWS :
SWS = Min(CongWin, AdvWin)TCP 拥塞控制方法都是改变
CongWin的。*** 慢启动——Tahoe 算法
#+begin_example
假设Tahoe算法被用于TCP连接的拥塞控制, 当超时发生时, CongWin等于16MSS, 如果期间没有发生超时,在5个RTT之后CongWin是多少?
Answer:
10MSS
Explanation:
2mss,4Mss,8mss,9mss,10Mss
#+end_example
*** 拥塞避免——加性增乘性减(Additive Increase Multiplicative Decrease ,AIMD)
#+begin_example
Answer:
5MSS 9MSS
#+end_example
乘性减,若是超时引起,则 CongWin 从 1MSS 开始,并重新进行慢开始阶段。若是重复 ACK 引起,则进行快速重传流程。拥塞避免对超时反应比较强烈。
从整体上来讲,TCP 拥塞控制窗口变化的原则是 AIMD 原则,即加法增大、乘法减小。可以看出 TCP 的该原则可以较好地保证流之间的公平性,因为一旦出现丢包,那么立即减半退避,可以给其他新建的流留有足够的空间,从而保证整个的公平性。
*** 快速重传与快速恢复——Reno算法
快速重传:
后来的“快速恢复”算法是在上述的“快速重传”算法后添加的,当收到 3 个重复 ACK 时,TCP 最后进入的不是拥塞避免阶段,而是快速恢复阶段。快速重传和快速恢复算法一般同时使用。快速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,只有当“老”数据包离开了网络后,才能向网络中发送一个“新”的数据包,如果发送方收到一个重复的 ACK,那么根据 TCP 的 ACK 机制就表明有一个数据包离开了网络,于是 cwnd 加 1。如果能够严格按照该原则那么网络中很少会发生拥塞,事实上拥塞控制的目的也就在修正违反该原则的地方。
快速恢复:
#+begin_example
假设Reno算法(快速恢复算法)被用于TCP连接的拥塞控制, 当收到三个重复的ACK时, CongWin等于16MSS, 如果期间没有发生超时,在5个RTT之后CongWin是多少?
Answer:
13MSS
Explanation:
9MSS,10MSS,11MSS,12MSS,13MSS
#+end_example
*** New Reno
可以看出Reno的快速重传算法是针对一个包的重传情况的,然而在实际中,一个重传超时可能导致许多的数据包的重传,因此当多个数据包从一个数据窗口中丢失时并且触发快速重传和快速恢复算法时,问题就产生了。因此NewReno出现了,它在Reno快速恢复的基础上稍加了修改,可以恢复一个窗口内多个包丢失的情况。具体来讲就是:Reno在收到一个新的数据的ACK时就退出了快速恢复状态了,而NewReno需要收到该窗口内所有数据包的确认后才会退出快速恢复状态,从而更一步提高吞吐量。
这个算法是Reno算法的改进,没有使用SACK机制
*** SACK
SACK就是改变TCP的确认机制,最初的TCP只确认当前已连续收到的数据,SACK则把乱序等信息会全部告诉对方,从而减少数据发送方重传的盲目性。比如说序号1,2,3,5,7的数据收到了,那么普通的ACK只会确认序列号4,而SACK会把当前的5,7已经收到的信息在SACK选项里面告知对端,从而提高性能,当使用SACK的时候,NewReno算法可以不使用,因为SACK本身携带的信息就可以使得发送方有足够的信息来知道需要重传哪些包,而不需要重传哪些包。
*** 重新分组
当 TCP 超时并重传时,它不一定要重传同样的报文段。相反,TCP 允许进行重新分组而发送一个较大的报文段,这将有助于提高性能(当然,这个较大的报文段不能够超过接收方声明的 MSS)。
The text was updated successfully, but these errors were encountered: