TCP协议之确认应答机制和超时重传机制

TCP 是什么

TCP 为传输控制协议,在传输的过程中,主要保证数据的可靠性

TCP 的三个特点

  • 有连接
  • 可靠性
  • 面向字节流

TCP 协议包

TCP协议之确认应答机制和超时重传机制

  • 目的端口:解包
  • 4位首部长度:分用
  • ACK:确认号是否有效
  • SYN:请求建立连接
  • 检验和:检验数据的正确性
  • 紧急指针:标识哪部分数据是紧急数据

什么是可靠性?

  1. 数据没有发生错误
  2. 主机A知道主机B是否收到了数据
  3. 如果主机B接收到了数据,确保数据是有序的
  4. 如果主机B接收到主机A重复的数据,主机B是知道的,并且丢掉重复数据

怎么保证可靠性?

1. 校验和机制

  • 校验和的出现主要是为了检验数据的正确性
  • 校验和是将源数据根据哈希算法得到新的一串数据
  • 源数据差一点,通过校验和得到的新数据差距很大,避免冲突
  • 将校验和得到的数据解密后与原串比较,如果相同,则数据传输正确,不同,数据传输错误

2. 序号、确认序号

序号SN

  • 发送方发送数据时会带着一个序号
  • 如果发送多个数据,每个数据都会带着一个序号
  • 初始序号是随机的,为了防止网络攻击

确认序号ASN

  • 由于数据的长度不同或者传输网络不同,先发送的数据不一定先到达,也就是说,接收方接收到的数据可能是乱序的
  • 接收方收到数据后,是知道数据所带着的序号的,根据序号给出确认序号(告诉发送方下次给我发的序号),发送给发送方,发送方就知道接收方收到了哪些数据TCP协议之确认应答机制和超时重传机制

3. 确认应答机制

主机B收到主机A发送的数据后,会给主机A回一个 ack,表示我收到了你的数据,并且向主机A发送ASN,告诉主机A我希望你下次发送的序号

实际上来说,一个 TCP 的通信过程中,只有第一个 Segment 的 ACK 没有置为 1,其他全部含有 ACK 含义
TCP协议之确认应答机制和超时重传机制

4. 超时重传机制

在上述通信过程中,主机A如果没有接收到主机B的应答会怎么办?可能是主机A在发送的途中丢包了,也有可能主机B回主机A的途中丢包了
TCP协议之确认应答机制和超时重传机制

  • 主机A在给主机B发送数据的时候丢包了

  • 由于 TCP 是可靠的,丢包了他不会不管,主机A在接收主机B的应答时会等一段时间(估计数据到B的时间+B应答过来的时间),如果过了这段时间,还没有收到主机B的应答,那么主机A就认为丢包了,就会将刚才的数据重新发送一次,再等一段时间,如果收到应答了,继续通信,如果还是没等到应答,继续发送一次,发送好几次之后,如果还没收到应答,可能是网络太拥堵或者B那边出问题了,主机A关闭连接
    TCP协议之确认应答机制和超时重传机制

  • 主机B在回应主机A的过程中丢包了

  • 主机A等了一段时间(估计数据到B的时间+B应答过来的时间)没有收到主机B的应答,主机A重新发送刚才的数据

  • 主机B接收到重复接收数据,因为有***,可以去重,于是主机B丢掉这次A发送来的数据,根据刚才记录的***再将应答发送给A

  • 如果A发了几次还是没收到B的应答,主机A关闭连接

超时指的就是超过了估计时间,重传就是将没有应答的数据再重新发送一次
超时的时间是变化的,比如第一次没有收到等待时间翻倍,第二次没收到,时间翻倍

发送缓冲区和接收缓冲区

TCP 有发送缓冲区和接收缓冲区

为什么有发送缓冲区?因为发送的数据可能需要重传,所以 TCP 需要暂时保存这些数据
为什么有接收缓冲区?因为数据可能是无序到达的,需要将数据暂存,最后按照序号排列
因为数据到达后,应用层不是立刻取走
TCP协议之确认应答机制和超时重传机制

  • 对 TCP 来说,数据发送成功,代表数据被写入到 TCP 协议栈的发送缓冲区中
    不代表发送到网络上,更不代表对方接收到了
  • 对接收方来说,如果接收缓冲区中有准备好(有数据且数据没有空洞)的数据,直接返回
    如果没有数据,应用层会一直阻塞,直到接收缓冲区中有准备好的数据