Java【网络原理2】TCP 协议的三次握手和四次挥手到底是什么意思?

news2024/11/17 9:25:03

文章目录

  • 前言
  • 一、三次握手
    • 三次握手的作用
  • 二、四次挥手
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

之前的文章介绍了基于 TCP 协议的 SocketAPI 使用, 写了一个简单的回显程序, 对服务器客户端的网络通信和 TCP 协议有了一个基本认识

TCP 协议是一种有链接的可靠传输协议, 并且 TCP 设计的宗旨是保证可靠性的同时, 尽可能地提高传输效率, 因此 TCP 具有八大机制

  • 1️⃣连接管理(三次握手 + 四次挥手)
  • 2️⃣确认应答
  • 3️⃣超时重传
  • 4️⃣滑动窗口
  • 5️⃣流量控制
  • 6️⃣拥塞控制
  • 7️⃣延迟应答
  • 8️⃣捎带应答

在这里插入图片描述

看不懂吧, 没关系, 我会出手, 先记住2~3 用来保证可靠性, 4~8 用来提高效率

在使用 TCP 协议进行网络通信时, 首先需要客户端和服务器建立连接, 通信结束服务器和客户端要断开连接, 这个过程的背后就是 TCP 的连接管理机制, 也是非常重要的知识点, 本片就重点介绍这个连接管理机制的原理


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、三次握手

📌服务器和客户端在通信之前, 要建立连接, 这个过程称作“三次握手”, 在程序中对应的就是 ServerSocket 类里面的 accept 方法

👉一次握手就是一次交互, 服务器和客户端经历了三次交互之后, 双方才能建立连接, 如图 :
在这里插入图片描述

📌注意 : 第一个发送 syn (同步报文段)的是客户端

  • 图上明明是四次交互, 为什么说是三次握手呢 ?
    由于三次握手中的发送 syn 和 ack 都是操作系统内核完成的, 我们程序员干预不了也感知不到, 服务器给客户端发的两条( syn 和 ack )是同一时机的, 所以实际上是合并成一条发送了
    (后面会写文章介绍TCP首部的格式, 到时候就会知道如何实现了)

所以正确的三次握手过程如下图所示 :
在这里插入图片描述

  • syn 是表示请求建立的报文段, 发送这个可以理解, 为什么还要有一个 ack 报文段呢 ?
    这是 TCP 的确认应答机制, 用来保证可靠传输, 后续的文章中还会介绍

三次握手的作用

相当于是正式通信前的检查, 这个过程中发送方和接收方都进行了收发数据报, 如果顺利, 就能确认双方发送数据和接收数据的能力都是正常的


二、四次挥手

📌服务器和客户端在通信之后, 要断开连接, 这个过程称作“四次挥手”, 在程序中对应的就是 Socket 类里面的 close 方法

👉一次挥手就是一次交互, 服务器和客户端经历了四次交互之后, 双方才能断开连接, 如图 :
在这里插入图片描述

📌 和三次握手不同, 第一次发送 fin(结束报文段)的可以是客户端也可以是服务器

下面是一些关于四次挥手的解释说明

  • 1, 四次挥手过程中, 被发送 fin 的一端(图中是服务器)的 ack 和 fin 能否合并成一条发送呢 ?
    通常情况下不能, 因为三次握手中的 syn 和 ack 都是由内核完成的, 而四次挥手中的 fin 是由于调用了 close 方法才发送的, 不能保证一端 close 之后, 另一端的 close 方法什么时候调用, 所以 ack 和 fin 大概率不是同一时机发送的, 但是也有小概率因为 TCP 的捎带应答机制进行合并, 大部分情况下是四次交互, 所以称作四次挥手

  • 2, 一端调用了 close 方法, 发送了 fin , 怎么还能进行后续的三次交互呢 ?
    调用 close 方法只是关闭了 socket 文件, 操作系统内核仍然会维护服务器和客户端的连接, 等到四次挥手之后才彻底断开连接

  • 3, 如果不调用 close 方法, 怎么发送 fin ?
    如果某一端不调用 close 方法, 就会在其进程结束时会由操作系统内核自动关闭 socket 文件, 还是会向对端发送 fin


总结

以上就是本篇的全部内容, 主要介绍了TCP协议中的三次握手和四次挥手, 握手和挥手都是指服务器和客户端的交互, 重点理解其中的交互过程即可

另外要注意三次握手的作用是确保发送方和接收方拥有正常的通信能力

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

mysqlbinlog delete恢复成insert

不小心把数据删掉了 首先要拿到binlog文件 执行以下命令行 /usr/local/mysql/bin/mysqlbinlog --base64-outputdecode-rows --start-datetime“2023-05-19 09:01:32” --stop-datetime“2023-05-19 09:01:35” -v /Users/zylong/Downloads/mysql-bin.003178 --result-file/Use…

第一章 数据库操作

一、 数据库操作 1.1 创建数据库 创建数据库是指在数据库系统中划分一块空间,用来存储相应的数据,这是进行表操作的基础,也是数据库管理的基础在MySQL中创建数据库之前,可以使用show语句来显示当前已经存在的数据库,…

java基于springboot协同过滤算法的网上图书商城推荐系统m44xq2

开发环境 开发语言:Java 框架:springboot 技术:JSP JDK版本:JDK1.8 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven3.3.9 浏览器:谷歌浏览器功能介绍 Spring…

微服务—Redis实用篇-黑马头条项目用户签到功能(使用bitmap实现)与UV统计

微服务—Redis实用篇-黑马头条项目用户签到功能(使用bitmap实现)与UV统计 1、用户签到 1.1、用户签到-BitMap功能演示 我们针对签到功能完全可以通过mysql来完成,比如说以下这张表 用户一次签到,就是一条记录,假如有…

npm 账户的创建、测试、登录

目录 1、账户的创建 2、测试创建的账户 3、通过电子邮件接收一次性密码 3.1 使用一次性密码登录: 3.2 启用双因素身份验证: 3.3 无法访问电子邮件 1、账户的创建 如果您还没有npm用户帐户,您可以创建一个帐户,以便在公共注…

MATLAB 之 二维图形绘制的基本函数和辅助操作

文章目录 一、绘制二维曲线的基本函数1. plot 函数的基本用法2. 含多个输入参数的 plot 函数3. 含选项的 plot 函数4. 双纵坐标函数 plotyy 二、绘制绘制图像的辅助操作1. 图形标注2. 坐标控制3. 图形保持4. 图形窗口的分割 二维图形是将平面坐标上的数据点连接起来的平面图形。…

C++的cout详解

2023年5月20日,周六早上: 我发现我找不到非常详细的cout类的成员函数,只好自己写了。 不定期更新。 cout的继承关系 cout类继承自ostream类,ostream类继承自ios类,ios类继承自ios_base类 cout类拥有的所有成员函数 …

包图的画法

包图 1.包图 1.1概念 包图是UML中用来组织模型元素的模型元素。 可以把包图比作一个存放模型元素的箱子或者是容器,里面可以可以存放各种各样的模型元素。 包图中可以包含的信息主要有:类 构件 用例 结点 活动 状态 等其他的相关的模型元素。 1.2包…

秒杀场景checklist

在面试中经常碰到的问题,列下来备忘。

车载以太网 - SomeIP - 协议用例 - Messages_01

目录 Service Discovery Messages 1、验证Instance ID为0xFFFF时DUT需要返回该Serveice ID包含的所有Instance ID

chatgpt赋能Python-python3去掉空格

Python3去掉空格——让你的代码更整洁高效 在Python3编程中,去掉无用的空格可以使代码更具可读性和高效性。因此,在本文中,我们将介绍如何使用Python3去掉空格,包括字符串中的空格和代码文件中的空格。 字符串中的空格 在Pytho…

学系统集成项目管理工程师(中项)系列23a_信息系统集成及服务管理(上)

1. 提供的专业信息技术咨询服务、系统集成服务、技术支持服务、运行维护服务等工作 2. 信息技术咨询服务 2.1. 信息系统集成及服务的前端环节 2.2. 为企业提供信息化建设规划和解决方案 3. 原因 3.1. 不具备技术实力的系统集成商搅乱信息系统集成及服务市场 3.2. 一些建设…

chatgpt赋能Python-python3快捷键大全

Python3快捷键大全 介绍 Python是一种高级编程语言,广泛应用于科学计算、人工智能、网络编程、Web开发和数据分析等领域。Python具有简洁、易读、易学和可扩展等特点,因此成为了生产力非常高的编程语言之一。Python3是Python语言的最新版本&#xff0c…

印度和巴基斯坦网络优势和劣势的综合研究

由于网络空间在当今世界的重要性日益增加,各国已将网络安全放在首位并开发技能来保护其重要基础设施、数字资产和私人数据。 没有豁免适用于印度和巴基斯坦,这两个拥有动荡历史的核武器邻国。 这项研究深入比较了他们的网络能力,并评估了巴…

基于DBSCAN密度聚类的风电-负荷场景削减方法

​目录 ​ 1 主要内容 基于密度聚类的数据预处理: 场景提取: 算法流程: 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《氢能支撑的风-燃气耦合低碳微网容量优化配置研究》第三章内容,实现的是基于DBSCAN…

shiro与Spring Boot 整合

目录 框架整合 创建模块 添加依赖 添加配置文件 添加启动类 ​编辑 登录认证实现 后端接口服务实现 实现前端页面 框架整合 创建模块 添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-p…

音视频windows安装ffmpeg6.0并使用vs调试源码笔记

建立在上一步&#xff0c;vs已经能够正常调试qt项目&#xff0c;可以实现&#xff1a; 1&#xff1a;qt可以使用mvsc &#xff08;使用cdb&#xff09;进行调试。 2&#xff1a;vs已经可以加载qt项目&#xff0c;借助vs进行调试。 本文目标&#xff1a;编译ffmpeg库&#xf…

chatgpt赋能Python-python3的内置函数

Python3内置函数大全 Python3是一种高级编程语言&#xff0c;拥有丰富的内置函数库。这些内置函数包括许多核心功能和常用操作。在这篇文章中&#xff0c;我们将介绍一些最常用和最有用的Python3内置函数。 1. print() print()函数用于将输出打印到控制台。它是Python中最常…

chatgpt赋能Python-python3怎么换行

Python3中的换行是许多初学者和经验丰富的工程师们都需要掌握的关键概念之一。在本文中&#xff0c;我们将探讨Python3中如何使用换行&#xff0c;包括介绍和结论。 什么是Python3中的换行&#xff1f; 在Python3中&#xff0c;换行是指将一行代码分成多个部分&#xff0c;以…

数据结构-单调栈1

先介绍一下单调栈是什么 一种特别设计的栈结构&#xff0c;为了解决如下的问题&#xff1a; 给定一个可能含有重复值的数组arr&#xff0c;i位置的数一定存在如下两个信息 1&#xff09;arr[i]的左侧离i最近并且小于(或者大于)arr[i]的数在哪&#xff1f; 2&#xff09;arr[…