一、前言
因为在TCP发送的报文段是交给 IP层(可以理解为网络层)传送的。但是IP层只能提供最大努力服务,就是并不能保证传输的可靠(错误、丢包)。所以我们可以使用一些可靠传输协议,来处理出错、丢失、乱序等问题。
可靠的传输协议包含:
- 停止等待协议
- 连续ARQ协议
- 选择重传ARQ
二、停止等待协议
就是每发送完一个分组就停止放松,等待对方的确认,在收到确认后在发送下一个分组。
工作原理
这种方式简单来说就是 发送方A发一个,接收方B接一个并且给A应答,但是传输过程会有这几种情况:
- A发M1给B,B没收到,A超时重传M1,直到收到M1的ACK为止
- A发M1给B,B收到了,但是B的ACK丢了,A超时重传M1,直到收到M1的ACK为止
优缺点
- 优点:比较简单 。
- 缺点:通信信道的利用率不高,也就是说,信道还远远没有被数据比特填满。
为了克服这一缺点,就产生了另外两种协议,即连续 ARQ 和选择重传 ARQ。
三、连续ARQ协议
以字节为单位做窗口滑动,这个协议会连续发送一组数据包,然后再等待这些数据包的ACK。
工作原理
在发送方和接收方之间各自维持一个滑动窗口,发送发是发送窗口,接收方是接收窗口,而且这个窗口是随着时间变化可以向前滑动的。它允许发送方发送多个分组而不需等待确认。TCP的滑动窗口是以字节为单位的。
特殊情况
A发送了包1-10给B,在传输过程中可能会存在以下几种情况:
- 1)发送方数据报丢包
- 2)接收方ack报丢包
- 3)未按序到达接收方
1)发送方数据报丢包
2)接收方ack报丢包
3)未按序到达接收方
滑动窗口机制中的协议
- 停等协议:每一条数据收到回复后才传输下一条数据(适用:网络极差环境)
- 回退n步协议:从丢包位置开始,往后的数据均进行重新传输(不管后面数据是否已经收到了响应的回复)(适用:网络环境一般的情况)
- 选择重传协议:丢包数据单个重传(适用:网络情况较好的情况)
重传机制
在 TCP 协议中,因为网络不可信,不仅会出现乱序,也会出现丢包的情况。当出现丢包时,需要重传。在 TCP 中通过三种方案实现。
- 基于时间的超时重传。每次数据通信都会设置一个超时,当在指定时间没有接收到对应 ACK 时,会触发重传。
- 基于累计 ACK 的快速重传。当重复收到相同的 ACK 3次,会触发快速重传机制。
- 由于 2 中,在一次 RTT 过程中至多只能重传一个数据包,在存在连续数据包丢失的场景中,需要重复2的过程。采用 SACK,ACK 可以包含额外信息。使得发送端在每个 RTT 时间内可以填补多个空洞。
注:由于 TCP options 最大的长度是40字节,那么其所表示的 SACK 的数量最多是4(4*8+2 = 34),同时由于 SACK 有些时候会和时间戳(占10字节)一起用,因此,此种情况下最多只有3个 SACK。
阻塞控制
开始发送数据时,不能知道当前网络环境,当网络环境比较差的时候,依旧发送大量数据,造成数据丢失,要求重传
慢开始 与 拥塞避免
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。
慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。如下图:
当然收到单个确认但此确认多个数据报的时候就加相应的数值。所以一次传输轮次之后拥塞窗口就加倍。这就是乘法增长,和后面的拥塞避免算法的加法增长比较。
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,改用拥塞避免算法。
当cwnd=ssthresh时,慢开始与拥塞避免算法任意。
拥塞避免算法让拥塞窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。如下图:
再次提醒这里只是为了讨论方便而将拥塞窗口大小的单位改为数据报的个数,实际上应当是字节。
快重传 和 快恢复
快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。如下图:
快重传配合使用的还有快恢复算法,有以下两个要点:
①当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
②考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。如下图:
补充知识
TCP报文段首部格式
捎带应答机制
接收方会对每一次收到的数据进行确认回复,但是每一条数据确认回复都只是报头中的一些信息(甚至可能回复的就是一个单纯的TCP报头)
那么我们如果在进行确认回复的时候,正好有数据需要发送給对方,那么将二者结合起来就可以节省时间了
延迟应答机制
在前面的滑动窗口机制中,滑动窗口的大小可能是一直变化的,那么对于缓冲区中的接收窗口来说,也是不断变化的,这几影响到对数据的吞吐量,并且由于数据大概率没有从缓冲区取出,接收窗口随着发送窗口大小调节变小,造成吞吐量变小,效率降低
机制:收到数据后,延迟一小会,多给上层取出数据的机会,上层取出,窗口大小可保持不变,就可以保证一个相对稳定的大的传输吞吐量
tcp连接如何保证高可用
回答:三次握手四次挥手、校验和、滑动窗口、消息重传、阻塞控制
参考:
- https://blog.51cto.com/u_14632688/2619963
- https://blog.csdn.net/qq_43669007/article/details/105440492