TCP可靠传输机制
TCP超时重传
如果网络异常救出出现超时或者丢包,TCP模块必须能够重传在超时时间内对方未收到的TCP报文段。
- TCP模块为每个TCP报文段维护一个重传定时器:该定时器在TCP报文段第一次被发送时启动,如果超时时间内没收到接收方的应答,TCP模块将重传TCP报文段,并重置定时器
- 如果超时,则进行重传,重新设置定时器
TCP拥塞控制
TCP模块的任务
- 提高网络利用率
- 降低丢包率
拥塞控制
其中拥塞控制,还有TCP的流量控制,这种控制机制都是为了TCP的可靠传输设置的,拥塞控制的任务是确保子网能承载所到达的流量。这是一个全局性问题,涉及到各方面的行为(刚兴趣可以自己去搜索下,这里就不做过多介绍)。
关于拥塞控制我们进行详细的讲解:
拥塞控制的反馈过程:
拥塞控制的最终受控变量是发送端向网络中一次连续写入的数据量,我们称为我们称为发送窗口。不过发送窗口最终以TCP报文段来发送数据,进而发送端口就限定了连续发送的TCP报文段的数量,如图所示,发送窗口被称为SWND,这些报文段的最大长度被称为MSS发送端需要合理的选择发送窗口,如果发送窗口太小,就会出现网络延迟现象,如果发送窗口过大,就容易导致网络拥塞。接收方可以通过接收通告收窗口来控制发送端的发送窗口,但是这看起来也不够,所以在发送端引入一个称为拥塞窗口的状态变量,拥塞窗口简称CWND,接收通告窗口简称RWND。图像中就显示了拥塞控制的闭环反馈控制。
###几种拥塞控制的方法:
- TCP慢启动
- 拥塞避免
- 快速重传
- 快速恢复
慢启动,拥塞避免图:
我们知道那个发送端维持一个拥塞窗口的状态变量,拥塞窗口简称CWND,拥塞窗口的大小取决于网络的拥塞程度,并且动态的变化。CWND的处理原则就是只要网络中没有出现拥塞现象,拥塞窗口就在大一些,以便把更多的分组发送出去。只要网络中出现拥塞,拥塞窗口就减少一些。以减少注入到网络分组中的数量。
我们现在来分析拥塞控制的算法:
慢启动:当主机开始发送数据时,如果把大量的字节注入到网络,那么就有可能引起网络拥塞。因为我们现在并不清楚网络的负载情况。所以比较好的方法就是自动去探测一下,由小到大满满增大拥塞窗口的数值,通常在刚刚开始发送报文段的时候,先把拥塞端口设置为一个最大报文段,而在每个在收到新的报文段的时候,把拥塞窗口的大小加1,按照指数规律增长,也就是增大一个最大报文段的数值。我们用同样的方法逐渐增大发送端的拥塞窗口。可以使分组注入到网络中的数据更加合理。
对应到图示中,横坐标从0->3都是满启动的状态。我们为了防止因为增大造成的网络拥塞,我们还需要设置一个满启动的ssthresh值,关于慢启动的ssthresh用法就是如果拥塞窗口小于ssthresh值,就应用慢启动算法。如果拥塞窗口大于ssthresh值,就停止应用慢启动算法。而改用拥塞避免算法
拥塞避免:拥塞避免算法为了让拥塞窗口缓慢的增长,就是每经过一个往返的时间,就把发送方的拥塞窗口加1,而不是成倍增长,这样拥塞窗口是按照线性规律缓慢增长。对应到图像中就是那个明显的拐点以后,都是拥塞避免的算法执行。
仅仅应用 慢启动和拥塞控制,不可能达到控制网络拥塞
接下来介绍快速重传,快速恢复
在很多情况下,TCP发送端都可以接受到重复的确认报文段,例如TCP报文段缺失等等,发送端如果连接接收到三个重复的确认报文段,就可以判断网络中发生了拥塞。这个时候使用快速重传,快速恢复算法。快速重传算法我先要求接受端每收到一个失去的报文到,就立即发送重传确认。
拥塞发生或有三个处理不步骤:
拥塞发生后的处理过程:
- 收到三个重复的确认处理过程:当收到三个重复的报文段时,重新计算满启动的ssthresh值,就是将ssthresh值减半,然后立即重传重传报文段。
- 收到1个重复确认处理过程:将慢启动的ssthresh值减半后,开始执行拥塞避免算法,而不是刚刚提到的慢启动算法。
- 收到新数据后的处理过程:重新设置慢启动的ssthresh值,使得拥塞窗口等于当前设置的ssthresh值。