TCP 如何保证可靠传输 之 ARQ 协议

TCP 相比于 UDP 提供的是 面向连接的、可靠的、字节流传输;

谈到 TCP 如何保证可靠传输这个问题,我们应该都知道的主要由以下几特点:

1、校验和(差错控制):

对首部和数据进行端到端校验

2、流量控制 :

连接双方都有固定大小的缓冲区,接收端只允许发送端发送自己缓冲区能存储的数据,当来不及处理时 就会提醒发送方 降低速率 (你发慢点,老子搞不赢),保证包不丢失。( 滑动窗口协议(连续ARQ协议)实现流量控制 )

3、拥塞控制 :

网络拥塞,较少数据发送

4、超时重传 :

发出包会,启动定时器,等待确认

其实,更细致的还有:

1、分割数据块

2、包编号、有序传输

3、接收端丢弃重复数据

4、ARQ协议

这个ARQ 协议可能有些陌生,那么,咱们就盘一下:

首先搞清楚一个关系:

  • ARQ 协议 是 自动重传请求协议

  • AQR 协议 是 停止等待协议

  • 停止等待协议 是属于 一种 ARQ 协议

  • 即 AQR 属于 ARQ

哈哈,是不是眼花了???

ARQ 协议 (自动重传请求 Automatic Repeat-reQuest)

基本原理: 每次发完一个分组,就停止发送,等待对方确认,确认收到后再发送下一个分组。

ARQ 协议 是 OSI 数据链路层和传输层的错误纠正协议之一,使用确认和超时两个机制,在不可靠服务的基础上实现可靠的信息传输。

AQR 协议 (停止等待 ARQ 协议)

1、无差错情况:

发送数据分组,需要得到接收方确认 ACK ,如果 一段时间 没有收到确认,那就重新发送,直到确认后再发下一个分组。

2、若接收方收到重复分组:

就自己丢掉吧,但任然要发送确认回复给发送方。

3、分组丢失和出现差错的情况:

当分组丢失 或 出现差错 的情况下,发送方都会超时重传分组

4、应答丢失 和 应答迟到 的情况:

TCP会给每个字节流都打上序号,用于判断该分组是否已经接收。

应答丢失:

    若接收方正确收到分组,并已经返回应答,但应答在返回途中丢失了。

    此时发送方也收不到应答,从而超时重传。紧接着接收方又收到了该分组。

    接收者根据序号来判断当前收到的分组是否已经接收,若已接收则直接丢弃,并补上一个确认应答。


应答迟到:

    若由于网络拥塞,接收方迟迟收不到发送方发送的应答,因此会超时重传。

    接收方收到该分组后,发现已经接收,便丢弃该分组,并向发送方补上确认应答。发送方收到应答后便继续发送下一个分组。

    但经过了很长时间后,那个失效的应答最终抵达了发送方,此时发送方可根据序号判断该分组已经接收,此时只需简单丢弃即可。

注:

每发送完一个分组,该分组必须被保留,直到收到确认应答为止。

必须给每个分组进行编号。以便按序接收,并判断该分组是否已被接收。

必须设置超时计时器。每发送一个分组就要启动计时器,超时就要重发分组。

计时器的超时时间要大于应答的平均返回时间,否则会出现很多不必要的重传,降低传输效率。但超时时间也不能太长。

优点:简单

缺点:信道利用率低、等待时间长

连续 ARQ 协议 (滑动窗口协议)

在ARQ协议发送方每次只能发送一个分组,在应答到来前必须等待。

而连续ARQ协议的发送者拥有一个发送窗口,发送者可以在没有得到应答的情况下连续发送窗口中的分组。

对应接收方 也有一个 接收窗口 ,接受者并不需要每收到一个分组就返回一个应答,而是连续按顺序接收之后,统一答复。

注:

1.接收者收到的字节会存入接收窗口,接收者会对已经正确接收的有序字节进行累计确认,发送完确认应答后,接收窗口就可以向前移动指定字节。

2.同一时刻发送窗口的大小并不一定和接收窗口一样大。

3.发送窗口的大小还受网络拥塞情况影响。当网络出现拥塞时,发送窗口将被调小。

    TCP标准并未规定未按序到达的字节的处理方式。
    但TCP一般都会缓存这些字节,等缺少的字节到达后再交给应用层处理。
    这比直接丢弃乱序的字节要节约带宽。

    TCP标准规定接收方必须要有累计确认功能。
    接收方可以对多个TCP报文段同时确认,但不能拖太长时间,一般是0.5S以内。

优点:提高信道利用率、容易实现、确认丢失不必重传

最后附上TCP头部结构图:

参考:

[1] https://blog.csdn.net/weixin_30552811/article/details/96375283

[2] https://blog.csdn.net/u010425776/article/details/55006347

[3] https://zhuanlan.zhihu.com/p/73506510