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

「TCP 重要机制」三次握手四次挥手

🎇个人主页: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 连接

在这里插入图片描述

相关文章:

「TCP 重要机制」三次握手四次挥手

🎇个人主页:Ice_Sugar_7 🎇所属专栏:计网 🎇欢迎点赞收藏加关注哦! 三次握手&四次挥手 🍉连接管理🍌三次握手🍌意义🍌四次挥手🍌TCP 状态转换…...

Java数据库编程

引言 在现代应用开发中,与数据库交互是不可或缺的一部分。Java提供了JDBC(Java Database Connectivity) API,允许开发者方便地连接到数据库并执行SQL操作。本文将详细介绍Java数据库编程的基础知识,包括JDBC的基本概念…...

决策树算法介绍:原理与案例实现

一、引言 决策树是一种常用于分类和回归任务的机器学习算法,因其易于理解和解释的特点,在数据分析和挖掘领域有着广泛应用。本文将介绍决策树算法的基本原理,并通过一个具体案例展示如何实现和应用该算法。 二、决策树算法原理 1. 决策树结…...

业务代表模式

业务代表模式 引言 在软件工程中,设计模式是解决常见问题的经典解决方案。它们为开发人员提供了一种方法,以优雅和可重用的方式处理软件开发中的挑战。业务代表模式(Business Delegate Pattern)是一种行为设计模式,它主要关注于将业务逻辑与表示层(如用户界面)分离,以…...

LeetCode 算法:反转链表 c++

原题链接🔗:反转链表 难度:简单⭐️ 题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2:…...

【多线程】Thread类及其基本用法

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. Java中多线程编程1.1 操作系统线程与Java线程1.2 简单使用多线程1.2.1 初步创建新线程代码1.2.2 理解每个…...

Springboot 整合 Flowable(一):使用 flowable-UI 绘制流程图

目录 一、Flowable简介 二、Flowable 与 Activiti 的区别 三、流程图的绘制(以员工请假流程图为例) 1、下载 flowable 的压缩包: 2、启动包中的 tomcat 3、登录页面 4、绘制结束,导出 bpmn20.xml文件 一、Flowable简介 Fl…...

课设--学生成绩管理系统(一)

欢迎来到 Papicatch的博客 文章目录 🍉技术核心 🍉引言 🍈标识 🍈背景 🍈项目概述 🍈 文档概述 🍉可行性分析的前提 🍈项目的要求 🍈项目的目标 🍈…...

thinkphp5模型的高级应用

ThinkPHP5 是一个基于 PHP 的轻量级框架,它提供了许多便利的功能来简化 Web 开发。在 ThinkPHP5 中,模型(Model)是 MVC(Model-View-Controller)架构中的重要组成部分,负责处理数据逻辑。以下是一…...

XML XSLT:技术与应用解析

XML XSLT:技术与应用解析 XML(可扩展标记语言)和XSLT(XML样式表转换语言)是现代信息技术中不可或缺的工具。本文将深入探讨XML和XSLT的概念、技术细节以及它们在实际应用中的作用。 XML简介 XML是一种用于存储和传输…...

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…...

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…...

力扣-2269. 找到一个数字的 K 美丽值

文章目录 力扣题目代码工程C实现python实现 力扣题目 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。 子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前…...

一个在C#中集成Python的例子

一个在C#中集成Python的例子。在C#中可以执行Python脚本,在Python中也可以调用C#宿主中的功能(clr.AddReference(Business))。 文件说明 Debug为执行目录 Mgr.exe为执行文件 Py\init.py为python初始化脚本 Py\Lib.zip为python需要的模块&…...

基于RandLA-Net深度学习模型的激光点云语义分割

一、场景要素语义分割部分的文献阅读笔记 RandLA-Net是一种高效、轻量级的神经网络,其可直接逐点推理大规模点云的语义标签。RandLA-Net基于随机点采样获得了显著的计算和内存效率,并采用新的局部特征聚合模块有效地保留了几何细节,弥补了随机…...

C语言的结构体与联合体

引言 C语言提供了结构体和联合体两种聚合数据类型,使得程序员可以创建包括多个数据类型的复杂数据结构。结构体用于将不同类型的数据组合成一个单元,而联合体用于在同一存储空间中存储不同类型的数据。本篇文章将详细介绍C语言中的结构体和联合体&#x…...

React Hooks小记(三)_forwardRef

forwardRef 【写在前面】 ​ 1、ref 的作用是获取实例,但由于函数组件不存在实例,因此无法通过 ref 获取函数组件的实例引用,而 React.forwardRef 就是用来解决这个问题的。 ​ 2、React.forwardRef 会创建一个 React 组件,这个组…...

面试复习记录

六级终于结束了,之前背的八股几乎也忘得差不多了,今天开始继续准备秋招,以下是每天的安排,会按时更新,就当是一种对自己的督促,也欢迎小伙伴们一起来互相监督。 2024.6.16 力扣:sql基础题库50…...

块级元素与行内元素详解

在网页设计与开发中,元素根据其在页面布局中的表现可分为两大类:块级元素(Block-level Elements)和行内元素(Inline Elements)。理解它们的特性和使用规则对于构建结构清晰、布局合理的网页至关重要。 块级…...

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题 如果你有一个带有默认参数值的 Kotlin 函数,如何从 Java 调用它而无须为每个参数显式指定值? 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法,这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...