TCP协议

1. TCP 数据包

TCP数据包主要由报头和数据(可选)组成,其报头长度在20B-60B,具体结构如下图:

TCP 数据包

2. TCP 三次握手

TCP连接需要进行三次握手的目的是建立可靠的通信通道,需要确认发送方和接收方的收发都是正常的。

  1. 第一次握手:client什么都不能确认;server确认自己接收正常,client发送正常
  2. 第二次握手:client确认自己接收正常和发送正常,server接收正常和发送正常;server确认自己接收正常,client发送正常
  3. 第三次握手:client确认自己接收正常和发送正常,server接收正常和发送正常;server确认自己接收正常和发送正常,client接收正常和发送正常

TCP 三次握手

3. TCP 四次挥手

TCP断开连接需要进行四次挥手,原因在于TCP建立的连接是双向通道,双方之间既可以向对方发送数据也可以接收对方发送的数据,相当于是建立了两条单向通道,当一方发起断开连接的请求并受到对方的确认后会进入半关闭状态,需要等到另一方发送完数据并发出释放连接的请求,释放请求确认后才能完全关闭TCP连接。

TCP 四次挥手

4. TCP 如何保证传输可靠

  1. 应用数据被分割成TCP认为最适合传输的数据块
  2. TCP对发送的每一个数据包进行编号,接收方对收到的数据包进行排序,然后就有序的数据包交给应用层处理
  3. 校验和:TCP计算报头和数据的校验和,并将其放在报头中一起发送,接收方对收到的数据进行校验,如果校验出错则会丢弃这个数据包并不确认收到这个数据包
  4. TCP接收端会丢弃重复的数据
  5. 流量控制:TCP使用大小可变的滑动窗口协议来进行流量控制,每一方都有固定大小的缓存空间,双方只接受缓存空间内容纳的数据。
  6. 拥塞控制机制:当网络拥塞时,减少数据发送
  7. ARQ协议:每发送一个分组就停止发送,等待对方发送确认。收到确认后再发送下一个分组。
  8. 超时重传:TCP每个发送一个段就启动一个计时器,当超过时间未收到确认就重传该段。

4.1 ARQ 协议

自动重传请求通过确认和超时两个机制在不可靠服务的基础上实现可靠的信息传输。

  1. 停止等待ARQ协议

    • 基本原理:每发送完一个分组就停止发送,等待收到对方的收到确认后再发送下一个分组,超时未收到确认则重新发送此分组
    • 接收方收到重复的分组直接丢弃并发送收到确认
    • 确认丢失:确认信息在传输过程中丢失,发送方重发分组,接收方丢弃分组并发送确认
    • 确认迟到:确认信息在传输过程中迟到,发送方重发分组,接收方丢弃分组并发送确认,发送方丢弃重复的确认信息
  2. 连续ARQ协议

    • 发送窗口:发送发维持一个发送窗口,发送窗口内的分组都可以发送而不必等待对方的确认消息
    • 累积确认:接收方对按序到达的最后一个分组发送确认,表明到这个分组为止所有分组都已正确收到
    • 回退N:不能向发送方反映接收方已收到的所有分组信息,若丢失则需要重新发送丢失的分组

4.2 滑动窗口和流量控制

TCP利用滑动窗口来实现流量控制。流量控制是为了控制发送方的发送速率,保证接收方来得及接收。TCP报头的窗口字段可以用来控制发送方的窗口大小,设置为0则发送方不能发送数据。

4.3 拥塞控制

拥塞控制是为了防止过多的数据注入到网络中,使得网络中的路由器或链路过载。拥塞控制是一个全局的过程,涉及网络中的所有主机,路由器,以及其他与降低网络传输有关的因素。
流量控制是对点到点通信量的控制,解决的是端到端的问题,即抑制发送方的发送速率使得接收方来得及处理收到的数据。

为了进行拥塞控制,TCP 发送方要维护一个拥塞窗口(cwnd)的状态变量,拥塞窗口的大小取决于网络的拥塞程度,是动态变化的。发送方让自己的发送窗口为拥塞窗口和接收方的接收窗口中较小的一个, 即 发送窗口 = min(拥塞窗口,接收方接收窗口)

TCP 拥塞控制采用了以下四种算法,慢开始、拥塞避免、快重传和快恢复。

4.3.1 慢开始

从小到大逐渐增大拥塞窗口,每经过一个传播轮次,cwnd加倍,cwnd = cwnd * 2

4.3.2 拥塞控制

让拥塞窗口逐渐增大,每经过一个往返时间RTT就将拥塞窗口加1,cwnd = cwnd + 1

4.3.3 快重传和快恢复

快重传和恢复(FRR)能迅速恢复丢失的数据包。一般情况下,如果数据包丢失了,TCP会启用计时器来要求传输暂停,暂停期间没有新的或复制的数据发送。

有了快重传和快恢复,接收方在收到一个不按顺序的数据段,它会立刻给发送方发送一个重复确认,如果发送方连续收到3个重复确认,它会假定重复确认指出的数据段丢失了,并立即重传这些丢失的数据段。

只有单独的数据包丢失时,快速重传和恢复能最有效地工作;当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。