TCP如何保证传输的可靠性?

TCP在传输数据的时候主要面临以下几个问题:

  1. 数据本身发生损坏;
  2. 数据重复发送;
  3. 数据丢失;
  4. 数据分片顺序混乱。

若想保证数据传输的可靠性,需要解决以上几个问题。具体解决方法体现为校验和、序列号、确认应答、重发控制、连接管理以及窗口控制机制实现可靠传输。

确认应答(ACK)

即发送端将数据发送给接收端,如果接收端返回一个ACK来确认应答则表明数据是被正常传输的。若未收到,发送端则无法与接收端建立一个完整的连接。
未收到ACK通常有两个原因,其一为数据本身发生了丢失,另外也可能是接收端已经收到了数据,但表示确认的应答在返回时发生了丢失。
但若在传输过程中出现数据丢失呢?
在这里插入图片描述
在这里插入图片描述
正常来说,为了解决这种丢失,发送端通常会重新给接收端发送相同的数据来完成数据传输,但若多个相同的数据包被重复发送给接收端,这将导致接收端反复收到相同的数据而无疑造成系统的浪费。
为此,引入了序列号机制,用来确定接收端是否已经接受数据以及是否需要再接受数据。

序列号

序列号具体实现为给发送数据的每一个字节都进行编号,接收端查询接收数据TCP首部中的序列号和数据的长度,将自己下一步应该接收的数据序号发送出去,通过序列号及确认应答号,TCP可以实现可靠传输。
在这里插入图片描述
若出现了数据丢失,发送端进行数据重发,如何确定重发时间?

重发超时

即在重发数据之前,等待接收端确认来到的时间间隔。在Unix和Windows中通常以0.5秒的整数倍作为一个时间间隔,在重发侯仍然得不到确认时,等待确认的时间将以2、4倍的指数函数延长。当然,数据也不会一直重发,当重发到达一定次数后,就会判断出现异常,而断开连接。

连接管理

TCP是一种面向有连接的通信传输,即在数据传输开始之前就做好连接的工作。TCP在建立连接时,发送端会先给接收端发送一个SYN包,用来向接收端建立连接的请求,此外在通信结束时,会通过发送断开连接的包(FIN)来进行断开。(三次握手,四次挥手)
在这里插入图片描述

以段发送数据

在发送数据的过程中,TCP会将数据划分为合适的段,即最大消息长度
在这里插入图片描述

滑动窗口

不需要每发送一个段,接收方就返回一个ACK,而是连续发送多个段(窗口大小个段)
在这里插入图片描述

窗口控制与重发控制

在使用滑动窗口时,如果出现了数据丢失的情况,应该怎么办?
在这里插入图片描述
在这里插入图片描述

滑动窗口实现流量控制---->提升传输速度

在使用滑动窗口时,接收端因收到无用数据包或者因为处理一些其他问题而导致无法完全处理发送端发送来的数据,触发重发机制从而导致网络流量的无端浪费。
因此TCP提出了流控制,用来使接收端永远只接收到自己能接收的数据量范围,这个范围即滑动窗口大小,即滑动窗口大小会随着实际接收端接受数据的能力而改变。
TCP首部中专门有一个字段用来通知窗口大小,正常来说即接收端缓存区(暂时存放客户端发送数据)大小,当缓存区数据发生溢出现象时则接收端会在TCP首部存放一个更小的值来控制发送端发送的数据量,从而实现流量控制。在这里插入图片描述

拥塞控制

为了适应网络可能出现的拥堵现象,TCP通过慢开始拥塞避免快重传快恢复算法来进行拥塞控制。在这里插入图片描述
慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况。经验表明,较好的方法是先探测一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值。cwnd初始值为1,每经过一个传播轮次,拥塞窗口加倍。
在这里插入图片描述
拥塞避免算法的思路是让拥塞窗口缓慢增大(如图中缓慢上升的曲线),即每经过一个往返时间RTT就把发送放的cwnd加1.
快重传即上文所述 重发控制:当发送端接受到接收端发来的三个相同的确认,则启动快速重发机制;

总结而言,TCP保证可靠性的手段为:

  • 应用数据被分割成 TCP 认为最适合发送的数据块;
  • TCP 给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
  • 校验和: TCP 将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP 将丢弃这个报文段和不确认收到此报文段。
  • TCP 的接收端会丢弃重复的数据。
  • 流量控制: TCP 连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。TCP 使用的流量控制协议是可变大小的滑动窗口协议。 (TCP 利用滑动窗口实现流量控制)
  • 拥塞控制: 当网络拥塞时,减少数据的发送。
  • ARQ协议: 也是为了实现可靠传输的,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。
  • 超时重传: 当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值