我的测试学习站TEST LEARNING HUB
开始学习
首页/精华文章/6. TCP 三次握手四次挥手怎么讲

6. TCP 三次握手四次挥手怎么讲

TCP 三次握手和四次挥手是网络协议面试中的经典题。很多测试同学觉得这个问题偏开发或网络工程师,和测试关系不大,于是只背“客户端发 SYN,服务端回 SYN+ACK,客户端回 ACK”。但面试官问测试岗位这个问题,通常不是要求你画非常底层的网络状态机,而是看你是否理解连接建立、连接关闭、超时、连接失败、服务端不可达这些问题的基础原因。

测试工程师不需要把 TCP 讲得像网络专家,但要能用测试语言解释:TCP 是可靠连接,HTTP 通常基于 TCP;三次握手用于建立连接;四次挥手用于关闭连接;连接失败、连接超时、Connection refused、Read timeout 等问题,和网络、端口、服务状态、连接建立或响应等待有关。这样回答既不过度深入,也能体现你理解网络排查。

一、TCP 在测试中的作用

HTTP 是应用层协议,TCP 是传输层协议。大多数 HTTP/HTTPS 请求底层都依赖 TCP 连接。

测试中常见这些现象,都和 TCP 或网络连接有关:

  • 接口连接失败;
  • Connection refused;
  • Connection timeout;
  • Read timeout;
  • 服务端端口未监听;
  • 网络不通;
  • 长连接断开;
  • 压测时连接数过多;
  • 服务重启导致请求失败。

所以测试理解 TCP,不是为了背协议,而是为了更好解释网络故障。

二、什么是三次握手

三次握手是 TCP 建立连接的过程。

可以简单理解为客户端和服务端互相确认:

  1. 客户端确认自己能发送;
  2. 服务端确认自己能接收和发送;
  3. 客户端确认自己能接收。

经典过程:

客户端 -> 服务端:SYN
服务端 -> 客户端:SYN + ACK
客户端 -> 服务端:ACK

三次之后,连接建立,双方可以传输数据。

三、为什么不是两次握手

如果只有两次握手,服务端无法确认客户端是否能收到自己的响应,也可能因为历史无效连接导致资源浪费。

三次握手的核心是双方都确认对方的发送和接收能力,保证连接可靠建立。

面试不需要讲得过深,可以说:

三次握手是为了让客户端和服务端都确认双方收发能力正常,避免无效连接。

四、什么是四次挥手

四次挥手是 TCP 关闭连接的过程。

因为 TCP 是双向通信,客户端和服务端都可以发送数据。关闭时,一方说“我不发了”,另一方可能还有数据要发,所以关闭通常需要四步。

经典过程:

客户端 -> 服务端:FIN
服务端 -> 客户端:ACK
服务端 -> 客户端:FIN
客户端 -> 服务端:ACK

简单理解:

  1. 客户端说我发完了;
  2. 服务端确认收到;
  3. 服务端也发完了;
  4. 客户端确认收到。

五、为什么挥手通常是四次

因为 TCP 是全双工通信。客户端关闭发送通道,不代表服务端也马上没有数据要发。服务端可能需要先处理完剩余数据,再发送 FIN。所以 ACK 和 FIN 往往分开发,就形成四次挥手。

测试面试中这样讲就够了:

四次挥手是因为 TCP 双方都要分别关闭自己的发送方向,一方关闭后,另一方可能还有数据没发完,所以通常需要四步。

六、连接失败怎么和 TCP 关联

1. Connection refused

通常表示目标主机可达,但目标端口没有服务监听,或者服务主动拒绝连接。

测试排查:

  • IP 是否正确;
  • 端口是否正确;
  • 服务是否启动;
  • 端口是否监听;
  • 防火墙或安全组是否拒绝。

Linux 可用:

ss -lntp | grep 8080

2. Connection timeout

通常表示连接建立超时,可能网络不通、路由不可达、防火墙丢弃、服务不可达。

排查:

  • 网络是否通;
  • 域名是否解析;
  • 端口是否开放;
  • 网关是否可达;
  • 防火墙是否拦截。

3. Read timeout

连接已经建立,但服务端迟迟没有返回响应。可能是后端处理慢、数据库慢、第三方接口慢、线程阻塞。

排查:

  • 服务日志;
  • 慢 SQL;
  • 第三方接口耗时;
  • 服务器资源;
  • 压测结果。

这三个错误在接口测试和自动化测试中非常常见。

七、三次握手和接口测试的关系

普通功能测试不需要每次分析握手过程,但当接口连接异常时,要知道底层连接可能没建立成功。

例如 Postman 请求接口提示 connection refused,通常不是业务逻辑问题,而是服务端口未监听或连接被拒绝。

如果提示 timeout,可能请求没有成功建立连接,或者建立后等待响应超时。

所以 TCP 知识能帮助测试区分:

  • 网络连接问题;
  • 服务端口问题;
  • 应用业务问题;
  • 响应处理慢问题。

八、压测中 TCP 相关问题

性能测试中,TCP 更容易被关注。

常见问题:

  • 连接数过多;
  • TIME_WAIT 过多;
  • 端口耗尽;
  • 服务端连接池不足;
  • 网关连接限制;
  • 客户端压测机成为瓶颈。

测试压测时,如果大量请求连接失败,不能只看应用接口,还要看网络连接和服务资源。

但如果是普通初中级测试面试,不需要讲太深,能说明连接数和超时可能影响压测结果即可。

九、抓包怎么看 TCP

在 Wireshark 中可以看到 SYN、ACK、FIN 等包,但大多数测试岗位不会要求深入抓 TCP 包。

如果面试官问,可以说:

普通接口测试我主要通过 HTTP 状态码、请求耗时、错误信息和服务日志定位;如果是网络层问题,抓包可以看到 TCP 是否完成握手、是否重传、是否被重置。但日常测试更多会先用 ping、telnet、curl、端口检查和日志排查。

这个回答比较稳,不装过度专业。

十、面试回答模板

如果面试官问“三次握手四次挥手怎么讲”,可以这样答:

TCP 是可靠的传输层协议,HTTP 请求底层通常依赖 TCP。三次握手是建立连接的过程:客户端发 SYN,服务端回 SYN+ACK,客户端再回 ACK,通过三次交互确认双方收发能力正常。四次挥手是关闭连接的过程,因为 TCP 是双向通信,双方都要分别关闭自己的发送方向,所以通常是 FIN、ACK、FIN、ACK。测试中我不会只背流程,更关注它和连接失败的关系,比如 Connection refused 可能是端口没监听,Connection timeout 可能是网络不可达或被拦截,Read timeout 可能是服务处理慢或依赖服务慢。

十一、常见追问

追问:为什么三次握手不是两次?

为了让客户端和服务端都确认双方的发送和接收能力正常,避免无效连接。

追问:为什么挥手是四次?

因为 TCP 是双向通信,一方关闭发送后,另一方可能还有数据要发送,所以双方分别关闭。

追问:Connection refused 怎么排查?

确认 IP、端口、服务进程、端口监听、防火墙和安全组。通常说明目标端口没有服务或被拒绝。

追问:Read timeout 和 Connection timeout 区别?

Connection timeout 是连接建立超时;Read timeout 是连接建立后等待响应超时。

十二、练习清单

  1. 画出三次握手流程;
  2. 画出四次挥手流程;
  3. 理解 SYN、ACK、FIN;
  4. 区分 connection refused;
  5. 区分 connection timeout;
  6. 区分 read timeout;
  7. 用 ss 查看端口;
  8. 用 curl 测接口连通性;
  9. 把 TCP 和接口异常联系起来;
  10. 准备 TCP 面试回答。

TCP 三次握手和四次挥手,不要只背流程。测试岗位要把它和连接失败、超时、端口监听、服务状态、压测连接数这些实际问题结合起来讲。

配套刷题: