当前位置: 首页 > web >正文

TCP的三次握手和四次挥手

TCP的三次握手(建立连接)

TCP 是面向连接的协议,通信前需先建立可靠连接。三次握手的目的是同步双方的初始序列号(ISN),并确认双方的收发能力正常。

握手过程
  1. 第一次握手(SYN)

    • 客户端发送 SYN=1(同步标志位)和随机序列号 seq=x

    • 状态:客户端进入 SYN_SENT

  2. 第二次握手(SYN+ACK)

    • 服务器收到 SYN 后,回复 SYN=1ACK=1(确认标志位),并发送自己的序列号 seq=y 和确认号 ack=x+1

    • 状态:服务器进入 SYN_RCVD

  3. 第三次握手(ACK)

    • 客户端收到 SYN+ACK 后,回复 ACK=1,确认号 ack=y+1

    • 状态:双方进入 ESTABLISHED(连接建立成功)。

为什么需要三次?
  • 两次握手的风险:若失效的客户端 SYN 请求延迟到达服务器,服务器会误认为新连接,导致资源浪费。

  • 三次握手确保双向通信可靠

    • 客户端确认:自己能发、能收。

    • 服务器确认:自己能收、能发。


TCP的四次挥手(断开连接)

TCP 是全双工的,双方需分别关闭自己的数据通道。四次挥手的目的是安全释放连接资源。

挥手过程
  1. 第一次挥手(FIN)

    • 主动关闭方(如客户端)发送 FIN=1 和序列号 seq=u

    • 状态:客户端进入 FIN_WAIT_1

  2. 第二次挥手(ACK)

    • 被动关闭方(如服务器)收到 FIN 后,回复 ACK=1 和确认号 ack=u+1

    • 状态:服务器进入 CLOSE_WAIT,客户端收到后进入 FIN_WAIT_2

    • 此时:服务器可能仍有数据要发送(半关闭状态)。

  3. 第三次挥手(FIN)

    • 服务器完成数据发送后,发送 FIN=1 和序列号 seq=w

    • 状态:服务器进入 LAST_ACK

  4. 第四次挥手(ACK)

    • 客户端收到 FIN 后,回复 ACK=1 和确认号 ack=w+1

    • 状态:客户端进入 TIME_WAIT(等待 2MSL 后关闭),服务器直接关闭。

为什么需要四次?
  • TCP 是全双工的,需分别关闭两个方向的数据流。

  • 第二次挥手(ACK)和第三次挥手(FIN)不能合并:

    • 服务器可能在 CLOSE_WAIT 状态继续发送剩余数据。


关键问题解析

1. 为什么TIME_WAIT状态要等待2MSL?
  • MSL(Maximum Segment Lifetime):报文最大生存时间(通常为30秒~2分钟)。

  • 目的

    • 确保最后一个 ACK 能到达服务器(若丢失,服务器会重发 FIN)。

    • 让网络中残留的旧报文失效,避免影响新连接。

2. 握手可以四次吗?
  • 理论上可以(如同时发送 SYN),但实际优化为三次。

3. 挥手可以三次吗?
  • 可以!如果服务器在第二次挥手时没有数据要发送,会合并 ACK 和 FIN(变为三次)。


示意图

三次握手
Client                           Server|-------- SYN (seq=x) ----------->|  |<---- SYN+ACK (seq=y, ack=x+1) --|  |-------- ACK (ack=y+1) -------->|  
四次挥手
Client                           Server|-------- FIN (seq=u) ----------->|  |<------- ACK (ack=u+1) ----------|  |<------- FIN (seq=w) ------------|  |-------- ACK (ack=w+1) -------->|  

实际应用

  • 握手失败:可能是防火墙阻止、端口未开放。

  • 大量TIME_WAIT:高并发短连接时需优化(如调整 tcp_tw_reuse 参数)。

  • 半连接队列:服务器在 SYN_RCVD 状态时存储未完成的握手请求(需防SYN洪水攻击)。

理解握手和挥手是排查网络问题(如连接超时、端口占用)的基础!

http://www.xdnf.cn/news/338.html

相关文章:

  • 【IDEA2020】 解决开发时遇到的一些问题
  • 中华传承-医山命相卜-铁板神数
  • 快速入门smolagents
  • FreeFileSync:文件同步对比工具
  • canal安装使用V1.1.4
  • 《数据牢笼》-来自DeepSeek
  • ‌2025年教育AI实战项目
  • 曲棍球·棒球1号位
  • 2025大模型推理框架选型全指南:高并发推理架构深度拆解
  • 解决:QTcpSocket: No such file or directory
  • yolov8 框架自带模型体验功能
  • FME实现矢量建筑面shp拉伸并贴纹理
  • Windows10,11账户管理,修改密码,创建帐户...
  • 米托蒽醌和阿克拉霉素 髓外 aml 疗效
  • Top100(26-30)
  • 编程常见错误归类
  • keil5软件配置以及使用技巧
  • QML 自定义控件指南
  • 【dify实战】chatflow结合deepseek实现基于自然语言的数据库问答、Echarts可视化展示、Excel报表下载
  • 阿里AI模型获FDA“突破性”认证,胰腺癌早筛实现关键突破|近屿智能邀你入局AIGC大模型
  • SSM省市区三级联动和三表联查附带数据库
  • Transformer :Encoder vs Decoder
  • SAP赋能玩具行业:数字化转型中的创新与增长
  • 梯度下降,共轭梯度,牛顿法,拟牛顿法的收敛速度对比
  • Linux:线程的同步与互斥(生产者消费者模型的demo)
  • ESORICS 2025截稿延期
  • java并发编程-ForkJoinPool
  • fastdds:传输层SHM和DATA-SHARING的区别
  • I2C嵌入式开发实战指南:从入门到精通
  • 一级指针的介绍