协议值TCP

张开发
2026/4/19 8:42:40 15 分钟阅读

分享文章

协议值TCP
TCP 三次握手 四次挥手一、TCP 三次握手建立连接核心目的确保双方收发能力都正常同步双方初始序列号ISN建立可靠的 TCP 连接为后续数据传输做准备。核心标识说明SYN同步序列号用于发起连接、同步初始序列号ACK确认应答用于确认收到对方的数据ISN随机初始序列号每端独立生成避免历史数据干扰流程图mermaid格式Markdown可直接渲染暂时无法在豆包文档外展示此内容详细步骤第一次握手客户端 → 服务端客户端主动发起连接发送 SYN1携带自己的初始序列号 seqx客户端状态变为 SYN_SENT等待服务端响应。第二次握手服务端 → 客户端服务端收到 SYN 后确认客户端能发同时向客户端发起同步SYN1携带自己的初始序列号 seqy并回复 ACK1确认号 ackx1表示“我收到了你发送的 x 及之前的所有数据”服务端状态变为 SYN_RCVD。第三次握手客户端 → 服务端客户端收到服务端的 SYNACK 后确认服务端能收能发回复 ACK1确认号 acky1客户端状态变为 ESTABLISHED服务端收到 ACK 后也变为 ESTABLISHED连接正式建立。二、TCP 四次挥手断开连接核心目的TCP 是双向通信协议双方需独立关闭各自的发送通道确保双方所有数据都已传输完成再彻底断开连接避免数据丢失。核心标识说明FIN结束标志用于发起关闭连接请求表示“我没有数据要发送了”ACK确认应答与三次握手一致用于确认收到 FIN 或数据流程图mermaid格式Markdown可直接渲染暂时无法在豆包文档外展示此内容详细步骤第一次挥手客户端 → 服务端客户端无更多数据要发送发送 FIN1携带当前序列号 sequ客户端状态变为FIN_WAIT_1等待服务端确认。第二次挥手服务端 → 客户端服务端收到 FIN 后回复 ACK1确认号 acku1此时服务端仍可向客户端发送未传完的数据客户端状态变为 FIN_WAIT_2等待服务端发起关闭。第三次挥手服务端 → 客户端服务端发送完所有剩余数据后发送 FIN1携带当前序列号 seqv服务端状态变为 LAST_ACK等待客户端确认。第四次挥手客户端 → 服务端客户端收到 FIN 后回复 ACK1确认号 ackv1客户端状态变为 TIME_WAIT等待 2MSL 后彻底关闭防止服务端没收到 ACK 重发 FIN服务端收到 ACK 后直接变为 CLOSED。三、高频场景面试题含解析适配面试问答以下是面试中最常考的 8 道场景题解析直击考点避免冗余直接记核心即可。★ 三次握手相关面试题为什么 TCP 建立连接需要三次握手而不是两次核心解析核心是「确认双方收发能力都正常」避免“失效连接请求”导致服务端资源浪费。假设两次握手客户端发送的 SYN连接请求因网络延迟很久后才到达服务端服务端以为是新请求回复 SYNACK 后就建立连接、占用资源但客户端早已超时关闭服务端会一直等待客户端数据造成资源泄漏。三次握手的第三次客户端会确认服务端的 SYNACK只有双方都确认“对方能收能发”才建立连接从根源避免上述问题。三次握手过程中客户端/服务端的状态变化是什么核心解析记简写即可客户端CLOSED → SYN_SENT → ESTABLISHED服务端CLOSED → LISTEN → SYN_RCVD → ESTABLISHED三次握手时SYN 为什么不能携带数据核心解析此时连接尚未建立服务端还未确认客户端的收发能力若 SYN 携带数据可能导致数据丢失服务端未准备好接收且 SYN 是“连接请求”核心目的是同步序列号不负责数据传输设计上就不允许携带数据。面试场景题如果三次握手的第三次 ACK 丢失会发生什么核心解析服务端会超时重发 SYNACK默认重发 5 次每次超时时间翻倍直到收到客户端的 ACK若一直未收到服务端会释放连接客户端则会在 SYN_SENT 状态超时后关闭连接。★ 四次挥手相关面试题为什么 TCP 断开连接需要四次挥手而不是三次核心解析TCP 是双向通信双方的发送通道需要独立关闭。服务端收到客户端的 FIN第一次挥手后可能还有未传输完的数据不能立即发送 FIN无法同时确认关闭请求 发起关闭只能先回复 ACK第二次挥手等数据发完后再发送 FIN第三次挥手最后客户端确认第四次挥手因此需要四次。什么是 TIME_WAIT 状态为什么需要等待 2MSL核心解析TIME_WAIT 是客户端第四次挥手后进入的状态持续时间为 2MSLMSL最大报文段生存时间默认 1 分钟。目的 1确保服务端能收到客户端的 ACK若服务端没收到会重发 FIN客户端在 TIME_WAIT 期间能再次回复 ACK。目的 2等待网络中所有失效的报文段消失避免新连接复用端口时收到历史报文段干扰。面试场景题服务端出现大量 TIME_WAIT 状态会有什么问题怎么解决核心解析问题TIME_WAIT 会占用端口和系统资源大量出现会导致端口耗尽新连接无法建立。解决方案高频考点调整内核参数net.ipv4.tcp_tw_reuse允许复用 TIME_WAIT 端口、net.ipv4.tcp_tw_recycle快速回收 TIME_WAIT 连接。缩短 TIME_WAIT 时长调整 net.ipv4.tcp_fin_timeout默认 60s可适当缩短。采用长连接keep-alive减少频繁建立/断开连接。为什么服务端断开连接后是直接 CLOSED而客户端要进入 TIME_WAIT核心解析客户端是主动发起关闭的一方需要负责确认服务端的 FIN 已被收到服务端是被动关闭的一方收到客户端的 ACK 后确认所有数据已传输完成无需等待可直接关闭。四、记忆口诀面试快速回忆三次握手你能发 → 我能收发 → 你能收同步序列号确认双方能力四次挥手我发完了 → 收到 → 我也发完了 → 收到双向关闭确保数据传完

更多文章