【TCP 协议】连接管理之 “三次握手,四次挥手”

哈喽,大家好~我是你们的老朋友:保护小周ღ  


本期为大家带来的是网络编程中的 TCP 传输控制协议保证数据可靠性传输的机制之一的——连接管理,通信双方采用 “三次握手” 来建立连接,采用 “四次挥手” 会断开连接,如何进行 ”握手” 和 “挥手” 操作,本文将为您解析~~


本期收录于博主的专栏JavaEE_保护小周ღ的博客-CSDN博客

适用于编程初学者,感兴趣的朋友们可以订阅,查看其它 “JavaEE基础知识”。
更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘


一、上期回顾

1.1 TCP 的报文结构

 争对TCP 报文重点做简单的解析:

序号和确认号:各占 32个二进制位 用于实现数据的可靠传输,所传送的字节流的每一个字节都会按顺序编号,保证数据传输的顺序和接收的顺序一样。序号表示当前发送的数据包的序号,确认号表示期望接收的下一个数据包的序号。序列号和确认号存在的意义就在于保证数据传输的顺序和接收的顺序一样。           

标志位:包括ACK、SYN、FIN、RST、PSH、URG六种各占一个二进制位。

默认置为 0 ,如果为标志位置为 1表示 true 的意思。

ACK:用于确认收到数据包;

SYN:判断通信双方是否建立了连接;

FIN:用于关闭连接;0

RST:用于重置连接;

PSH:用于提示接收方立即将数据推送给应用程序,而不是进入接收缓冲区;

URG:用于指示TCP包中有紧急数据。


1.2 确认应答和超时重传

确认应答:

当接收方收到发送方的发送的数据时,会给予发送方一个带有 TCP 首部的字段反馈,其中ACK = 1(一个二进制位), 表示我已经收到数据。 

针对以上机制,就有三种情况:

1. 数据直接在传输的过程中丢失,接收方没有收到数据,也就无法给予反馈。

2. 接受方收到数据后,给予发送方反馈,然而反馈报文在传输过程中丢了。

3. 当发送方一定时间没有接收到反馈,就会触发超时重传,然后重传的数据也丢了

超时重传:

如果发送方一定时间内没有等到接收方反馈的确认应答,就会对该段“数据包” 进行重传,期间如果还是没有接收到反馈发送方就会降低重传的频率过超一定的次数,TCP 就尝试给通信双发重新建立连接,如果连接失败,就会终止本次的网络通信。

这里的重新建立连接和终止本次网络通信的具体如何实现,是本文的主题~~

具体内容,大家可以阅读博主的上一篇博客:【TCP 协议】报文格式,数据可靠传输的机制(一)_保护小周ღ的博客-CSDN博客


二、连接管理

TCP 传输层协议,协议功能:保证通信双方数据可靠性传输。

保证的重要因素就是确认应答和超时重传的机制,接收方收到数据收会给予发送方反馈,这个反馈就是带有 TCP 固定首部的字段,TCP 首部中包含标志位信息,每一个标志位只占一个二进制位,所以根据 TCP 首部的标志位,我们就可以判断出当下TCP 数据包 的一个状态

TCP协议通信双方连接是通过三次握手来建立的。


2.1 三次握手

握手(handshake)指的是通信双方们,进行了网络交互,发送方和接收方之间,通过三次交互,建立了连接关系。连接关系指的是:通信双方各自记录了彼此的信息~

为什么提客户端和服务器呢,因为我们日常生活中的通信,通信双方并不是直接建立连接,而是先与服务器建立连接,信息通过服务器的 “中转”。

建立连接的 “意愿 ”一定是客户端主动先发起的

  1. 客户端向服务器发送SYN包,表示请求建立连接。

  2. 服务器收到SYN包后,回复一个SYN+ACK包,表示同意建立连接。

  3. 客户端收到SYN+ACK包后,再回复一个ACK包,表示连接建立成功。

SYN : (一个二进制位)置1 意思是一方要向另一方申请连接。表示当前 TCP 数据报是一个同步报文。

ACK : 一个二进制位),置1 意思是给予反馈,确认收到数据。表示当前 TCP 数据报是一个应答报文。

通信双方建立连接示意图:

博主这里采用了,打电话的场景模拟了一下 "建立连接" ,或许这样的通话有一定时间的前摇,但是主要的目的是——验证通信双方,各自的发送能力和接收能力是否正常,确认了交互过程的正常,这也是后续数据可靠性传输的基础。

为啥是三次握手,二次行不行,四次行不行?

首先两次握手,只能确认一方的 收发功能正常。

多次的握手呢,把中间的 AYN 和 ACK 拆分,分别发送,同样可以达到验证的目的,但是完全没有必要,因为一个 TCP 的数据段,需要经过层层的封装和分用(TCP / IP 五层通信模型),分两次发送,效率就显得很低。


2.3. 四次挥手

四次挥手就是通信双方断开连接,也是取一个很好听的名字。

断开连接的 “意愿” ,客户端和服务器都有可能发起。

  1. 客户端向服务器发送FIN包,表示要断开连接。

  2. 服务器收到 FIN 包后,回复一个 ACK 包,表示已经收到断开请求。

  3. 服务器再发送一个FIN包,表示同意断开连接。

  4. 客户端收到FIN包后,回复一个ACK包,表示已经收到断开请求。

FIN: (一个二进制位)置1 意思是一方要向另一方申请断开连接表示当前 TCP 数据报是一个结束报文。

通信双方断开连接示意图:

通过以上流程,断开连接的就是,通信双方各自给对方发送一个 FIN (结束报文),再各自给对此发送一个 ACK(应答报文)。

学习了 “三次握手” 之后,我们会发现有一个操作 SYN + ACK ,请求连接 + 确认应答,两个标志位可以在同一TCP 数据报中反馈,从而有了 三次交互


但是在断开连接这里, FIN 和 ACK 却是分开来传输的,所以断开连接就需要 通信双方进行 四次交互。

原因就是,SYN + ACK 都是由操作系统内核完成的,可以在同一时机触发。

TCP 属于传输层协议,作为程序开发者来说,重点关注的其实是应用层的开发,只是选择使用基于 TCP 协议 Socket 接口(API) 来开发。 传输层-网络层-数据链路层-物理层, 这 4 层实际上已经被操作系统封装好了,层层调用嘛,所以应用层直接使用传输层协议提供的接口,也就不需要太关注其他内部实现。

四次挥手 :

ACK  与 FIN 是不同的机触发的,ACK 由系统内核完成,所以在收到 FIN - 断开连接的请求之后,第一时间就会给发送方给予-确认应答。

FIN - 断开连接,是由应用程序代码控制的,在 Java 网络编程中,在调用 Socket (接口),中的 close() 方法时,才会触发 FIN ——  发送一个 TCP 数据报 FIN 置为 1 的结束报文。

例如:服务器在发现客户端发送了一个结束报文,所以就自己调用了 close() 方法,从而触发第二个结束报文。当然什么使用调用 close()方法这就根据程序是怎么写的。


关于程序没有调用 close() 触发结束报文的情况

例如:在客户端的程序,压根没写 close() , 这种情况,服务端给客户端发出结束请求 FIN ——服务器 接收不到客服端 反馈的结束报文。是不是连接就断开不了啊,不不不

如果将客户端的程序结束-进程结束-应用程序结束- 比如 qq 结束运行, 自动会触发 "close()", 资源会随着进程的结束而结束,由系统控制回收,因此就会触发 FIN 结束报文。此时客户端的 qq 应用程序运行结束了,但是 TCP 的连接还在(由操作系统内核维护),直到与 qq 服务器完成四次挥手~ 反之同理。

需要注意的是,TCP协议是全双工的,即客户端和服务器可以同时发送和接收数据。因此,在断开连接时,需要进行四次挥手,操作系统内核维护挥手过程以确保双方都已经断开连接。


好了,到这里,网络编程中的 【TCP 协议】连接管理之 “三次握手,四次挥手” 博主已经分享完了,希望对大家有所帮助,如有不妥之处欢迎批评指正。 

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

遇见你,所有的星星都落在我的头上……

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

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

相关文章

React + ts学习笔记

前提准备: 环境配置 安装node.js 官网安装:当前使用版本18.15.0 安装新的react应用: 运行命令新建react-app npx create-react-app study-ts-app当前版本: “react”: “^18.2.0”,“react-dom”: “^18.2.0”, 如果出现如…

CompletableFuture使用教学

CompletableFuture使用教学 一、开始一个线程异步执行不需要返回值 通过runAsync方式 //1.不加线程池方式 CompletableFuture<Void> completableFuture CompletableFuture.runAsync(() -> {System.out.println(Thread.currentThread().getName());//停顿几秒try {…

对象应用:C++字符串和vector,对象的new与delete重构

对象应用 C字符串和vector字符串创建方式字符串拼接字符串追加 字符串截断autovector创建方式vector操作 new与delete重构new与delete的工作步骤new与delete重构应用只能生成栈对象只能生成堆对象 C字符串和vector C的字符串是一个对象&#xff0c;存在于std标准库中&#xff0…

[echarts] legend icon 自定义的几种方式

echarts 官方配置项 地址 一、默认 图例项的 icon circle, rect, roundRect, triangle, diamond, pin, arrow, none legend: {top: 5%,left: center,itemWidth: 20,itemHeight: 20,data: [{icon: circle, name: 搜索引擎},{icon: rect, name: 直接访问},{icon: roundRect, n…

什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C

什么是FPGA&#xff1f;关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C FPGA基础知识&#xff1a;FPGA是英文Field&#xff0d;Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、CPLD等可编程器…

二叉排序树查找成功和不成功的平均查找长度

理解二叉树的特性: 1)结点:包含一个数据元素及若干指向子树分支的信息。 2)结点的度:一个结点拥有子树的数据成为结点的度。 3)叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。 4)分支结点:也称为非终端结点,度不为零的结点成为非终端结点。 5)结点…

【一起撸个DL框架】5 实现:自适应线性单元

CSDN个人主页&#xff1a;清风莫追欢迎关注本专栏&#xff1a;《一起撸个DL框架》GitHub获取源码&#xff1a;https://github.com/flying-forever/OurDL 文章目录 5 实现&#xff1a;自适应线性单元&#x1f347;1 简介2 损失函数2.1 梯度下降法2.2 补充 3 整理项目结构4 损失函…

DAD-DAS模型

DAD-DAS模型 文章目录 DAD-DAS模型[toc]1 产品服务:需求方程2 实际利率:费雪方程3 通货膨胀:菲利普斯方程4 预期通货膨胀&#xff1a;适应性预期5 货币政策规则&#xff1a;泰勒方程6 动态总供给-总需求方程&#xff08;DAS-DAD&#xff09;7 总供给冲击模拟 1 产品服务:需求方…

Elasticsearch:NLP 和 Elastic:入门

自然语言处理 (Natural Language Processing - NLP) 是人工智能 (AI) 的一个分支&#xff0c;专注于尽可能接近人类解释的理解人类语言&#xff0c;将计算语言学与统计、机器学习和深度学习模型相结合。 AI - Artificial Inteligence 人工智能ML - Machine Learning 机器学习DL…

永远不该忘记!科技才是硬道理,手中没有剑,跟有剑不用,是两回事

今天是全国防灾减灾日&#xff0c;距离2008年汶川大地震也已经过去15年了。但时至今日&#xff0c;看到那些图像视频资料&#xff0c;那种触及灵魂的疼痛仍是存在的&#xff0c;2008年的大地震在每个中国人身上都留下了无法抚平的伤疤。 2008年是所有中国人都无法忘记的一年&am…

Ims跟2/3G会议电话(Conference call)流程差异介绍

2/3G Conference call 合并(Merged)通话前,两路电话只能一路保持(Hold),一路通话(Active)。 主叫Merged操作,Hold的一路会变成Active,进入会议通话。 例如终端A跟C通话,再跟B通话,此时B就是Active状态,C从Active变成Hold状态。Merged进入会议通话后,C又从Hold变…

docker安装elasticsearch

前言 安装es么&#xff0c;也没什么难的&#xff0c;主要网上搜一搜&#xff0c;看看文档&#xff0c;但是走过的坑还是需要记录一下的 主要参考这三份文档&#xff1a; Running the Elastic Stack on Docker docker简易搭建ElasticSearch集群 Running Kibana on Docker …

Python-exe调用-控制台命令行执行-PyCharm刷新文件夹

文章目录 1.控制台命令行执行1.1.subprocess.Popen1.2.os.system()1.3.subprocess.getstatusoutput()1.4.os.popen() 2.PyCharm刷新文件夹3.作者答疑 1.控制台命令行执行 主要四种方式实现。 1.1.subprocess.Popen import os import subprocess cmd "project1.exe&qu…

只下载rpm包而不安装(用于内网虚拟机使用)

这里写目录标题 问题&#xff1a;解决&#xff1a;1. 安装yum-utils2. 下载rpm包3. 将rpm包拷贝到离线的虚拟机并安装 遇到的问题&#xff1a;1. error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file2. wrong ELF class: ELFCLA…

C++学习day--10 条件判断、分支

1、if语句 if 语句的三种形态 形态1&#xff1a;如果。。。那么。。。 #include <iostream> using namespace std; int main( void ) { int salary; cout << " 你月薪多少 ?" ; cin >> salary; if (salary < 20000) { cout <&…

【博客系统】页面设计(附完整源码)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、页面介绍 二、预期效果 1、博客列表页效…

大项目准备(2)

目录 中国十大最具发展潜力城市 docker是什么&#xff1f;能介绍一下吗&#xff1f; 中国十大最具发展潜力城市 按照人随产业走、产业决定城市兴衰、规模经济和交通成本等区位因素决定产业布局的基本逻辑&#xff0c;我们在《中国城市发展潜力排名&#xff1a;2022》研究报告…

websocket

&#x1f449;websocket_菜鸟教程*…*的博客-CSDN博客 目录 1、什么是Socket&#xff1f;什么是WebSocket&#xff1f; 2、WebSocket的通信原理和机制 3、WebSocket技术出现之前&#xff0c;Web端实现即时通讯的方法有哪些&#xff1f; 4、一个简单的WebSocket聊天小例子 …

prometheus监控数据持久化

前置条件 1.规划两台主机安装prometheus # kubectl get nodes --show-labels | grep prometheus nm-foot-gxc-proms01 Ready worker 62d v1.23.6 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,kubernetes.io/archamd64,kubernetes.io…

5款办公必备的好软件,你值得拥有

随着网络信息技术的发展&#xff0c;越来越多的人在办公时需要用到电脑了。如果你想提高办公效率&#xff0c;那么就少不了工具的帮忙&#xff0c;今天给大家分享5款办公必备的好软件。 1.文件管理工具——TagSpaces TagSpaces 是一款开源的文件管理工具,它可以通过标签来组织…