Skip to main content

11 TCP协议

TCP 包头格式

  • 顺序问题 ,稳重不乱;
  • 丢包问题,承诺靠谱;
  • 连接维护,有始有终;
  • 流量控制,把握分寸;
  • 拥塞控制,知进知退。

TCP 的三次握手

TCP 四次挥手

TCP 状态机

实现靠谱的协议

为了保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。为了保证不丢包,对于发送的包都要进行应答,但是这个应答也不是一个一个来的,而是会应答某个之前的 ID,表示都收到了,这种模式称为累计确认或者累计应答(cumulative acknowledgment)。

发送端的缓存里是按照包的 ID 一个个排列,根据处理的情况分成四个部分:

  • 发送了并且已经确认的
  • 发送了并且尚未确认的
  • 没有发送,但是已经等待发送的
  • 没有发送,并且暂时还不会发送的

接收端:

  • 接受并且确认过的。
  • 还没接收,但是马上就能接收的。
  • 还没接收,也没法接收的。

顺序问题与丢包问题

确认与重发的机制

超时重试:TCP 的策略是超时间隔加倍。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。

流量控制问题

发送方会定时发送窗口探测数据包,看是否有机会调整窗口的大小。当接收方比较慢的时候,窗口太小的时候,不更新窗口,直到达到一定大小,或者缓冲区一半为空,才更新窗口。

拥塞控制问题

通过窗口的大小来控制。LastByteSent - LastByteAcked <= min {cwnd, rwnd} 拥塞窗口和滑动窗口共同控制发送的速度。