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

浅谈TCP的三次握手和四次挥手

TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,三次握手用于建立连接,四次挥手用于关闭连接,下面详细解释为什么需要这样的过程。

三次握手建立连接

三次握手的目的是为了在客户端和服务器之间同步初始序列号(ISN),确保双方都有发送和接收数据的能力,并且让双方就一些连接参数达成一致。具体过程及原因如下:

第一次握手:客户端发送 SYN 包
  • 过程:客户端向服务器发送一个 SYN(Synchronize Sequence Numbers)包,该包中包含客户端的初始序列号(ISN),表示客户端请求建立连接。
  • 原因:客户端主动发起连接请求,告知服务器自己希望建立连接,同时发送初始序列号,为后续的数据传输做准备。
第二次握手:服务器发送 SYN + ACK 包
  • 过程:服务器收到客户端的 SYN 包后,向客户端发送一个 SYN + ACK 包。其中 SYN 包包含服务器的初始序列号,ACK 包是对客户端 SYN 包的确认,确认号为客户端初始序列号加 1。
  • 原因:服务器通过发送 SYN 包回应客户端的连接请求,并发送自己的初始序列号。同时,发送 ACK 包表示已经收到客户端的连接请求,确认客户端有发送数据的能力。这样,服务器既同意建立连接,又完成了自身序列号的同步。
第三次握手:客户端发送 ACK 包
  • 过程:客户端收到服务器的 SYN + ACK 包后,向服务器发送一个 ACK 包,确认号为服务器初始序列号加 1。
  • 原因:客户端收到服务器的确认后,再次发送 ACK 包,确认收到服务器的 SYN 包,告知服务器自己有接收数据的能力。此时,双方都确认了彼此发送和接收数据的能力,连接建立成功。
为什么不能是两次握手

如果是两次握手,服务器收到客户端的 SYN 包后直接建立连接,无法确认客户端是否有接收数据的能力。可能会出现客户端由于网络问题等原因没有收到服务器的 SYN 包,但服务器已经认为连接建立并发送数据的情况,导致数据丢失和资源浪费。

四次挥手关闭连接

四次挥手的目的是确保双方都能够正确地关闭连接,释放相关的资源。具体过程及原因如下:

第一次挥手:客户端发送 FIN 包
  • 过程:客户端向服务器发送一个 FIN(Finish)包,表示客户端已经没有数据要发送了,请求关闭连接。
  • 原因:客户端完成数据发送后,主动发起关闭连接的请求。
第二次挥手:服务器发送 ACK 包
  • 过程:服务器收到客户端的 FIN 包后,向客户端发送一个 ACK 包,表示已经收到客户端的关闭请求,同意关闭客户端到服务器的连接。
  • 原因:服务器及时确认收到客户端的关闭请求,让客户端知道服务器已经收到请求。此时,客户端到服务器的连接处于半关闭状态,客户端不能再发送数据,但可以接收服务器发送的数据。
第三次挥手:服务器发送 FIN 包
  • 过程:服务器处理完剩余的数据后,向客户端发送一个 FIN 包,表示服务器也没有数据要发送了,请求关闭服务器到客户端的连接。
  • 原因:服务器完成自身的数据发送后,主动请求关闭与客户端的连接。
第四次挥手:客户端发送 ACK 包
  • 过程:客户端收到服务器的 FIN 包后,向服务器发送一个 ACK 包,表示已经收到服务器的关闭请求,同意关闭服务器到客户端的连接。
  • 原因:客户端确认收到服务器的关闭请求,双方的连接正式关闭。
为什么不能是三次挥手

在大多数情况下,服务器收到客户端的 FIN 包后,可能还有一些数据需要处理和发送,不能立即关闭连接。因此,服务器会先发送 ACK 包确认客户端的关闭请求,然后在处理完数据后再发送 FIN 包请求关闭连接。这就导致关闭连接需要四次挥手。只有在服务器没有数据要发送的特殊情况下,才可以将第二次和第三次挥手合并,实现三次挥手关闭连接。


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

相关文章:

  • Spark 源码 | 脚本分析总结
  • 强化学习之 PPO 算法:原理、实现与案例深度剖析
  • Kafka 的消费offset原来是使用ZK管理,现在新版本是怎么管理的?
  • 理邦仪器嵌入式(C/C++开发)开发面试题及参考答案
  • python全栈-python基础
  • Shapefile格式文件解析和显示
  • 关于arm
  • 抽象工厂模式详解(Java)
  • floodfill算法系列一>图像渲染
  • 创新领先!珈和科技获评省级企业技术中心
  • 第五节 采样方法的分类及介绍
  • 蓝桥杯JavaB组之集合框架(ArrayList、HashMap 基础操作)
  • 【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景
  • Qt - 地图相关 —— 2、Qt调用百度在线地图功能示例全集,包含线路规划、地铁线路查询等(附源码)
  • 喂饭式教程 - 腾讯云轻量服务器部署DeepSeek
  • C++ | Goal 解析器实现
  • 4.Excel:李东阳-电器企业-本年度的生产与营销计划❗(18)
  • Linux 快速对比两个文件的差异值
  • ORM框架(Object-Relational Mapping,对象关系映射框架)
  • 使用Hexo部署NexT主体网站
  • 现代前端工程化实践:高效构建的秘密
  • 以简单的方式过一生
  • k8s部署logstash
  • HTML 左右联动高亮示例
  • ‌Linux系统中无法使用netstat命令的原因及解决方法
  • Django 简单安装(pycharm)