TCP协议如何保证可靠性

我们都知道TCP是可靠的传输层协议,那么TCP是如何保证传输可靠的呢?
TCP确保传输可靠的方式主要有:
序列号
确认号
超时重传
快速重传
超时时间间隔加倍
GBN 协议与 SR 协议混合体的差错恢复机制
流量控制
拥塞控制

序列号:

报文段第一个数据字节的字节流编号。序列号对于在累计确认机制中扮演着重要作用。

确认号:

服务端在接收到客户端发送的报文时,会给客户端返回ACK确认号,这个ACK确认号的内容里存放的是服务端希望接受的下一段字节流的编号。
PS:序列号与确认号都是TCP的首部字段的重要内容,也是最重要的两个组成部分。对于保证TCP可靠传输起着重要作用。

超时重传:

在进行TCP传输时,由于确认应答与序列号机制,也就是说发送方发送一部分数据后,都会等待接收方发送的ACK报文,并解析ACK报文,判断数据是否传输成功。如果发送方发送完数据后,迟迟没有等到接收方的ACK报文,这该怎么办呢?而没有收到ACK报文的原因可能是什么呢?

首先,发送方没有接收到相应的ACK报文原因可能有两点:

1、数据在传输过程中由于网络原因等直接全体丢包,接收方根本没有接收到。
2、接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。

TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。简单理解就是发送方在发送完数据后等待一个时间,时间到达没有接收到ACK报文,那么对刚才发送的数据进行重新发送。如果是刚才第一个原因,接收方收到二次重发的数据后,便进行ACK应答。如果是第二个原因,接收方发现接收的数据已存在(判断存在的根据就是序列号,所以上面说序列号还有去除重复数据的作用),那么直接丢弃,仍旧发送ACK应答。

那么发送方发送完毕后等待的时间是多少呢?如果这个等待的时间过长,那么会影响TCP传输的整体效率,如果等待时间过短,又会导致频繁的发送重复的包。如何权衡?

由于TCP传输时保证能够在任何环境下都有一个高性能的通信,因此这个最大超时时间(也就是等待的时间)是动态计算的。

超时时间间隔加倍:

这里的超时时间间隔加倍也就是上面所说的动态计算超时时间。具体得策略就是,每超时一次,就把超时时间2,超时时间会以指数形式增加。
比如:在Linux中(BSD Unix和Windows下也是这样)超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。重发一次后,仍未响应,那么等待2
500ms的时间后,再次重传。等待4*500ms的时间继续重传。以一个指数的形式增长。累计到一定的重传次数,TCP就认为网络或者对端出现异常,强制关闭连接。

GBN 协议与 SR 协议混合体的差错恢复机制:

缓存失序但是正确接受的报文段,,TCP 至多重传失序的报文段N,如果对报文段 N+1 的确认在对报文段 N 的确认到达之前到达,TCP 甚至不会重传报文段 N)。
流量控制:
接收端在接收到数据后,对其进行处理。如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应,超时重传呀什么的。而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。
流量控制是为了防止接收方应用程序读取太慢,发送太快导致接受缓冲区溢出。(是一个速度匹配服务,即发送方发送速率与接收方应用程序读取速率相匹配)。
在TCP协议的报头信息当中,有一个16位字段的窗口大小。在介绍这个窗口大小时我们知道,窗口大小的内容实际上是接收端接收数据缓冲区的剩余大小。这个数字越大,证明接收端接收缓冲区的剩余空间越大,网络的吞吐量越大。接收端会在确认应答发送ACK报文时,将自己的即时窗口大小填入,并跟随ACK报文一起发送过去。而发送方根据ACK报文里的窗口大小的值的改变进而改变自己的发送速度。如果接收到窗口大小的值为0,那么发送方将停止发送数据。并定期的向接收端发送窗口探测数据段,让接收端把窗口大小告诉发送端。
在这里插入图片描述

主机 A 发送了还未被确认的数据量必须控制在 rwnd(主机 B 的空闲缓存)以内。当 rwnd 为 0 时,主机 A 不再给 B 发送数据,主机 B 也不会通知 rwnd 有更新。为此,TCP 规范要求,当 rwnd为 0 时,主机 A 再发送一个字节的数据的报文段给主机 B。
PS:16位的窗口大小最大能表示65535个字节(64K),但是TCP的窗口大小最大并不是64K。在TCP首部中40个字节的选项中还包含了一个窗口扩大因子M,实际的窗口大小就是16为窗口字段的值左移M位。每移一位,扩大两倍。

拥塞控制:

针对 IP 网络的拥塞而对发送方进行遏制。与流量控制的原因不同。提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性,这就是拥塞控制。
拥塞控制包括四部分:慢启动、拥塞避免、快速重传、快速恢复。
拥塞窗口(cwnd):一个发送方未被确认的数据量不会超过 cwnd 与 rwnd 的最小值。通过限制发送方未被确认的数据量来间接的限制发送速率。
何为拥塞:收到接收方三个重复(冗余)ACK 或者发生超时(更严重)。

慢启动:TCP传输的过程中,发送端开始发送数据的时候,如果刚开始就发送大量的数据,那么就可能造成一些问题。网络可能在开始的时候就很拥堵,如果给网络中在扔出大量数据,那么这个拥堵就会加剧。拥堵的加剧就会产生大量的丢包,就对大量的超时重传,严重影响传输。所以TCP引入了慢启动的机制,在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。
在慢启动阶段拥塞窗口将以指数增长。慢表示以一个比较慢的速度(1 个 MSS最大报文段长度)启动。当第一次出现拥塞时,设置慢启动阈值(ssthresh)为 cwnd/2。并将cwnd 重新设置为 1。
拥塞阈值:为了控制拥塞窗口的增长,不能使拥塞窗口单纯的加倍,设置一个拥塞窗口的阈值,当拥塞窗口大小超过阈值时,不能再按照指数来增长,而是线性的增长。
**拥塞避免:**即当 cwnd>=ssthresh 时,cwnd 不再以指数增长,而是以+1MSS 增长。(加性增)

快速重传:发送方在收到三个冗余 ACK 之后就重发这个丢失的报文段,而不再等到超时再重发这个丢失的报文段。

快速恢复:当出现丢包(3 个冗余 ACK 或者超时),cwnd = cwnd(发生丢包时的拥塞窗口)/2 + 3MSS。而不再将 cwnd 置位 1。(乘性减)。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值