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

news2024/10/11 1:13:32

目录

  • 引言
  • 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.coloradmin.cn/o/2203754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

渗透测试之 域AD渗透手法【密码喷洒技术】手法详解 以及相关示例

说明: 域内密码喷洒工具: Kerbrute DomainPasswordSpray.ps1 原理抓个包分析一下&#xff1a; 域内用户枚举攻击防御&#xff1a; 流量检测&#xff1a; 说明: 域内密码喷洒&#xff08;Password Spraying&#xff09;一般和域内用户名枚举一起使用。 域内密码喷洒工具:…

slam系列1:open3d入门笔记

1. 读写数据 这里有很多测试用的pcd文件&#xff1a; https://github.com/PointCloudLibrary/data/blob/master/tutorials/ import open3d as o3d pcd o3d.io.read_point_cloud("test.pcd") o3d.io.write_point_cloud("write.pcd", pcd, True) # 默认fa…

SF6气体密度监测仪市场研究:主要企业的市场份额已超过37.13%

SF6气体密度监测仪是一种专用于监测和测量六氟化硫&#xff08;SF6&#xff09;气体密度的设备。SF6气体因其优异的绝缘性能和灭弧能力&#xff0c;被广泛应用于电力行业&#xff0c;尤其是在气体绝缘金属封闭开关设备&#xff08;GIS&#xff09;和断路器等关键设备中。随着电…

Java 函数式编程(1 万字)

此笔记来自于B站黑马程序员 good Java 历史版本及其优势 函数式编程, Stream API 一.函数伊始函数、函数对象 函数对象 行为参数法 延迟执行 a-lambda b-方法引用 复习小测 Math::random () -> Math.random()Math::sqrt (double number) -> Math.sqrt(number)Student:…

喜大普奔!eBay英国站取消个人卖家几乎所有销售费用!

二手电商市场竞争愈发激烈&#xff0c;eBay开始放大招了&#xff01;为什么说是取消个人卖家的几乎所有销售费用呢&#xff1f;一起来了解一下—— eBay英国站个人卖家无需支付最终交易费或监管运营费&#xff0c;这大大减轻了个人卖家的交易成本。不过需要注意的是&#xff0…

后端开发——规则引擎简介(Drools)

目录 什么是规则引擎&#xff1f;规则引擎带来的好处;Drools案例规则引擎的工作原理及应用场景常见的规则引擎及对比工作流引擎与规则引擎有什么不同 什么是规则引擎&#xff1f; 规则引擎&#xff0c;听起来高大上&#xff0c;其实可以理解为一种帮助你做“决策”的工具。你可…

使用浏览器原生API实现录屏功能

好早之前写了个小deme,本来都忘了,现在无意中又翻出来了,所以也来记录一下吧! 废话不说了,直接上代码了: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content=&q…

byte[]/InputStream/MultipartFile之间进行转换

前言 问题产生&#xff1a; 最近开发项目的时候&#xff0c;遇到了文件上传对象转换的问题 -> 我在对接抖音开放平台的时候&#xff0c;有一个图片上传的接口&#xff0c;需要将byte[]转为MultipartFile 对象&#xff0c;但是发现根本没有这样的工具类&#xff0c;后面翻阅…

无人机之巡航控制篇

一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息&#xff0c;并将其反馈给控制器。控制器根据反馈信息和任务需求&#xff0c;计算出无人机的控制指令&#xff0c;并将其发送给执行机构。执行机构根据控制器的控制指令&#xff0c…

数据结构与算法——Java实现 33.堆排序

刻意去找的东西&#xff0c;往往是找不到的。 天下万物的来和去&#xff0c;都有它的时间。 —— 24.10.10 使用堆进行排序 算法描述 1.heapify 建立大顶堆&#xff08;所有结点的父元素大于子元素&#xff09; 2.将堆顶与堆底交换(最大元素被交换到堆底)&#xff0c;缩小并…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架&#xff0c;但是它是生成漂亮测试报告的开源工具&#xff0c;搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上&#xff0c;对测试数据进行处理统计&#xff0c;生成格式统一、美观的测试报告。 …

java反射Class类的api

目录 Class类 1.构造器相关 1&#xff09;Constructor getConstructor(Class... parameterTypes): 2&#xff09;Constructor[] getConstructors(): 3&#xff09;Constructor getDeclaredConstructor(Class... parameterTypes): 4&#xff09;Constructor[] getDeclaredConstr…

国外火出圈儿的PM御用AI编程工具Bolt.new效果干不过国产的CodeFlying?号称全新定义全栈开发流程?

不知道大家最近有没有发现国外的很多AI都在挤破脑袋想去提升大模型的编程能力&#xff0c; 离我们最近的是上周Openai 发布的全新模型GPT-4o-Canvas&#xff0c; 拥有超强的代码编写能力。 另外还有LlamaCoder、Cursor、Claude artifacts、Replit... 光是今年一年就推出了好…

深入理解Transformer的笔记记录(精简版本)---- Transformer

自注意力机制开启大规模预训练时代 1 从机器翻译模型举例 1.1把编码器和解码器联合起来看待的话,则整个流程就是(如下图从左至右所示): 1.首先,从编码器输入的句子会先经过一个自注意力层(即self-attention),它会帮助编码器在对每个单词编码时关注输入句子中的的其他单…

xtu oj 四位数

样例输入# 2 1990 1111样例输出# 5 0 分离整数与合并 AC代码 #include<stdio.h> //判断四个数码是否相等 int Judge(int n){int flag1;int gn%10,sn/10%10,bn/100%10,qn/1000;if(gs&&gb&&gq)flag0;return flag; } int main(){int T;scanf("%d…

AI无人直播风口,云微客替你抓住了

现在很多老板都在找风口&#xff0c;其实风口就是我们大家看得见、摸得着的东西&#xff0c;就比如说近期比较火热的直播带货就属于是一个风口。可能很多老板会说直播、短视频之类的风口过于高科技&#xff0c;搞不来也搞不懂&#xff0c;跟自己好像没太大关系。 其实不然&…

嵌入式开发:STM32 硬件 CRC 使用

测试平台&#xff1a;STM32G474系列 STM32硬件的CRC不占用MCU的资源&#xff0c;计算速度快。由于硬件CRC需要配置一些选项&#xff0c;配置不对就会导致计算结果错误&#xff0c;导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…

【二叉搜索树】1 leetcode 98 验证二叉搜索树

1 题目描述 题目链接&#xff1a;验证二叉搜索树 2 题目解析 搜索二叉树的特点就是&#xff0c; 中序遍历之后的值是有序的。 根据这个性质&#xff0c;可以对树进行中序遍历&#xff0c;将遍历的结果存入到vector中最后判断vector中的值的顺序。如果是从小到大有序的&…

变色龙算法(CSA)的MATLAB代码复现

目录 1 变色龙算法优化BP神经网络代码复现 2 变色龙算法优化支持向量机代码复现 3 变色龙算法优化长短期记忆神经网络代码复现 1 变色龙算法优化BP神经网络代码复现 1&#xff09;单输出回归预测&#xff1a;单输出回归预测&#xff1a;变色龙算法优化BP神经网络模型&#…

MinIO分片上传超大文件(纯服务端)

目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…