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

TCP三次握手,四次挥手,以及11种状态详解

三次握手和四次挥手指的是TCP(传输控制协议)中的连接建立与断开过程。这两个过程是确保数据能够可靠传输的重要机制。

三次握手(建立连接)

  1. 第一次握手:客户端发送一个带有SYN(同步序列编号)标志的包到服务器,并进入SYN_SEND状态,等待服务器确认。这个包的主要目的是告诉服务器“我想和你建立一个连接”。

  2. 第二次握手:服务器收到客户端的SYN包后,会以一个SYN+ACK(同步-确认)的包作为应答,表示接受客户端的连接请求。此时,服务器进入SYN_RECV状态。

  3. 第三次握手:客户端收到服务器的SYN+ACK包后,会发送一个ACK(确认)包给服务器,以此确认服务器的SYN+ACK包已成功接收。客户端进入ESTABLISHED状态,此时连接已经建立完成。当服务器接收到客户端的ACK包后也进入ESTABLISHED状态,双方可以开始数据传输了。

四次挥手(断开连接)

  1. 第一次挥手:主动关闭方(可以是客户端也可以是服务端)发送一个FIN(结束)标志的包给对方,表示“我已经没有数据要发给你了”。发送方进入FIN_WAIT_1状态。

  2. 第二次挥手:被动关闭方收到FIN包后,发送一个ACK包作为响应,确认号为收到的序号加1。被动关闭方进入CLOSE_WAIT状态,而主动关闭方则进入FIN_WAIT_2状态。

  3. 第三次挥手:被动关闭方可能还有未发送的数据给主动关闭方,所以当这些数据发送完毕后,被动关闭方也会发送一个FIN包给主动关闭方,表示“我也没有数据要发送了”。此时,被动关闭方进入LAST_ACK状态。

  4. 第四次挥手:主动关闭方收到被动关闭方的FIN包后,会发送一个ACK包作为响应,然后进入TIME_WAIT状态。不是立即关闭连接,而是等待足够的时间以确保被动关闭方能收到最后一个ACK包,之后才真正关闭连接。被动关闭方在收到ACK包后,关闭连接,进入CLOSED状态。

整个过程中,TIME_WAIT状态的存在是为了处理网络中可能存在的延迟或丢失的报文段,确保所有数据都已正确传输。通常情况下,一个端口在TIME_WAIT状态下需要等待2MSL(最大段生命周期)的时间,这是为了确保旧的连接状态信息从网络中消失,不会影响新建立的连接。

11种状态 

TCP(传输控制协议)定义了一系列的状态来管理连接的建立和终止过程。这些状态反映了TCP连接在其生命周期内的不同阶段。以下是TCP连接的11种状态及其简要说明:

  1. CLOSED:初始状态,表示没有连接。
  2. LISTEN:服务器进程正在等待进入连接的请求。
  3. SYN_SENT:应用进程已经发送了一个连接请求,但还没有收到确认。客户端在第一次握手时会进入此状态。
  4. SYN_RECEIVED:仅在三次握手过程中短暂出现。当一方向另一方发送SYN包并收到了SYN+ACK包,但在发送最终的ACK包之前处于此状态。
  5. ESTABLISHED:连接已经建立,双方可以开始传输数据。
  6. FIN_WAIT_1:主动关闭方已经发送了FIN包,等待对方的确认(ACK)。这是第一次挥手时的状态。
  7. FIN_WAIT_2:主动关闭方已经收到了对方的ACK确认,等待对方发送FIN包。
  8. CLOSE_WAIT:被动关闭方收到了对方的FIN包,已经发送了ACK确认,但自身还未发送FIN包。这是一方准备关闭连接,但应用程序尚未调用close()的情况。
  9. CLOSING:一种罕见的状态,发生在双方同时尝试关闭连接的情况下。即当一方发送FIN包后,几乎同时接收到对方的FIN包。
  10. LAST_ACK:被动关闭方已经发送了自己的FIN包,等待对方的最终ACK确认。
  11. TIME_WAIT:主动关闭方发送了最后的ACK确认后进入此状态,等待2MSL(最大段生命周期)的时间,以确保最后的ACK包能够到达对方,从而保证连接的完全关闭。之后,连接将被删除,返回到CLOSED状态。


http://www.kler.cn/a/378052.html

相关文章:

  • 1565412310
  • kubevirt cloud-init配置
  • andrular输入框input监听值传递
  • 非线性数据结构之图
  • 云原生+AI核心技术&最佳实践
  • 【网络】深入理解HTTP协议:请求方法、状态码与工作流程全解析
  • Oracle 第17章:数据字典与视图
  • python的数据结构列表方法及扩展(栈和队列)
  • InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记
  • IDEA 好用的插件分享
  • Blender进阶:贴图与UV
  • 【C++篇】跨越有限与无限的边界:STL之set容器中的自我秩序与无限可能
  • 【踩坑】修复高版本dgl中distributed.load_partition不返回orig_id问题
  • nodejs入门教程19:nodejs dns模块
  • 第三百零五节 Log4j教程 - Log4j日志记录方法
  • Excel常用函数与操作
  • ArcGIS软件之“新建中学最适合地址”地图制作
  • 十款思维导图软件推荐,有适合你的一款!!!
  • JavaScript的第十二天
  • 使用PostgreSQL进行高效数据管理
  • python爬虫获取数据后的数据提取
  • 面试题:JVM(二)
  • MySQL FIND_IN_SET 函数详解
  • 施耐德M310PLC通讯之ModbusTCP(一)
  • Hyperledger Fabric 使用了那些共识机制,共识机制对比
  • 算法闭关修炼百题计划(五)