TCP可靠传输机制

TCP协议

我们都知道,TCP是一个面向连接的可靠的网络传输协议,那么,我们今天谈一谈 TCP是如何实现可靠的网络传输
这里写图片描述

确认应答(ACK)机制

这里写图片描述
Tcp在发送数据的时候,给每个字节的数据都进行了编号,即每一段数据都由自己的序列号,每一个ACK都带有自己的确认序号,告诉发送者,我已经接收到了哪些数据,下次的数据应该从哪里开始发

超时重传机制

数据在发送的过程中有可能因为网络等问题,数据没有到达,发生丢包问题,如果在特定的时间间隔内,发送方未收到接收方所发来的确认序号,则进行重发
这里写图片描述
还有一种可能,发送方未收到接收方的确认应答,是因为ACK丢失了,此时接收方会收到很多重复的数据,TCP协议需要能够识别重复的包,并且将重复的包丢掉,此时前面的序列号就可以做到去重的效果。
超时的时间如何确定?
TCP环境报文往返时间不定、有很大差别

A、B在一个局域网络,往返时延很小

A、C在一个互联网内,往返时延很大

因此,A很难确定一个固定的、与B、C通信都适用的定时器时间
TCP采用了一种自适应算法。这种算法记录每一个报文段发出的时间,以及收到相应的确认报文段的时间。这两个时间之差就是报文段的往返时延。将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延T,动态的计算这个最大的超时时间。

滑动窗口

我们在之前的确认应答机制中了解到,发送端每发送一个数据段,接收端都要给一个ACK确认应答,发送方收到了这个确认应答才可以继续发送下一个数据段,这样做会导致其性能变差,尤其往返时间较长时。这样的发送方式性能较低,我们可以选择一次发送多条数据,这样就可以大大的提高性能。
下图是一个滑动窗口大小为4字节的图示
这里写图片描述

滑动窗口的目的?

在 TCP 中,滑动窗口是为了实现流量控制。如果对方发送数据过快,接收方就来不及接收,接收方就需要通告对方,减慢数据的发送。
注意:
1)窗口大小字段越大,说明网络吞吐量越高
2)接收端一旦发现自己的缓冲区快满了,就会将滑动窗口设置为一 个更小的值通知发送方
3)如果接收端缓冲区满了,就会将窗口置为0,这时发送端不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端
这里写图片描述
————

拥塞控制

在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做拥塞。 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的控制。
慢开始与拥塞避免
慢启动算法的思路:主机开发发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小。
这里写图片描述
拥塞避免:为了防止cwnd增加过快而导致网络拥塞,所以需要设置一个慢开始门限ssthresh状态变量(我认为他是一个拥塞控制的标识),它的用法:

               1. 当cwnd < ssthresh,使用慢启动算法,

               2. 当cwnd > ssthresh,使用拥塞控制算法,停用慢启动算法。

               3. 当cwnd = ssthresh,这两个算法都可以。

拥塞避免的思路:是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。
无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为设置为发送窗口的一半(>=2),cwnd(拥塞窗口)设置为1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长,比慢启动算法拥塞窗口增长块的多。

实例:1.TCP连接进行初始化的时候,cwnd=1,ssthresh=16。
2.在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh =cwnd时,就启动拥塞控制算法,拥塞窗口按照规律增长
3.当cwnd=24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh=12,(二分之一cwnd),设置cwnd=1,然后开始慢启动算法,当cwnd=ssthresh=12,慢启动算法变为拥塞控制算法,cwnd按照线性的速度进行增长。

快重传和快恢复

快重传算法:要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。
这里写图片描述
快恢复:
1. 当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。
2. 此时不执行慢启动算法,而是把cwnd设置为ssthresh的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值