TCP易错点总结

TCP 易错点总结

#误区正解
1❌ 两次握手就能建立连接✅ 两次握手无法防止历史连接,延迟的旧 SYN 会导致误建连接。三次握手让客户端能确认”这是我要的连接”
2❌ 四次挥手必须是四次✅ 如果服务器没有数据要发,第二三次(ACK 和 FIN)可以合并为一次发送,变成三次挥手
3❌ TIME_WAIT 是坏状态✅ TIME_WAIT 是正常状态,确保连接可靠关闭 + 旧报文消逝。过多才需要优化
4❌ 关闭连接就是直接断开✅ 需要四次挥手,双方各自关闭自己那半条通道(TCP 是全双工)
5❌ SYN 报文可以携带数据✅ SYN 报文不能携带数据。但第三次握手的 ACK 可以携带数据(此时连接已建立)
6❌ MSL 是固定值✅ MSL 由系统配置,Linux 默认 60 秒,2MSL = 120 秒。可通过内核参数调整
7❌ CLOSE_WAIT 是客户端状态✅ CLOSE_WAIT 是被动关闭方(通常是服务器)的状态。过多 = 应用层没调 close()
8❌ 三次握手只建立连接✅ 三次握手还同步双方的初始序列号(ISN),这是可靠传输的基础
9❌ 流量控制 = 拥塞控制流量控制是接收方通过滑动窗口告诉发送方”我还能收多少”(保护接收方);拥塞控制是发送方根据网络状况调整速度(保护网络)
10❌ TCP 一定比 UDP 慢✅ 裸 UDP 头部更小(8B vs 20B),但如果在 UDP 上实现可靠性(如 QUIC),实际开销可能接近 TCP。正确对比是”谁的失败行为匹配你的场景”
11❌ TIME_WAIT 只出现在客户端✅ 谁主动关闭谁进 TIME_WAIT。HTTP/1.0 短连接中服务端主动关闭,服务端也会进 TIME_WAIT
12❌ 半连接队列 = 全连接队列SYN 队列(半连接)存放 SYN_RCVD 状态连接;Accept 队列(全连接)存放已完成握手但未被 accept() 取走的连接

一图流(Mermaid)


flowchart LR

    A[连接建立] --> B[三次握手: SYN/SYN+ACK/ACK]

    C[连接关闭] --> D{谁主动关?}

    D -->|客户端主动| E[客户端 TIME_WAIT 等 2MSL]

    D -->|服务器被动| F[服务器 CLOSE_WAIT 等 close]

    G[两个队列] --> H[SYN 队列 半连接 SYN_RCVD]

    G --> I[Accept 队列 全连接 等 accept]

速记卡(面试闪卡)

Q1:一句话讲清「TCP易错点总结」到底是什么?

A:梳理 TCP 连接管理里最常被误解的那几个关键知识点。

Q2:握手:为什么不能两次 —— 怎么理解?

A:两次握手就像只确认一半就开门:延迟的旧 SYN 会误建连接白占资源。三次握手(Three-way Handshake)让客户端确认「这真是我要的连接」,还顺手同步初始序列号(ISN)。

Q3:挥手:四次与 TIME_WAIT —— 怎么理解?

A:关闭是全双工,各关各的半条通道,所以四次挥手(Four-way Handshake)。若服务器没数据,ACK 和 FIN 合并成三次;TIME_WAIT 是正常状态,等 2MSL 让旧报文消逝,不是坏东西。

Q4:状态:CLOSE_WAIT 与两个队列 —— 怎么理解?

A:CLOSE_WAIT 是被动关闭方(通常是服务器)的状态,过多说明应用没调 close();半连接队列(SYN Queue)存 SYN_RCVD,全连接队列(Accept Queue)存已完成握手等 accept 取走。

Q5:控制:流量 vs 拥塞 —— 怎么理解?

A:流量控制(Flow Control)是接收方用滑动窗口说「我还能收多少」,保护接收方;拥塞控制(Congestion Control)是发送方看网络脸色调速,保护网络。俩不是一回事。

Q6:核心速记主线有哪些?

  • 三次握手防历史连接

  • 挥手可合并成三次

  • TIME_WAIT 正常非坏

  • 流量≠拥塞控制

口诀

A:两次握手防不住,

挥手合并三步路。

TIME_WAIT 正常处,

流控拥塞两分幕。

相关链接