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 建立连接的过程。
可以简单理解为客户端和服务端互相确认:
- 客户端确认自己能发送;
- 服务端确认自己能接收和发送;
- 客户端确认自己能接收。
经典过程:
客户端 -> 服务端:SYN
服务端 -> 客户端:SYN + ACK
客户端 -> 服务端:ACK
三次之后,连接建立,双方可以传输数据。
三、为什么不是两次握手
如果只有两次握手,服务端无法确认客户端是否能收到自己的响应,也可能因为历史无效连接导致资源浪费。
三次握手的核心是双方都确认对方的发送和接收能力,保证连接可靠建立。
面试不需要讲得过深,可以说:
三次握手是为了让客户端和服务端都确认双方收发能力正常,避免无效连接。
四、什么是四次挥手
四次挥手是 TCP 关闭连接的过程。
因为 TCP 是双向通信,客户端和服务端都可以发送数据。关闭时,一方说“我不发了”,另一方可能还有数据要发,所以关闭通常需要四步。
经典过程:
客户端 -> 服务端:FIN
服务端 -> 客户端:ACK
服务端 -> 客户端:FIN
客户端 -> 服务端:ACK
简单理解:
- 客户端说我发完了;
- 服务端确认收到;
- 服务端也发完了;
- 客户端确认收到。
五、为什么挥手通常是四次
因为 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 是连接建立后等待响应超时。
十二、练习清单
- 画出三次握手流程;
- 画出四次挥手流程;
- 理解 SYN、ACK、FIN;
- 区分 connection refused;
- 区分 connection timeout;
- 区分 read timeout;
- 用
ss查看端口; - 用 curl 测接口连通性;
- 把 TCP 和接口异常联系起来;
- 准备 TCP 面试回答。
TCP 三次握手和四次挥手,不要只背流程。测试岗位要把它和连接失败、超时、端口监听、服务状态、压测连接数这些实际问题结合起来讲。
配套刷题:

