TCP可靠传输再回顾

概述

总体来说TCP通过以下方式保证数据的可靠传输:

  • 确认重传
  • 数据校验
  • 数据分片和排序
  • 流量控制
  • 拥塞控制

数据校验

TCP校验和是一个端到端的校验和,由发送端计算,然后由接收端验证。其目的是为了发现TCP首部和数据在发送端到接收端之间发生的任何改动。如果接收方检测到校验和有差错,则TCP段会被直接丢弃。

数据分片

TCP会按MTU合理分片,接收方会缓存未按序到达的数据,重新排序后再交给应用层。

MTU(最大传输单元),是链路层中的网络对数据帧的一个限制。

MSS(最大分段大小),MSS是TCP里的一个概念(首部的选项字段中)。MSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。

回顾滑动窗口

滑动窗口协议

TCP采用滑动窗口协议来实现流水线传输。

为什么要使用滑动窗口协议

因为发送端希望在收到确认前,继续发送其它报文段。

发送方有一个发送窗口,发送窗口范围内的数据允许发送,随着接收方传来的确认信息,以及通知的接收窗口大小来动态调整发送窗口的起始位置以及大小。

在这里插入图片描述
发送窗口大小等于接收方提供的接收窗口的大小。

发送方会根据网络拥塞情况来动态调整发送窗口大小,前提是发送方发送窗口大小不大于接收方接收窗口大小。

窗口滑动的三种情况

  • 前沿向右移动,这种情况发生在数据发送并被确认时。
  • 情况发生在接收窗口增大或者网络拥塞情况缓解时。
  • 后沿向左移动,这种情况发生在接收方希望发送窗口缩小时,TCP标准强烈不建议出现这种情况。因为发送方在收到缩小窗口的通知时,可能已经发送了一些缩小部分的数据,容易造成错误。

TCP接收方有累计确认功能,接收方不必立刻对收到的数据进行确认,这样可以减少传输开销。

累积确认功能使得接收方只对按序到达的最后一个分组发送确认,表示这个分组之前的分组已经全部到达。

另外接收方不能够准确的通知发送方已经发送到接收方的数据分组。

例如:

序号5、6、7、9、10分组到达接收方,接收方发送的确认序号是8,接收方没有收到序号8的分组,希望下次收到序号8的分组。而序号9、10分组虽然已经到达的事实,发送方并不知晓。

这会导致一个问题:一旦发生超时重传的情况,发送方是否需要再次发送已经到达的数据呢。

这里引入了ARQ协议:滑动窗口协议 与 自动重传请求技术结合形成ARQ协议。

根据超时重发数据方式的不同分为后退N帧ARQ协议选择重发ARQ协议

后退N帧ARQ协议

在发生超时重传时,后退N帧ARQ协议不考虑确认序号之后的分组是否已经发送到接收方,直接从确认序号开始重传之后的数据。

在这里插入图片描述

选择重传ARQ协议

选择重传ARQ协议是指在接收方收到未按序排列的数据流时,通知发送方重传缺失的数据,而不是重传全部数据。TCP数据段首部中添加选择确认选项SACK可以实现该目的。

超时重传

为了管理TCP连接,引入了以下四个定时器:

  • 重传定时器:决定何时重传未被确认的数据分组。
  • 持续定时器:使窗口大小信息保持不断流动。避免死锁。
  • 保活定时器:检测空闲连接的另一端是否崩溃或重启。
  • 2MSL定时器:测量一个连接处于TIME_WAIT状态的时间。

流量控制

TCP连接建立时,接收方会在确认报文段中给出自己接收窗口的大小。在每次发送确认报文时能够根据情况动态调整接收窗口的大小,并将告知发送方。如下图所示:
在这里插入图片描述
流量控制简单来说就是接收方处理不过来的时候,就把窗口缩小,并把窗口值告诉发送端。

拥塞控制

拥塞控制是指防止过多的数据注入网络中,这样可以使网络中路由器或者链路不致过载。

TCP进行拥塞控制常用的算法有四种:慢启动、拥塞避免、快重传、快恢复

慢启动

发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。

发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减小一些,以减少注入到网络中的分组数。

慢启动算法:

通常在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。

每经过一个传输轮次,拥塞窗口 cwnd 就加倍。

在这里插入图片描述

拥塞避免

为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。

当 cwnd < ssthresh 时,cwnd以慢开始的方法指数增长;

当 cwnd > ssthresh 时,cwnd以拥塞避免的方法线性增长。

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认),就要把慢开始门限ssthresh设置为出现拥塞时的发送方窗口值的一半(但不能小于2)。然后把拥塞窗口cwnd重新设置为1,执行慢开始算法。

快重传

如果个别报文段在网络中丢失,网络并没有发生拥塞,这种情况下发送方收不到确认报文,在超时之后会重传该报文。发送方误以为网络发生拥塞,错误的启动慢开始算法,降低了传输效率。

采用快重传算法可以让发送方尽早知道个别报文段的丢失。快重传算法要求接收方不要延时发送确认,即使收到失序的报文段也要立刻发送对已收到报文的重复确认。

在这里插入图片描述

接收方收到M1之后发送对M1的确认报文,M2报文丢失,之后接收方收到M3、M4、M5时每次都发送对M1报文的重复确认。快重传算法规定当收到三次重复确认后,发送方就认为M2报文段丢失,立即重传M2报文段,而不用等待超时时再重传,这样可以避免发送方误认为网络发生拥塞。

快恢复

在快重传算法执行后,发送方知道只是丢失个别报文,而不是网络发生拥塞。之后并不会执行慢启动算法,而是执行快恢复算法:调整门限值ssthresh = cwnd/2,同时设置cwnd = ssthresh + 3 SMSS。从这里直接线性增长,这就是快速恢复。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值