深入浅出理解TCP三次握手与四次挥手

目录

  • 引言
  • 1.为什么需要三次握手?
  • 2. 三次握手的过程
  • 3. 为什么需要四次挥手?
  • 4. 四次挥手的过程
  • 5. 为什么挥手需要四次,而握手只需三次?
  • 6. 三次握手与四次挥手的时序图
  • 7. TIME_WAIT状态的意义
  • 8. 总结
  • 9.面试时候问到什么是三次握手和四次挥手


引言

在计算机网络中,TCP(Transmission Control Protocol,传输控制协议) 是一种可靠的面向连接的协议,广泛应用于Internet的通信中。理解TCP中的三次握手和四次挥手机制,是掌握网络通信基础的重要环节。本文将深入浅出地介绍三次握手与四次挥手的工作原理。


1.为什么需要三次握手?

在通信开始时,TCP需要在客户端和服务器之间建立可靠的连接,确保双方准备好接收和发送数据。为此,TCP使用了三次握手的过程。这个握手的目的包括以下几点:

  • 确保双方都收到了对方的消息,建立可靠的连接。
  • 允许双方协商初始化序列号(Initial Sequence Number, ISN),以确保数据传输中的每一字节都有序。

2. 三次握手的过程

三次握手的具体过程如下:

  1. 第一次握手(SYN)
    客户端发送一个SYN(Synchronize Sequence Numbers)报文给服务器,请求建立连接。这个报文包含了客户端的初始序列号ISN(c),表示客户端希望开始通信。

    • 客户端状态:SYN_SENT
  2. 第二次握手(SYN-ACK)
    服务器接收到客户端的SYN报文后,响应一个SYN-ACK报文。这个报文既包含服务器的初始序列号ISN(s),也确认了客户端的ISN(c)

    • 服务器状态:SYN_RCVD
  3. 第三次握手(ACK)
    客户端收到SYN-ACK报文后,发送一个ACK报文确认服务器的序列号ISN(s),至此三次握手完成,双方进入连接建立状态。

    • 客户端状态:ESTABLISHED
    • 服务器状态:ESTABLISHED

此时,连接已建立,双方可以开始传输数据。

3. 为什么需要四次挥手?

TCP不仅通过三次握手建立连接,还通过四次挥手来终止连接。由于TCP连接是全双工的(即双方可以同时发送和接收数据),因此关闭连接时需要双方分别关闭各自的数据传输通道。

4. 四次挥手的过程

  1. 第一次挥手(FIN)
    客户端发送一个FIN(Finish)报文,表示它完成了数据传输,并希望关闭到服务器方向的连接。

    • 客户端状态:FIN_WAIT_1
  2. 第二次挥手(ACK)
    服务器接收到客户端的FIN报文后,回复一个ACK报文,表示已收到关闭请求,但仍可能有未完成的数据需要发送。

    • 服务器状态:CLOSE_WAIT
    • 客户端状态:FIN_WAIT_2
  3. 第三次挥手(FIN)
    服务器发送完所有数据后,发送一个FIN报文,表示可以关闭连接。

    • 服务器状态:LAST_ACK
  4. 第四次挥手(ACK)
    客户端收到服务器的FIN报文后,回复一个ACK报文,确认连接终止。此时,客户端进入TIME_WAIT状态,确保服务器收到了ACK,并等待一段时间后完全关闭连接。

    • 客户端状态:TIME_WAIT
    • 服务器状态:CLOSED

5. 为什么挥手需要四次,而握手只需三次?

挥手需要四次的原因在于TCP连接的全双工性质。握手时,双方同步建立连接,发送方向和接收方向是对等的。而在挥手过程中,双方的关闭操作是独立的,一个方向关闭并不意味着另一个方向也可以立即关闭,因此需要额外的报文确认。

6. 三次握手与四次挥手的时序图

下面是一个简化的时序图,帮助大家理解三次握手和四次挥手的交互过程:

三次握手:
客户端      服务器
   |            |
   | SYN        |
   | ---------->|
   |            |
   |    SYN-ACK |
   |<---------- |
   |            |
   |    ACK     |
   | ---------->|
   | 连接建立    |
   
四次挥手:
客户端      服务器
   |            |
   |    FIN     |
   | ---------->|
   |            |
   |    ACK     |
   |<---------- |
   |            |
   |    FIN     |
   |<---------- |
   |            |
   |    ACK     |
   | ---------->|
   | 连接关闭    |

7. TIME_WAIT状态的意义

TIME_WAIT是TCP连接关闭过程中最后的一个重要状态。客户端在发送最后的ACK后进入TIME_WAIT,保持一段时间(一般为2倍的最大报文生存时间,即2MSL),确保服务器收到了ACK。如果在此期间服务器没有重发FIN报文,客户端才会真正关闭连接。

TIME_WAIT的主要作用有两点:

  1. 防止丢失的报文干扰后续连接。TIME_WAIT确保旧连接的报文不会影响新连接。
  2. 确保ACK可靠传输。客户端可能需要重新发送ACK确认服务器的FIN报文,因此需要保持连接一段时间。

8. 总结

通过三次握手,TCP确保双方能够可靠地建立连接,开始数据传输;通过四次挥手,TCP安全地终止连接,避免数据丢失和混乱。理解三次握手和四次挥手机制不仅有助于我们深入掌握TCP协议,还能帮助我们在网络调试与优化中,正确分析和解决连接问题。

这个过程虽然看似简单,但其背后蕴含了许多设计上的精妙之处,比如对序列号的管理、对状态的控制以及对数据传输可靠性的保证。

希望这篇文章能帮助你更好地理解TCP中的三次握手与四次挥手!

9.面试时候问到什么是三次握手和四次挥手

在面试中,如果被问到TCP的三次握手和四次挥手,可以简洁明了地回答:

三次握手是为了建立可靠的连接,客户端和服务器通过SYN和ACK报文进行序列号的同步,确保双方都能够正确接收和发送数据。握手的三次分别是:客户端发送SYN,服务器响应SYN-ACK,客户端再确认ACK,连接建立。
四次挥手是用于断开连接,由于TCP是全双工通信,双方的数据通道需要分别关闭,因此客户端和服务器会各自发送FIN和ACK报文,确保连接的双向关闭。挥手的四次则是客户端和服务器分别发送和确认FIN报文,最终安全断开连接。

这种介绍简要概括了流程和目的,展示了你对TCP连接机制的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/889465.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络 - 基础问题】每日 3 题(三十六)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

Open WebUI | 自托管的类 ChatGPT 网站

Open WebUI 是一个扩展性强、功能丰富且用户友好的自托管 WebUI&#xff0c;支持 ChatGPT 网页端的大部分功能&#xff0c;支持各类模型服务&#xff0c;包括 Ollama 和 OpenAI 的 API。该项目在 GitHub 上已有 38k 星&#xff0c;非常受欢迎。 功能介绍 本篇介绍该项目的功能…

考研笔记之操作系统(四) - 文件管理

文件管理 1. 简介1.1 前情回顾1.2 文件的属性1.3 文件内部数据的组织方式1.4 操作系统向上提供的文件功能1.5 文件应如何放在外存 2. 文件的逻辑结构2.1 无结构文件2.2 有结构文件2.2.1 顺序文件2.2.2 索引文件2.2.3 索引顺序文件2.2.4 多级索引顺序文件 3. 文件目录3.1 基本概…

若依前端后打成一个JAR包部署

客户需要将项目前后端作为一个整体打包成jar&#xff0c;不使用nginx方式转发。使用框架是若依前后端分离&#xff0c;后端springboot&#xff0c;前端vue&#xff0c;目的就是把vue打入jar。 一、前端修改 ruoyi-ui/src/router/index.js文件 &#xff0c;将 mode: ‘history’…

数据结构之二叉搜索树(key模型与key_value模型)

二叉搜索树&#xff08;key模型与key_value模型&#xff09; 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3. ⼆叉搜索树的插⼊4. ⼆叉搜索树的查找5. ⼆叉搜索树的删除6. ⼆叉搜索树的实现代码7. ⼆叉搜索树key和key/value使⽤场景7.1 key搜索场景&#xff1a;7.2 key/value搜…

2-118 基于matlab的六面体建模和掉落仿真

基于matlab的六面体建模和掉落仿真&#xff0c;将对象建模为刚体来模拟将立方体扔到地面上。同时考虑地面摩擦力、刚度和阻尼所施加的力&#xff0c;在三个维度上跟踪平移运动和旋转运动。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-118 基于matla…

Kubernetes系列之一快速部署一套K8s集群(kubeadm方式)

最近本人在重温云原生相关的技术&#xff0c;说到云原生&#xff0c;必然绕不开Kubernetes&#xff0c;今天想跟大家聊的就是大名顶顶的Kubernetes。相信很多朋友在学习和使用Kubernetes的过程遇到各式各样不同的问题。我将从一个初学者的角度来给大家讲解一下Kubernete从安装、…

字节跳动青训营开始报名了!

关于青训营&#xff1a; 青训营是字节跳动技术团队发起的技术系列培训 &人才选拔项目;面向高校在校生&#xff0c;旨在培养优秀且具有职业竞争力的开发工程师。 本次技术训练营由掘金联合豆包MarsCode 团队主办课程包含前端、后端和 A 方向&#xff0c;在这个飞速发…

Ajax面试题:(第一天)

目录 1.说一下网络模型 2.在浏览器地址栏键入URL&#xff0c;按下回车之后会经历以下流程&#xff1a; 3.什么是三次握手和四次挥手&#xff1f; 4.http协议和https协议的区别 1.说一下网络模型 注&#xff1a;各层含义按自己理解即可 2.在浏览器地址栏键入URL&#xff0c;…

Spring Boot 进阶-详解Spring Boot整合数据库

在之前的例子中&#xff0c;我们介绍了如何在Spring Boot 框架中添加数据源配置。这篇文章我们来详细介绍一下如何整合Mybatis框架。 整合Mybatis框架 还是按照之前的套路&#xff0c;我们要整合Mybatis框架&#xff0c;首先需要加载对应的场景启动器。这里我们引入由Mybatis提…

gitlab-ci 集成 k3s 部署spring boot 应用

环境 一台ECS gitlab 16.10 一台ECS gitlab-runner docker方式 一台腾讯云服务器 k3s k3s version v1.30.5k3s1 (9b586704) go version go1.22.6 本地: idea 2024 准备开始 gitlab上创建"api"仓库,本地IDEA 创建spring boot web demo项目k8s-gitlab-demo. 确保能…

C语言-常见文件操作函数详解(fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite)

&#x1f30f;个人博客&#xff1a;尹蓝锐的博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 顺序读写数据常用函数 函数名调用形式功能返回值fgetcfgetc(fp)从指针变量fp指向的文件中读…

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

Kafka之基本概念

1、Kafka是什么&#xff1f; Kafka是由Scala语言开发的一个多分区、多副本&#xff0c;基于Zookeeper集群协调的系统。 那这个所谓的系统又是什么系统呢&#xff1f; 回答这个问题要从发展的角度来看&#xff1a;起初Kafka的定位是分布式消息系统。但是目前它的定位是一个分布…

Pr 视频效果:元数据和时间码刻录

视频效果/视频/元数据和时间码刻录 Video/Metadata & Timecode Burn-in 元数据和时间码刻录 Metadata & Timecode Burn-in效果是一种在视频画面上叠加显示剪辑元数据或时间码的工具。它允许在导出视频时&#xff0c;将需用的元数据信息直接刻录在画面上&#xff0c;方便…

Linux操作系统小项目——实现《进程池》

文章目录 前言&#xff1a;代码实现&#xff1a;原理讲解&#xff1a;细节处理&#xff1a; 前言&#xff1a; 在前面的学习中&#xff0c;我们简单的了解了下进程之间的通信方式&#xff0c;目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的&#xff0c;这是因…

MacOS编译和安装Poco库的方法

1.从官网git下载最新的poco源代码 在/usr/local路径下创建Poco文件夹&#xff0c;克隆Poco源代码 sudo git clone -b poco-1.13.3-release https://github.com/pocoproject/poco.git2.等了一会后&#xff0c;报错啦&#xff01;&#xff01;&#xff01; error: RPC failed…

Unity3D 单例模式

Unity3D 泛型单例 单例模式 单例模式是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c;提供访问实例的全局节点。 通常会把一些管理类设置成单例&#xff0c;例如 GameManager、UIManager 等&#xff0c;可以很方便地使用这些管理类单例&#xff0c;…

<Project-8 pdf2tx-MM> Python Flask应用:在浏览器中翻译PDF文件 NLTK OCR 多线程 指定翻译器 改进后的P6

项目概述 名字解释 缩写&#xff1a; pdf2tx-MM pdf file transfer to text content with Multi-threads and Multi-translators pdf2tx-MM 是一个基于 Flask 的 Web 应用程序&#xff0c;提供将 PDF 文件中的内容提取、翻译并展示。使用者上传 PDF 文件&#xff0c;应用程序…

计算机视觉之OpenCV vs YOLO

好多开发者希望搞明白OpenCV 和YOLO区别&#xff0c;实际上&#xff0c;二者在计算机视觉领域都有广泛应用&#xff0c;但它们有很大的不同。 一、OpenCV 概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它…