「网络原理」三次握手四次挥手

🎇个人主页:Ice_Sugar_7
🎇所属专栏:计网
🎇欢迎点赞收藏加关注哦!

三次握手&四次挥手

  • 🍉连接管理
    • 🍌三次握手
    • 🍌意义
    • 🍌四次挥手
    • 🍌TCP 状态转换
      • 🥝LISTENING 状态
      • 🥝ESTABLISHED 状态
      • 🥝CLOSE_WAIT & TIME_WAIT 状态

🍉连接管理

有连接是 TCP 的特点之一

socket = new Socket(serverIp,serverPort);

执行这行代码其实就是在建立连接,不过这只是在调用 socket api,真正建立连接是在操作系统内核完成的,见下图:

在这里插入图片描述

🍌三次握手

内核通过三次握手来完成建立连接的过程
在此之前得先介绍一种数据报—— syn

syn 是一个特殊的 TCP 数据报,它没有载荷,因此不会携带应用层数据;
同时标志位中的 SYN 值为 1
虽说无载荷,但是它也有 IP 报头、以太网数据帧帧头、TCP 报头等。其中 TCP 报头和 IP 报头分别包含客户端自己的端口和 IP

syn 其实是 synchronized 的缩写,它是多线程的常客,意为同步。多线程使用 synchronized 加锁实现的同步是协调多个线程间的执行顺序;而 TCP 这里的同步是指进入连接状态,客户端和服务器相互配合完成一系列工作。可以理解为 syn 就是客户端给服务器打个招呼,表示要与它建立连接,服务器收到后要发个 ack 回应一下,同时发个 syn 表示同意连接

在这里插入图片描述

🍌意义

  1. 三次握手可以初步确认通信链路是否畅通,这是确保可靠性的前提条件
  2. 三次握手可以验证通信双方发送能力和接收能力是否正常

在这里插入图片描述
由此衍生出一道面试题:能否握两次手?四次呢?
A:两次肯定不行,因为服务器这边还无法确认自己的发送能力和对端的接收能力是否正常,因此需要服务端再来一次握手,把信息同步给服务器;四次可以,但是没必要

  1. 三次握手的过程中也会协商一些必要的参数
    通信是客户端和服务器两端共同配合完成的,所以有些参数要进行协商,这些参数往往是在“选项”中体现的

在这里插入图片描述
我们前面说“选项”可有可无,最少占 0 个字节,最多占 40 字节(报头最大长度为 60,去掉固定的 20,就剩下 40 字节)。选项中的信息我们不用去深究,不过有一个信息是比较关键的 —— TCP 通信的序号起始值
TCP 在一次通信过程中,序号不是从 0 或 1 开始的,而是先选择一个比较大的数字,从它开始计算,而且即使是同一个客户端和服务器,每次连接的起始值都不同。这里的“不同”不是随机给一个值,而是经过一系列的分配策略得出的。这样做的好处在于避免处理到上次连接的数据报
数据报在传输过程中遇到阻塞,迟迟没有到达对端,可能在本次连接断开后还没到达,等到下次连接建立时才到达,但此时已经是别的客户端了,不适合处理上次连接的数据报,应该把它丢弃


🍌四次挥手

每个客户端/服务器都要保存对端的信息,这些信息需要使用一定的数据结构来存储,断开连接的本质就是把对端的信息从数据结构中删掉/释放掉
四次挥手中,服务器和客户端其中一方先调用 socket.close(),然后触发 FIN,即向对端发送 FIN 结束报文段
(除了调用 close(),结束进程也会触发 FIN。这两种方式本质都是关闭 socket 文件)
假设是客户端请求断开连接,那么四次挥手流程如下:

在这里插入图片描述
注意四次挥手中间的两步不像三次握手,不一定可以合并

在这里插入图片描述
在这里插入图片描述
下面总结一下这两者之间的相似之处和不同之处
相似点:
都是通信双方中某一方给对方发起一个 syn/fin,交互过程中中间两个数据报是由同一个机器发出的
不同点:

  1. 三次握手中间两次可以合并为一次;四次挥手不一定
  2. 三次握手一定是客户端主动发起连接请求;而四次挥手可以由客户端或服务器发起

🍌TCP 状态转换

前面说 TCP 服务器和客户端都有一定的数据结构保存连接的信息,在数据结构中有个属性叫作状态,操作系统内核根据不同的状态决定应该干什么

🥝LISTENING 状态

表示服务器创建好 serverSocket,并且绑定好端口号了
设定端口号为 5000,启动服务器后在控制台查询服务器状态,得到如下信息:

在这里插入图片描述

🥝ESTABLISHED 状态

表示客户端和服务器已经建立连接(三次握手结束了)
启动客户端后,再次查询状态:

在这里插入图片描述
接下来看一下三次握手中的状态变化

在这里插入图片描述


🥝CLOSE_WAIT & TIME_WAIT 状态

前者表示接下来代码中需要调用 close 来主动发起 FIN。收到对方的 FIN 后会进入这个状态
本端给对方发起 FIN 后,对端也给本端发 FIN 之后,本端就会进入 TIME_WAIT 状态
主动断开连接的一端会进入 TIME_WAIT 状态;被动断开的一端则是进入 CLOSE_WAIT 状态
接下来看一下四次挥手中的状态变化,假设是客户端主动断开 TCP 连接

在这里插入图片描述

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

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

相关文章

【web本地存储】storage事件,StorageEvent对象介绍

storage事件 Web Storage API 内建了一套事件通知机制,当存储区域的内容发生改变(包括增加、修改、删除数据)时,就会自动触发storage事件,并把它发送给所有感兴趣的监听者,因此,如果需要跟踪存…

Flink⼤状态作业调优实践指南:状态报错与启停慢篇

摘要:本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富,本文分享终篇状态报错与启停慢篇,主要分为以下四个部分: 检查点和快照超时的诊断与调优 作业快速启动和扩缩容方案 总结 阿里云企业级…

creo学习一

设置好当前配置后,导出config配置文件,并覆盖掉此路径下的旧文件,使得新配置永久生效,这样每次打开软件都是新配置的设置: 系统颜色的导出: 打开版本的问题: 不能有弱尺寸: 注意&a…

分享一个 .NET Core Console 项目中应用 NLog 写日志的详细例子

前言 日志在软件开发中扮演着非常重要的角色,通常我们用它来记录应用程序运行时发生的事件、错误信息、警告以及其他相关信息,帮助在调试和排查问题时更快速地定位和解决 Bug。 通过日志,我们可以做到: 故障排除和调试&#xff…

【经验总结】ECU休眠后通过一帧NM报文唤醒ECU后在要求时间内通过第二帧NM报文需要唤醒网络

目录 前言 环境 1.需求描述 2.测试方法 3.完成需求的方法 4.原理详解 4.1 CanTrcv 接收到第一帧NM报文 4.2 EcuM接收到唤醒事件 4.3 CanTcv接收到第二帧NM报文 4.4 EcuM完成唤醒源校验 5. 总结 前言 关于CAN收发器参与下的ECU休眠唤醒问题我们已经写过很多文章,&l…

【C#/C++】C++定义一个返回uchar*的函数,调用函数时接收的数据异常

C定义一个返回uchar*的函数,调用函数时接收的数据异常 1、场景2、错误代码3.正确写法 1、场景 我是想实现一个图像畸变矫正的函数,由于相机的硬件原因(相机内外参数,视野)会导致我们取到的图有一定程度的畸变&#xff…

Reinforcement Learning学习(三)

前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…

MySQL普通表转换为分区表实战指南

码到三十五 : 个人主页 引言 本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表。分区表在处理庞大数据集时展现出显著的性能优势,不仅能大幅提升查询速度,还能有效简化数据维护工作。通过掌握这一技巧能够更好地应对数据密集型应…

《编程小白变大神:DjangoBlog带你飞越代码海洋》

还在为你的博客加载速度慢而烦恼?DjangoBlog性能优化大揭秘,让你的网站速度飞跃提升!本文将带你深入了解缓存策略、数据库优化、静态文件处理等关键技术,更有Gunicorn和Nginx的黄金搭档,让你的博客部署如虎添翼。无论你…

解决阿里云的端口添加安全组仍然无法扫描到

发现用线上的网站扫不到这个端口,这个端口关了,但是没有更详细信息了 我用nmap扫了一下我的这个端口,发现主机是活跃的,但是有防火墙,我们列出云服务器上面的这个防火墙list,发现确实没有5566端口 参考&a…

大数据解决方案案例:电商平台日志分析

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

AI作画工具介绍

目录 1.概述 2.Stable Diffusion 2.1.诞生背景 2.2.版本历史 2.3.优点 2.4.缺点 2.5.应用场景 2.6.未来展望 3.Midjourney 3.1.诞生背景 3.2.版本历史 3.3.优点 3.4.缺点 3.5.应用场景 3.6.未来展望 4.总结 1.概述 AI作画工具是一种运用人工智能技术&#xff…

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间…

require.context()函数介绍

业务需求&#xff1a; 前端Vue项目怎样读取src/assets目录下所有jpg文件 require.context()方法来读取src/assets目录下的所有.jpg文件 <template><div><img v-for"image in images" :src"image" :key"image" /></div> …

代码随想录打卡第一天(补)

数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 704. 二分查找 最简单的二分思想的应用&#xff0c;主要锻炼写两种方法 两种方法的区别就是&#xff1a;右指针的每次变化&#xff0c;可能还有就是最后找到目标值后的一个下标到底是什么 二分思想&#xff1…

Python实现Stack

你好&#xff0c;我是悦创。 Python 中的栈结构是一种后进先出&#xff08;LIFO, Last In, First Out&#xff09;的数据结构&#xff0c;这意味着最后添加到栈中的元素将是第一个被移除的。栈通常用于解决涉及到反转、历史记录和撤销操作等问题。在 Python 中&#xff0c;你可…

九、C语言:隐式类型转换(整型提升与算数转换)

一、隐式类型转换 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 二、整型提升 //1.表达式的整型运算要在CPU的相应运算器件内执行&#xff…

I/O 设备与设备控制器

目录 I/O 设备 1. 键盘和鼠标 2. 显示器 3. 磁盘 4. 打印机 5. 网络适配器 设备控制器 1. 数据传输 2. 缓冲管理 3. 中断处理 4. 设备初始化 5. 错误检测与恢复 6. 设备控制器的组成部分 7. 示例图解 内存映像 I/O 原理 优点 实现方式 应用场景 I/O 通道 I…

Nginx 精解:正则表达式、location 匹配与 rewrite 重写

一、常见的 Nginx 正则表达式 在 Nginx 配置中&#xff0c;正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例&#xff1a; 当涉及正则表达式时&#xff0c;理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子&#xff1a; ^&#xff1…

langchainJS -结构化输出(StructuredOutputParser )

在LangChain的帮助下&#xff0c;我们可以为输出定义模式。StructuredOutputParser 使用定义的名称和描述来分析和构建模型预测的输出。 const productParser StructuredOutputParser.fromNamesAndDescriptions({Name: "Name of The Product",Description: "De…