TCP如何保证可靠传输

前面的话

TCP 有一个很大的特点就是提供可靠传输,这篇文章介绍TCP是如何提供的可靠传输。

停止等待协议
  • 基本原理:每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  • 在通知等待协议中,若接收方收到重复分组,就该丢弃该分组,但同时还要发送确认。

1)无差错情况:
在这里插入图片描述
发送方发送分组,接收方在规定时间内收到,并且回复确认。发送方收到确认后再次发送。

2)出现差错情况(超时重传):
在这里插入图片描述

  • 超时重传是指:只要超过一段时间仍然没有收到确认,就重传前面发送过的分组。因此每发送一个分组需要设置一个超时计时器,其重传时间比数据在分组传输的平均往返时间更长。
  • 在超时重传中的这种自动重传方式称为:自动重传请求ARQ。(下面再介绍)

3)确认丢失和确认迟到

  • 确认丢失:确认消息在传输过程中丢失
    在这里插入图片描述
    当A发送M1消息,B收到后,B向A发送了一个M1确认消息,但这个消息在传输中丢失了。在超时计时之后,A重传M1消息,B再次收到该消息后采取以下两点措施:
    1、丢弃这个重复的M1消息。
    2、向A发送确认消息

  • 确认迟到: 确认消息在传输中迟到
    在这里插入图片描述
    A发送M1消息,B收到并发送确认。A在超时时间内没有收到确认消息,A重传M1消息,B仍然收到并继续发送确认消息(B收到重复的M1后,直接丢弃重复的M1)。此时A收到了B第二次发送的确认消息。接着发送其他数据。过了一会,A收到了B第一次发送的对M1的确认消息。(A收到重复的确认后,直接丢弃)。

自动重传请求ARQ协议

上面提到过:在停止等待协议中的超时重传指只要超过一段时间仍然没有收到确认,就重传前面发送过的分组。因此每发送完一个分组需要设置一个超时计时器,其重传时间比数据在分组传输的平均往返时间更长一些。这种自动重传的方式称为自动重传请求ARQ

优点: 简单
缺点: 信道利用率低

连续ARQ协议

连续ARQ协议可以提高信道利用率。发送方维持一个发送窗口,凡是位于发送窗口内的分组可以连续发送出去,而不需要等待对方确认。接收方一般采用累计确认,对按序到达的最后一个分组发送确认,表明到这个分组为止的所有分组都已经正确收到了。

优点: 信道利用率高,容易实现,即使确认丢失,也不必重传。
缺点: 不能向发送方反映接收方已经正确收到的所有分组的信息。 比如:发送方发送了5条消息,中间第三条消息丢失,这时接收方只能对前面两个发送确认。发送方无法知道后三个分组的下落,而只好把后是三个全部重传一次。这也叫Go-Back-N(回退N),表示需要退回重传已经发送的N个消息。

滑动窗口

分为发送窗口接受窗口,通信双方同时拥有这两个窗口。

TCP中采用滑动窗口来进行传输机制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据。但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一个字节及发送方的滑动窗口大小。

流量控制

目的:控制发送方发送速率,保证接收方来得及接收
实现:TCP利用滑动窗口来实现流量控制

为什么需要流量控制?

双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。

如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。

接收方发送的确认报文中的窗口字段可以控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为0,则发送方不能发送数据。

流量控制过程
  • 首先双方三次握手,初始化各自的窗口大小,均为 200 个字节。假如当前发送端给接收端发送 100 个字节,那么此时对于发送端而言,当前的可用窗口减少了 100 个字节
  • 现在这 100 个到达了接收端,被放到接收端的缓冲队列中。不过此时由于大量负载的原因,接收端处理不了这么多字节,只能处理 40 个字节,剩下的 60 个字节被留在了缓冲队列中。注意了,此时接收端的情况是处理能力不够用啦,你发送端给我少发点,所以此时接收端的接收窗口应该缩小,具体来说,缩小 60 个字节,由 200 个字节变成了 140 字节,因为缓冲队列还有 60 个字节没被应用拿走。因此,接收端会在 ACK 的报文首部带上缩小后的滑动窗口 140 字节,发送端对应地调整发送窗口的大小为 140 个字节。
  • 此时对于发送端而言,已经发送且确认的部分增加 40 字节,也就是 SND.UNA 右移 40 个字节,同时发送窗口缩小为 140 个字节。
拥塞控制

拥塞控制和流量控制不同,前者是一个全局性的过程,涉及所有的主机、路由器、以及与降低网络传输性能有关的所有因素。而后者是点对点通信量的控制。 在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫拥塞。

为了进行拥塞控制,TCP发送方要维持一个拥塞窗口(cwnd)的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。 发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。

TCP的拥塞控制采用的四种算法:慢开始、拥塞避免、快重传和快恢复。

  • 慢开始: 慢开始算法的思路:是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口cwnd的数值。cwnd初始值为1,没经过一个传播轮次,cwnd加倍。(指数增加,当加到一定值(慢启动阈值)停止,接下来该拥塞避免了)

  • 拥塞避免: 拥塞避免的算法思路是:让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发送方的cwnd加1。

  • 快速重传: 在 TCP 传输的过程中,如果发生了丢包,即接收端发现数据段不是按序到达的时候,接收端的处理是重复发送之前的 ACK。比如第 5 个包丢了,即使第 6、7 个包到达的接收端,接收端也一律返回第 4 个包的 ACK。当发送端收到 3 个重复的 ACK 时,意识到丢包了,于是马上进行重传。如果发送机接收到三个重复确认,它会假定确认件指出的数据段丢失了,并立即重传这些丢失的数据段。

  • 快速恢复:当发送端收到三次重复 ACK 之后,发现丢包,觉得现在的网络已经有些拥塞了,自己会进入快速恢复阶段。在这个阶段,发送端如下改变:
    ssthresh值降低为 cwnd 的一半,并不重新开始,而是直接进行拥塞避免,让cwnd逐渐加一

注意: 下面的图中可以看到,超时事件(真正的网络拥塞)才会重新从慢开始进行,如果是由于某个包丢失导致的超时,就会开启快重传与快恢复(不是重新慢开始)。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值