# 到底什么是 TCP 连接?

10 min read
Table of Contents

到底什么是 TCP 连接?

TCP 连接详解

【核心定义】

TCP 连接是通信双方在传输数据前,通过三次握手建立的、包含双方状态信息(如序列号、窗口大小等)的虚拟通信通道,确保数据传输的可靠性和有序性。

【关键要点】

  1. 面向连接的协议:TCP 在数据传输前必须建立连接,传输结束后必须释放连接,这与无连接的 UDP 形成鲜明对比。
  2. 全双工通信:连接建立后,双方都能同时发送和接收数据,每个方向都有独立的序列号和确认机制。
  3. 可靠的数据流:通过序列号、确认应答、重传机制、流量控制和拥塞控制,保证数据按序、无差错、不丢失、不重复地到达。
  4. 状态机管理:TCP 连接的生命周期由一系列状态(如 LISTEN、SYN-SENT、ESTABLISHED 等)定义,通过特定报文触发状态转换。

【深度推导/细节】

连接建立(三次握手)的必然性

核心矛盾:在不可靠的网络中,双方需要同步初始序列号(ISN)并确认对方通信能力,同时防止历史旧连接的重复报文造成混乱。

逻辑拆解:

  • Step 1 (SYN):客户端发送 SYN=1,seq=x(x 为客户端 ISN)。这表示客户端请求建立连接,并告知自己的初始序列号。
  • Step 2 (SYN+ACK):服务器收到后,发送 SYN=1,ACK=1,ack=x+1,seq=y(y 为服务器 ISN)。这表示:① 确认收到了客户端的 SYN(ack=x+1);② 同意建立连接(SYN=1);③ 告知自己的初始序列号(seq=y)。
  • Step 3 (ACK):客户端收到后,发送 ACK=1,ack=y+1。这表示确认收到了服务器的 SYN,连接建立。

为什么是三次,不是两次或四次?

  • 两次握手不足:如果客户端发出的 SYN 报文因网络延迟滞留,客户端超时重发新 SYN 并快速完成通信释放连接后,那个滞留的旧 SYN 可能才到达服务器。若只有两次握手,服务器会认为这是新的连接请求并建立连接,但客户端已不认此连接,导致服务器资源浪费。
  • 三次握手解决:在上述场景中,即使旧 SYN 到达,服务器回应 SYN+ACK,但客户端不会发出第三步的 ACK(因为客户端没有发起该请求),连接无法建立。第三次握手是客户端对服务器“同意建立连接”的最终确认,是防止已失效连接请求到达服务器的关键。
  • 四次握手冗余:服务器的 SYN 和对客户端 SYN 的 ACK 可以合并发送,无需拆成两步,三次已能保证双方通信能力和序列号同步得到双重确认。

连接释放(四次挥手)的复杂性

核心矛盾:TCP 是全双工的,每个方向必须独立关闭。一方发送完数据后,可以关闭其发送通道,但仍能接收对方数据。

逻辑拆解:

  • Step 1 (FIN):主动关闭方(如客户端)发送 FIN=1,seq=u,表示己方数据已发送完毕,请求关闭连接。
  • Step 2 (ACK):被动关闭方(服务器)收到 FIN,发送 ACK=1,ack=u+1 进行确认。此时,客户端到服务器的方向关闭,但服务器可能还有数据要发送。
  • Step 3 (FIN):服务器数据发送完毕后,发送 FIN=1,ACK=1,seq=v,ack=u+1,请求关闭己方方向。
  • Step 4 (ACK):客户端收到 FIN 后,发送 ACK=1,ack=v+1 进行确认。随后客户端进入 TIME_WAIT 状态。

TIME_WAIT 状态(2MSL 等待)的深度原因:

  • 原因一:可靠终止:确保最后一个 ACK 能到达服务器。如果 ACK 丢失,服务器会重发 FIN,客户端在 TIME_WAIT 状态下能再次回应 ACK。
  • 原因二:清除旧连接报文:允许网络中属于这个连接的、可能延迟的报文都“过期消失”(MSL 是报文最大生存时间),避免相同四元组(源IP、源端口、目的IP、目的端口)的新连接收到旧连接的延迟报文,造成数据混乱。
  • MSL 典型值:RFC 793 建议为 2 分钟,但 Linux 通常设置为 30 秒或 60 秒,因此 TIME_WAIT 通常为 60 秒或 120 秒。

【关联/对比】

TCP vs UDP

特性TCPUDP
连接性面向连接,需握手无连接,直接发送
可靠性可靠,有确认重传不可靠,尽力交付
有序性保证数据顺序不保证顺序
流量控制滑动窗口机制无
拥塞控制慢启动、拥塞避免等无
头部开销大(至少20字节)小(8字节)
传输形式字节流数据报文段
应用场景HTTP、FTP、邮件等要求可靠的数据传输DNS、视频流、广播等实时或简单查询

TCP 连接与 Socket

  • Socket 是操作系统提供的、用于网络通信的编程接口(API),是 TCP 连接在应用层的“句柄”。
  • 一个 TCP 连接由一对 Socket(客户端 Socket + 服务器 Socket)唯一标识,更精确地说,是由一个五元组(传输协议、源IP、源端口、目的IP、目的端口)唯一标识。
  • 建立 TCP 连接的本质,是在通信两端的内核中,为这个五元组创建并维护一套完整的状态数据结构(TCB,传输控制块)。

『面试官追问』

  1. 为什么客户端在 TIME_WAIT 状态必须等待 2MSL,而不是 1MSL 或 3MSL?

    • 1 MSL 用于确保主动关闭方发出的最后一个 ACK 能到达对端(或对端重传的 FIN 能到达本方)。
    • 另 1 MSL 用于确保网络上所有关于此连接的报文都已消失。2MSL 是理论上的充分条件,3MSL 则会造成不必要的资源等待。
  2. TCP 的“连接”是物理上的吗?路由器/交换机是否维护 TCP 连接状态?

    • 不是物理连接,是逻辑上的虚拟连接。中间的路由器、交换机等网络设备(网络层及以下)不维护 TCP 连接状态,它们只根据 IP 包头进行转发。TCP 连接状态仅由通信两端的主机操作系统内核维护。
  3. 如果建立连接时,第三次握手丢失了怎么办?

    • 服务器在发出 SYN+ACK 后会启动定时器等待 ACK。若超时未收到,服务器会重传 SYN+ACK 报文(重传次数和超时时间可配置)。多次重传失败后,服务器会关闭这个半开放的连接,释放资源。
  4. 半连接队列和全连接队列是什么?

    • 半连接队列(SYN Queue):服务器收到 SYN 报文后,连接处于 SYN_RCVD 状态,该连接被放入半连接队列。
    • 全连接队列(Accept Queue):完成三次握手后,连接处于 ESTABLISHED 状态,从半连接队列移入全连接队列,等待应用调用 accept() 取走。
    • 如果 SYN 攻击导致半连接队列满,或应用处理过慢导致全连接队列满,都会导致新的连接无法建立。
  5. TCP 有哪些定时器?

    • 重传定时器:用于数据包和 SYN 报文的重传。
    • 坚持定时器:解决零窗口通知丢失后的死锁问题。
    • 保活定时器:检测连接是否还存活。
    • TIME_WAIT 定时器:即 2MSL 定时器。
  6. TCP 如何保证顺序性?

    • 每个字节的数据都被分配一个序列号。接收方根据序列号对数据包进行排序,将有序数据交付给应用层,并利用累积确认机制(如确认号 ack=1001 表示 1001 之前的所有字节已收到)告知发送方。

这份回答从定义、原理、深度逻辑到关联对比,完整覆盖了 TCP 连接的核心考点,并预判了常见追问,能够帮助你在面试中清晰、自信地进行阐述。

My avatar

文章看完了,不打算去别的篇章转转吗?👀 感谢你的耐心阅读!如果你有问题想探讨,或者发现了文中的 Bug,请务必通过页脚的链接联系我


More Posts

Comments