CN|腾讯面经总结

文章目录

描述下TCP网络建立连接的过程

描述下TCP网络断开连接的过程

  • TCP 断开连接通常通过 四次挥手 完成。假设客户端主动关闭连接。
    1. 第一步,客户端调用 close(),向服务端发送 FIN 报文,表示客户端这边已经没有数据要发送了,然后客户端进入 FIN_WAIT_1 状态。
    2. 第二步,服务端收到 FIN 后,会先回复一个 ACK,表示已经知道客户端不再发送数据了。此时服务端进入 CLOSE_WAIT 状态,客户端收到这个 ACK 后进入 FIN_WAIT_2 状态。这里要注意,TCP 是全双工协议,客户端不发数据了,不代表服务端也没有数据要发。所以服务端收到客户端的 FIN 后,不能马上也关闭连接,它可能还要继续把剩余数据发送给客户端。
    3. 第三步,等服务端数据发送完毕后,服务端也会发送一个 FIN 报文,表示服务端这边也没有数据要发送了,然后进入 LAST_ACK 状态。
    4. 第四步,客户端收到服务端的 FIN 后,回复最后一个 ACK,然后进入 TIME_WAIT 状态。服务端收到这个 ACK 后进入 CLOSED 状态。客户端等待 2MSL 后,也进入 CLOSED 状态。

所以四次挥手的本质是:分别关闭 TCP 双向数据流。客户端关闭发送方向,服务端确认;服务端关闭发送方向,客户端确认。

客户端为什么要等2MSL,此时服务端是一个什么状态,重发FIN的间隔时间

  • 客户端发送最后一个 ACK 后,会进入 TIME_WAIT,并等待 2MSL。这里主要有两个目的:
    • 第一,如果最后一个 ACK 丢失,服务端会停留在 LAST_ACK 状态并重传 FIN,客户端在 TIME_WAIT 中还能再次回复 ACK,保证服务端能正常关闭;
    • 第二,等待 2MSL 可以让旧连接中残留在网络里的报文过期,避免相同四元组的新连接收到旧报文。

TCP 连接由四元组唯一确定:源 IP + 源端口 + 目的 IP + 目的端口

如果客户端关闭后,立刻用同样的四元组建立新连接,那么网络中残留的旧报文可能会被新连接错误接收。

所以客户端等待 2MSL,是为了让旧连接中可能残留在网络里的报文全部过期。


MSL 是 Maximum Segment Lifetime,表示一个 TCP 报文在网络中的最大存活时间。

第 1 个 MSL:保证客户端最后发出的 ACK 最多存活这么久

第 2 个 MSL:如果 ACK 丢失,服务端重传的 FIN 最多再存活这么久


也就是说 2MSL 覆盖了这样一个最坏情况:

客户端最后 ACK 丢失

服务端等待一段时间后重传 FIN

这个重传 FIN 又在网络中存活最长时间

客户端仍然能收到 FIN 并重新 ACK


客户端等待 2MSL 后,基本可以认为:1、旧连接相关报文已经从网络中消失;2、服务端如果要重传 FIN,也已经有机会被客户端处理

  • 此时服务端的状态要分情况看:
    • 如果最后一个 ACK 正常到达,服务端会从 LAST_ACK 进入 CLOSED
    • 如果最后一个 ACK 丢失,服务端会停留在 LAST_ACK,并按照 TCP 的 RTO 重传机制重发 FIN
  • FIN 的重传间隔不是 2MSL,而是由 RTO 控制,通常会根据 RTT 估算并进行指数退避。所以 2MSL 是客户端 TIME_WAIT 的保活时间,RTO 才是服务端 FIN 重传的时间依据,这两个概念不能混在一起。

MSL取值多少

  • RFC 793 中假设的 MSL2分钟 ,所以理论上 TIME_WAIT = 2MSL = 4 分钟
  • 但实际操作系统不一定按这个值实现。比如 Linux 中常见的 TIME_WAIT 时间大约是 60 秒,可以理解为实际采用了约 30 秒 MSL 的效果。Windows 默认场景下常见是 2MSL = 4 分钟,也就是 MSL120 秒
相关推荐
Raink老师6 小时前
【AI面试临阵磨枪-79】实时数据 RAG:订单、商家、物流、天气、动态库存
人工智能·面试·职场和发展
Cosolar7 小时前
Chroma向量库面试学习指南
数据库·人工智能·面试·职场和发展·数据库架构
2301_809051147 小时前
Linux 网络编程 学习笔记
linux·网络·学习
小江的记录本8 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
星恒讯工业路由器9 小时前
Wi‑Fi DCM 双载波调制解析
网络·信息与通信·wifi7·wifi6·wi‑fi dcm 双载波调制
小江的记录本10 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
IP搭子来一个10 小时前
爬虫采集大量返回 403、429,到底卡在哪一环?
网络·爬虫·python
之歆10 小时前
Day16_JavaScript 轮播图与事件工程实战(下篇)
服务器·开发语言·前端·javascript·网络·性能优化
IT大白鼠10 小时前
ICMP协议详解:从基础原理到网络应用实践
网络
小江的记录本11 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:G1:Region分区、Mixed GC、回收流程、适用场景(高频)(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·spring cloud·面试