TCP 连接建立,断开过程

TCP的三次握手是建立TCP连接的过程,下面是TCP连接三次握手和断开四次挥手过程的状态机流程图:

sequenceDiagram
    participant Client
    participant Server

    Client->>Server: SYN
    Server-->>Client: SYN+ACK
    Client->>Server: ACK
    Client->>Server: 数据传输

    Client->>Server: FIN
    Server-->>Client: ACK
    Server-->>Client: FIN
    Client->>Server: ACK   

状态说明:

  • CLOSED:初始状态,表示TCP连接未建立或已关闭。
  • SYN-SENT:表示主动发起连接的一方已发送连接请求(SYN)。
  • ESTABLISHED:表示TCP连接已建立,双方可以进行数据传输。
  • SYN-RECEIVED(同步已接收状态):表示被动接受连接的一方已收到连接请求,并发送了自己的连接请求。

SYN报文包含哪些信息?

  1. SYN报文是TCP三次握手过程中的一种特殊报文,用于建立TCP连接。它包含以下信息:
  2. 源端口号(Source Port):表示发送方的端口号,用于标识发送方的应用程序。
  3. 目标端口号(Destination Port):表示接收方的端口号,用于标识接收方的应用程序。
  4. 序列号(Sequence Number):表示发送方的序列号,用于标识发送方发送的数据字节流的起始位置。
  5. SYN标志位(Synchronize Flag):用于标识该报文是一个SYN报文,表示发送方请求建立连接。
  6. 窗口大小(Window Size):表示发送方的接收窗口大小,用于流量控制。
  7. 校验和(Checksum):用于检测报文的传输是否出现错误。
  8. 紧急指针(Urgent Pointer):在一些特殊情况下,用于指示报文中的紧急数据。
  9. 选项(Options):可选字段,用于包含一些额外的控制信息,如最大段大小(MSS)等。

什么是 TIME_WAIT 状态,为什么需要 TIME_WAIT 状态?时间是多久,为什么?

TCP断开连接涉及到四个状态,这些状态是在TCP的四次挥手过程中发生变化的。以下是TCP断开连接的状态:

  1. ESTABLISHED:表示TCP连接已经建立,双方可以进行数据传输。
  2. FIN-WAIT-1:表示主动关闭方(发送FIN的一方)发送了FIN报文,等待对方的ACK。
  3. FIN-WAIT-2:表示主动关闭方(发送FIN的一方)已经收到了对方的ACK,等待对方发送FIN报文。
  4. TIME_WAIT:表示双方都发送了FIN报文,并且收到了对方的FIN报文和ACK报文,等待一段时间后才关闭连接。
graph LR
    A((ESTABLISHED)) -- FIN --> B((FIN-WAIT-1))
    B -- ACK --> C((FIN-WAIT-2))
    C -- FIN --> D((TIME-WAIT))
    D -- ACK --> E((CLOSED))

TIME_WAIT 是 TCP 断开连接过程中的一个状态,用于确保双方连接的可靠关闭。在 TCP 的四次挥手过程中,主动关闭方发送最后一个 ACK 报文后,会进入 TIME_WAIT 状态。在该状态下,主动关闭方会等待一段时间,确保所有可能的延迟报文都能够被接收方处理。

TIME_WAIT 状态的存在有以下几个原因:

  1. 确保可靠的连接关闭:TIME_WAIT 状态允许被动关闭方接收到主动关闭方发送的最后一个 ACK 报文。如果主动关闭方立即关闭连接,而被动关闭方没有完全接收到该 ACK 报文,可能会导致被动关闭方无法确认连接已经关闭,从而导致数据丢失或不可靠的连接关闭。
  2. 防止旧的报文对新的连接产生影响:在 TIME_WAIT 状态期间,旧的连接信息仍然存在于网络中,这样可以确保任何延迟的报文段都不会与新的连接混淆。这是为了防止旧的连接信息对新的连接产生影响,从而保证连接的可靠性。
  3. 允许重发丢失的报文:在 TIME_WAIT 状态期间,如果被动关闭方没有收到主动关闭方发送的 ACK 报文,可以进行重传。这种情况下,TIME_WAIT 状态提供了一个机会,让被动关闭方在一定的时间窗口内等待重传的 ACK 报文。

通常情况下,TIME_WAIT 状态的持续时间为两倍的最长报文段寿命(Maximum Segment Lifetime,MSL)MSL 是一个网络参数,通常为 2 分钟(120 秒)。在这个时间内,确保旧连接的所有报文都能够被丢弃,并防止新的连接受到旧连接的影响。

CLOSE_WAIT状态什么时候出现

CLOSE_WAIT 状态出现在 TCP 连接关闭的过程中,表示被动关闭方(接收到主动关闭方的 FIN 报文)正在进行收尾工作,准备关闭连接:

  1. 主动关闭方发送 FIN 报文给被动关闭方,并等待被动关闭方的 ACK 报文。 被动关闭方接收到主动关闭方的 FIN 报文后,发送 ACK 报文作为确认,并进入 CLOSE_WAIT 状态。
  2. CLOSE_WAIT 状态下,被动关闭方可能还有未读取的数据需要处理。 被动关闭方读取完所有数据后,发送 FIN 报文给主动关闭方,进入 LAST_ACK 状态。 主动关闭方接收到被动关闭方的 FIN 报文后,发送 ACK 报文作为确认,进入 TIME_WAIT 状态。 CLOSE_WAIT 状态通常表示被动关闭方的应用程序没有及时读取所有接收到的数据,导致连接一直处于半关闭状态。这种情况下,被动关闭方的操作系统会维持 CLOSE_WAIT 状态一段时间,直到被动关闭方的应用程序读取完所有数据并关闭连接。如果应用程序长时间不读取数据或者没有正确关闭连接,CLOSE_WAIT 状态可能会持续较长时间,占用系统资源。

TCP 拥塞控制

TCP 拥塞控制是一种机制,用于在网络拥塞时控制数据的发送速率,以确保网络的稳定性和公平性。TCP 拥塞控制的主要目标是避免网络拥塞,减少数据丢失,并使网络资源能够被公平地共享。

TCP 拥塞控制采用以下几种算法和机制:

  • 慢启动:TCP 连接刚开始时,发送方会以较小的拥塞窗口(congestion window)开始发送数据,然后根据网络的反馈逐渐增加发送速率。这样可以防止网络突然拥塞而导致大量数据的丢失。
  • 拥塞避免:一旦连接进入拥塞状态,TCP 会进入拥塞避免阶段,以较慢的速率增加拥塞窗口的大小。在这个阶段,TCP 会根据网络的反馈动态调整发送速率,以避免进一步加剧网络拥塞。
  • 快速重传:当发送方接收到连续的重复确认应答(ACK),它可以推断出网络中的某个数据段丢失了。此时,发送方会立即重传丢失的数据段,而不必等待超时发生。
  • 快速恢复:与快速重传相结合,快速恢复算法用于在发生拥塞时快速恢复数据传输速率。通过将拥塞窗口减半,并进行拥塞避免算法的调整,TCP 可以更快地恢复到正常的传输速率。
  • 超时重传:如果发送方发送数据后在规定的时间内没有收到确认应答(ACK),就会认为数据丢失,并立即进行超时重传。