对超时重传、滑动窗口、拥塞控制的简单认识
我们之前说过TCP对于数据的可靠传输可以做到:
- 数据准确的到达对端
- 数据到达后是有序的
- 数据不失真
这也就是为什么说TCP是可靠的连接,而UDP是不可靠的连接。
因为TCP拥有一些对于异常情况的处理机制来保证自身数据的可靠传输,这里我们就来看一下都有些什么机制:
- TCP重传机制
- TCP滑动窗口
- TCP的拥塞控制
接下来,我们对其依次进行详细的分析:
一:TCP重传机制
TCP需要保证所有的数据包都能准确到达对端,所以必须要有重传机制。
例如:发送端发送了1,2,3,4,5一共5个包,接收端获取了1,2,所以反馈了ACK=3(证明1,2全部接收到了),然后,4比3传输的快,接收端再接收到了4,这时3还没有传输到,那么此时的TCP会怎么办呢?
注意:接收端反馈给发送端的ACK只能确认最后一个连续的包。
我们要知道,ACK不能跳着确认,比如这个时候3没有接收到,只接收到了4,但是我们不能反馈ACK=5给接收方,因为这个ACK只能确认最大的连续接收到的包,所以不能跳过3单独反馈确认4,不然发送端会认为之前的3同样也被接收到了。
这里有两种重传机制可以处理这个问题:
第一种:超时重传机制
思想是:现不着急反馈ACK,并且死等3,当发送方发现收不到3的ACK,一定时间后,会重新将3发送一遍。这时,如果接收方接收到了3,会直接反馈ACK=5,因为ACK不能跳着确认,则这时证明3和4都收到了。
但是这种方法也有弊端,那就是需要死等3,导致就算接收方收到了4和5,但是发送方不了解情况,所以会认为4和5接收方是不是也没有接收到,所以可能会将4和5也重新发送一份。
那么对此有两种选择:(RTO:Retransmission RTO(TCP超时重传机制) ,是TCP操作计时器的一种。)
- 一种是只重传RTO超时的包,也就是重传3。
- 一种是将RTO后面的所有包全部重传,也就是重传3,4,5。
这两种选择,有利有弊,第一种无疑很节省网络资源,但是很慢,而第二种速度快,但是浪费带宽,而且有可能做了很多无用功。总体上来说都不是很好,因为都在等RTO时间,RTO有可能会很长。
所以我们这个时候就可以发现RTO时间的设置对于TCP重传机制非常的重要,那我们就来分析一下RTO的重要性,并且了解一下RTO是如何设置的。
RTO的重要性体现在:
- 设置过长,包丢了好久都没有发现,导致重发速度慢,效率低。
- 设置过短,可能由于网络拥堵的原因,包并没有丢失而是在路上堵住了,那么这个时候,由于RTO设置的时间过短,发送方马上就重新发送这个包,那么会导致网络变得更加的拥堵,更加的拥堵导致更多的包超时堵在路上,更多的包超时导致更多的重发,那么这就是典型的葫芦爷救娃娃了,非常浪费资源。
而且由于这个超时时间RTO在不同的网络下会设置不同的值,不能设置一个固定的值,只能动态的去设置。那么为了方便动态的设置这个超时时间RTO,所以TCP引入了RTT(Round Trip Time),发送端根据一个数