TCP连接保证可靠性的机制有确认机制、超时重传、拥塞控制。
1.确认机制
选择确认SACK 如果接收方收到了和前面的字节流不连续的字节快,如果这些字节的序号都在接收窗口之内,那么接收方就先收下这些数据,但要把这些信息准确地告诉发送方,使发送方不要再重复发送这些已收到的数据。
2.超时重传
超时重传TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段。
时间计算 报文段的往返时间RTT,加权平均往返时间RTTS(平滑的往返时间)
3.拥塞控制
拥塞是指在某段时间内,对网络的某一资源的需求超过了该资源所能提供的可用部分,网络的性能会变坏,这样就会产生拥塞
拥塞控制则是防止过多的数据注入到网络中,使得网络的路由器和链路过载,前提是现有的网络能够正常工作。
拥塞控制的方法:慢开始,拥塞避免,快重传和快恢复
(一)慢开始算法
发送方由小到大的逐渐增大发送窗口,实际上就是由小到大逐渐增大拥塞窗口数值。在开始发送报文段时,先把拥塞窗口大小设置为一个最大报文段MSS的数值(IW),以这样的方法逐渐增大拥塞窗口cwnd。每经过一个传输轮次(往返时间RTT),拥塞窗口cwnd就加倍
特别强调,慢开始的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞情况),然后再逐渐增大cwnd
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置设置一个慢开始门限ssthresh状态变量:
当cwnd<ssthresh时,使用慢开始算法;
当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
当cwnd=ssthresh时,使用慢开始算法或拥塞避免算法
(二)拥塞避免算法
让拥塞窗口cwnd缓慢增大,每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。(呈线性增长)
只要发送方没有按时就收到确认,即判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口值的一半(不小于2)然后把拥塞窗口cwnd重新设置为1,执行慢开始算法
“乘法减小”和“加法增大”:“乘法减小”指不论在慢开始阶段还是拥塞避免阶段,只要出现超时(可能出现拥塞),就把慢开始门限值ssthresh减半,即设置为当前的拥塞窗口的一半,同时开始执行慢开始算法。当网络频繁出现拥塞时,ssthresh值就下降得很快,以大大减少注入到网络的分组数。 “加法增大”指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止网络过早出现拥塞。上面两种算法合起来常称为AIMD
“拥塞避免”并非指完全能够避免拥塞,而是在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞
(三)快重传和快恢复
快重传算法
首先要求接收方每收到一个失序的报文段后就立即发出重复确认,目的是使发送方尽早知道有报文段没有到达接收方,而不是等待自己发送数据时才进行捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待为该报文段设置的重传计时器到期。结果是发送方能尽早重传未被确认的报文段
快恢复(与快重传配合使用)
(1)当发送方收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半。
(2)不执行慢开始算法,把cwnd值设置为慢开始门限ssthresh减半后的数值,接着执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢线性增大