JavaEE 网络原理——TCP的工作机制(中篇 三次握手和四次挥手)

文章目录

  • 一、TCP 内部工作机制——连接管理
    • 1. 连接(三次握手)
      • (1).有连接和确认应答之间的关系
      • (2). 通过客户端和服务器详细描述三次握手
    • 2. 断开连接(四次挥手)
      • (1)讨论“四次握手”中间步骤的合并问题。
      • (2) 根据简单的 TCP 代码解释断开连接
      • (3) 四次挥手中的两个重要的 TCP 状态
  • 二、连接管理总结

一、TCP 内部工作机制——连接管理

在上一篇文章中,本人描述了保证 TCP 的可靠性的两个关键点:确认应答&超时重传

在这篇文章中所描述的 连接管理 ,对应的就是 TCP 的核心特点——可靠传输。

1. 连接(三次握手)

所谓 “连接” ,就是建立连接,通信双方各自记录对方的信息,彼此之间要有相互认同。

  • TCP 建立连接的最初描述
    TCP 的建立连接,还有一个名字叫做 三次握手
    在这里插入图片描述
    如上图所示,所谓的 三次握手 ,本质上是 “四次” 交互。
    通信双方,各自需要向对方发起一个 “建立连接” 的请求。同时,在各自向对方回应一个 ack 。所以这里一共有四次信息交互。

  • TCP 建立连接的正确形式描述
    上面的 “四次” 交互,是否可以将中间的两次信息交互合并成一个一次交互。从而构成“三次握手”,不合并是否可以? 如图: 在这里插入图片描述 答案是:必须合并! 我们要知道的是,这里的每一步都有着一个特点 “封装分用”。分装分用两次一定分装分用一次,成本更高。

  • TCP 建立连接是使用 “两次握手” 情况的讨论
    所谓 “两次握手” 图示如下:
    在这里插入图片描述
    此时,缺少了一次握手,我们就需要用不同的方式来思考这个问题。
    要讨论这个问题,我们要将视角分为两部分。

1.对于情境中的 “我”。 我明确的点了一份炒面。 我得知了我需要等一会。
2.对于情境中的 “饭店老板”。 得知了我需要一份炒面。
不知道我是否愿意等待。
所以,在上面的两个情况的分析中,从 “饭店老板” 的视角中,“我” 可能就不愿意等待。

通过上面的问题的讨论和分析,我们还可以发现,三次握手除了建立连接之外。还有一个重要的作用——验证双方各自的信息发送和接受功能是否正常!

(1).有连接和确认应答之间的关系

对于这个问题,本人在这里直接说明。有没有连接,和是否确认应答,没有任何关系。

所谓有连接,有下面三点:
1.需要将连接先建立好,才能进行通信。
2.如果断开连接,此时就无法继续通信
3.连接建立过程中,通信双方都要各自保存好对方的信息。

确认应答,所体现的是 “可靠传输” 与是否有连接不相关。
例如,钉钉发送信息就不需要连接,当出现一个 “已读” 状态时。就表明传输成功了。

这里有一个说法,“TCP 中的三次握手,体现出了 TCP 的有连接”
这里正确的理解应该是,因为 TCP 是有连接的,所以,TCP 需要有能够建立连接 / 断开连接的功能。因而,其中的建立连接流程是 三次握手。
并不是说因三次握手才体现出的有连接。

(2). 通过客户端和服务器详细描述三次握手

在描述之前,我们要先知道客户端和服务器在这里的关系。
客户端是主动的一方。
服务器是被动的一方。

在这里插入图片描述
在这里插入图片描述
在上图中 红色 标注出来的是报文段
绿色 标注出来的是 TCP 的状态

  • 红色标注解释
    ACK: 确认号是否有效。
    SYN: 请求建立连接,称之为同步报文段

  • 绿色标注解释
    在建立连接阶段,主要需要认识两个状态:
    1.LISTEN 服务器状态
    这里表示服务器已经准备就绪,随时可以有客户端来建立连接。
    也就是相当于,手机开机信号良好,可以打电话过来了
    2.ESTABLISHED 客户端和服务器的状态。
    连接建立完成,接下来就可以正常进行通信了。
    相当于电话打过去,对方接通了。

2. 断开连接(四次挥手)

“挥手” 和 “握手” 一样都是形象的叫法。都是客户端和服务器之间的数据交互。

四次挥手 和 三次握手 非常类似。就是双方各自向对方发送一条断开连接的请求,在各自给对方一个回应。
在这里插入图片描述
通过上面的图像,我们一样可以提出一个问题,这里的“四次挥手”和前面我们开始时所讲的“三次握手” 两个的图像有很大的相似之处。

(1)讨论“四次握手”中间步骤的合并问题。

所以问题就是,四次握手这里的 中间两步 是否可以合并

对于合并,这里有一个判断准则:两个数据发送的时机相同才能合并,若时机不同,就无法合并。
阐述三次握手时情况
在这里插入图片描述
三次握手中间两次的合并,就是因为同一时机。具体的来讲,三次握手的这三次交互,是纯内核完成的 (应用层感知不到,也无法干预)
服务器的系统内核收到 syn 之后,就会立刻发送 ack 同时也发送 syn。
阐述四次挥手时情况
在这里插入图片描述

在这里插入图片描述

  • 对红色方框元素解释
    FIN: 通知对方,本端将会关闭,该标识称之为结束报文段

首先我们要明确下面的这一点:FIN 的发起,不是由内核进行控制的,而是由应用程序调用 socket 的 close 方法才会触发 FIN。
在上面的图中,服务器收到来自客户端的 FIN 请求后,会立即返回一个 ACK。但是对应返回的 FIN 就需要服务器执行到对应的 close 方法后才会触发返回的 FIN (两者中间会存在一个时间差)

(2) 根据简单的 TCP 代码解释断开连接

在之前的文章中,我向大家介绍了有关 TCP 的部分相关知识。
详见: JavaEE——网络编程(TCP流编程)
在这里,我将通过之前服务器代码对 “四次挥手” 中,中间的两部分应答操作进行简单解释。

  • 观察服务器读取请求代码
    在这里插入图片描述
    注意上面代码中的 break 关键词。这里的 break 决定着是否要跳出 while 循环来停止服务器。
    注意上面的 hasNext 关键字。这里要进入到下面的 break 就需要通过 hasNext 关键字来判断为 false
    但是这里为什么会成为 false ?是因为流对象读取到了 EOF(文件结束标记)
    为什么会收取到 EOF?这是因为内核收取到了客户端发送过来的 FIN 数据报。

在前面我们提到过,当程序执行到对应的 close 方法时,才会触发 FIN。但是在我们的 客户端 代码中,并没有显式的写 close。但是客户端进程的退出,就会触发 socket.close,也就触发 FIN。

  • 服务器关闭代码
    在这里插入图片描述

如上面的代码所示,在循环执行完毕后,执行到了下面的 close 方法。此时,服务器就会向客户端发起一个 FIN。

整体的观察上述代码,我们发现,当前的循环一结束,就立刻有 close 发起 FIN,此时 ACK 和 FIN 之间的间隔较短。此时很有可能系统将这两个包合成到一块发送

要注意的是,虽然时间间隔较短但是任然是不可以忽略的。所以为了可以更加明显一点,可以在 close 方法之前加上 sleep 方法进行短暂的休眠

(3) 四次挥手中的两个重要的 TCP 状态

在这里插入图片描述

  1. CLOSE_WAIT
    出现在被动发起断开连接的一方。 等待关闭。(等待调用 close 方法关闭 socket)
    建立连接一定是客户端主动发起请求。
    断开连接,可能是客户端主动发起请求,也可能是服务器主动发起。

  2. TIME_WAIT
    出现在主动发起断开连接的一方。
    假设客户端主动断开连接。当客户端进入 TIME_WAIT 状态时,相当于四次挥手已经挥完了。
    此时这里的 TIME_WAIT 要保持当前的 TCP 连接状态不要立即释放

为什么不要连接释放?为什么会以 TIME_WAIT 保留一会连接?
理由就是,此时最后一个 ACK 刚刚发送出去,还没有到达,万一出现 ACK 丢包呢?
TIME_WAIT 在这里会进行等待,如果等待一段时间后,还是没有收到重传的 FIN 呢么此时就会认为,最后一个 ACK 没有丢失,于是就会彻底放弃连接。

  • 对于 三次握手 和 四次挥手 的超时重传
    在 三次握手 和 四次挥手 的过程中,同样是存在超时重传的。
    如果最后一个 ACK 丢包了,在服务器的角度来看,服务器不知道是因为 ACK 丢失,还是自己发送的 FIN 丢失,对此,这样的情况统一视为 FIN 丢了,统一进行重传操作
    大致情况如图:
    在这里插入图片描述
    既然服务器可能会重传 FIN客户端就需要能对这个重传的 FIN 进行 ACK 响应。
    既然服务器可能要重传 FIN ,客户端就需要能够针对这个重传的 FIN 进行 ACK 响应。所以,很明显如果刚才将连接彻底释放,这样的 ACK 就无法进行了。因此使用 TIME_WAIT 状态保留一定的时间,就是为了能够处理最后一个 ACK 丢包情况,能够在收到重传的 FIN 后,进行 ACK 响应。

二、连接管理总结

通过前面的描述,我们已经知道,TCP 作为一个有连接的协议。就需要建立连接和断开连接
建立连接: 就是三次握手
对于三次握手的意义,有下面的三点:
1.双方建立对对方的认同。(保存对方的信息)
2.验证通信双方的发送和接受能力。
3.协商一些关键参数。

断开连接: 就是四次挥手
四次挥手,需要重点来理解当前的挥手是四次,理解 FIN 和 ACK 的传输时机,以及 TIME_WAIT 的意义和作用。

码子不易,您小小的点赞是对我最大的鼓励!!!

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

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

相关文章

【C语言】什么是宏定义?(#define详解)

🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 ​ 目录 一.什么是宏定义 二.宏定义的组成 第1部分 第2部分 第3部分 三.宏定义的应用 🎏类对象宏 🎏类函数宏 1.求两个数中的较大值 2.求一个数的…

测试时间不够,你会如何处理?

工作中经常会遇到测试时间不够充分的情况,当测试时间不足的情况下,如何做到不延误测试进度,又能保证测试质量? 1、根据测试目标和需求,确定测试的优先级,首先测试最重要和核心的功能和场景。 确保关键功能…

一文搞懂时间序列ARIMA模型

文章目录 1 ARIMA的定义2 差分(differencing)2.1 Order:差分的阶数2.2 Lag:差分的滞后2.3 滞后运算/滞后算子/延迟算子2.4 关于差分的两个误解 3 ARIMA的平稳性4 ACF与PACF5 时序模型的选择与评估5.1 超参数p、q、d的确定5.2 时间序列的评估指标 1 ARIMA…

【网络安全-信息收集】网络安全之信息收集和信息收集工具讲解(提供工具)

工具下载百度网盘链接(包含所有用到的工具): 百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.…

Canvas--》使用Canvas完成基本绘图

&#x1f31f;Canvas介绍 <canvas>是一个可以使用脚本 (通常为javaScript) 来绘制图形的HTML元素。例如&#xff0c;它可以用于绘制图表、制作图片构图或者制作简单的动画。如上面效果示例就是使用 <canvas> 来实现示例&#xff0c;后续将一步步实现上面效果。 C…

2023-10-06 LeetCode每日一题(买卖股票的最佳时机含手续费)

2023-10-06每日一题 一、题目编号 714. 买卖股票的最佳时机含手续费二、题目链接 点击跳转到题目位置 三、题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&…

C++树详解

树 树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个结点的有限集。n0时称为空树。在任意一颗非空树中&#xff1a;①有且仅有一个特定的称为根&#xff08;Root&#xff09;的结点&#xff1b;②当n>1时&#xff0c;其余结点可分为m&#xff08…

HP 喷墨一体机 - “检查墨盒“指示灯闪烁,怎么办?

适用机型&#xff1a; HP PSC 1118、1218 、1318、1350、1406/1408、1508 故障现象&#xff1a; “检查墨盒”指示灯闪烁&#xff0c;“份数”显示的是英文字母“E”&#xff0c;代表 Error&#xff08;错误&#xff09;的意思。&#xff08;无复印份数显示 &#xff09; “检…

Solidity 合约漏洞,价值 38BNB 漏洞分析

Solidity 合约漏洞&#xff0c;价值 38BNB 漏洞分析 1. 漏洞简介 https://twitter.com/NumenAlert/status/1626447469361102850 https://twitter.com/bbbb/status/1626392605264351235 2. 相关地址或交易 攻击交易&#xff1a; https://bscscan.com/tx/0x146586f05a451313…

基于SSM+Vue的鲜花销售系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

16哈希表-基础操作

目录 哈希表 散列思想 哈希表的实现 简单示例 开胃菜&#xff1a;LeetCode之路——242. 有效的字母异位词 分析 哈希表 英文名字为Hash table&#xff0c;散列表的英文叫“Hash Table”&#xff0c;我们平时也叫它“哈希表”或者“Hash表”。 哈希表&#xff08;Hash Ta…

typescript 类型声明文件

typescript 类型声明文件概述 在今天几乎所有的JavaScript应用都会引入许多第三方库来完成任务需求。这些第三方库不管是否是用TS编写的&#xff0c;最终都要编译成JS代码&#xff0c;才能发布给开发者使用。6我们知道是TS提供了类型&#xff0c;才有了代码提示和类型保护等机…

盒子模型的基础

盒子模型 边框&#xff08;border&#xff09; border可以设置元素的边框&#xff0c;边框分成三部分&#xff0c;边框的&#xff08;粗细&#xff09;边框的样式&#xff0c;边框的颜色 <style>div {width: 100px;height: 100px;border-width: 200;border-style: 边框…

时序分解 | Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间序列信号分解

时序分解 | Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间序列信号分解 目录 时序分解 | Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CEEMDAN完全自适应噪声集合经验模态分解时间…

基于SSM的旅游网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Springboot+vue的开放性实验室管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的开放性实验室管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的开放性实验室管理系统&#xff0c;采用M&#xff08…

python开发幸运水果抽奖大转盘

概述 当我女朋友跟我说要吃水果&#xff0c;又不知道吃啥水果时候&#xff0c;她以为难为到我了&#xff0c;有啥事难为到程序员的呢&#xff01; 今天用python利用第三方tkinterthreadingtime库开发一个幸运水果抽奖大转盘&#xff01;抽到啥吃啥 详细 老规矩&#xff01;咱…

Qt 设置软件的版本信息:QMake、CMake工程

本文借鉴了Qt 设置软件的版本信息 - 疯狂delphi - 博客园 (cnblogs.com) 在原文基础增加了CMake工程实现的方法。 Qt设置软件的版本等信息 对于Qt开发的软件&#xff0c;我们如何去方便的查看其软件的版本信息。这里提供了几种方式。 在运行程序期间设置版本信息 大部分的程序…

CDN是什么?(网络零基础入门篇)

1.CDN的全称 是 Content Delivery Network&#xff0c;即内容分发网络。 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网…

黑豹程序员-架构师学习路线图-百科:JSON替代XML

文章目录 1、数据交换之王2、XML的起源3、JSON诞生4、什么是JSON 1、数据交换之王 最早多个软件之间使用txt进行信息交互&#xff0c;缺点&#xff1a;纯文本&#xff0c;无法了解其结构&#xff1b;之后使用信令&#xff0c;如&#xff1a;电话的信令&#xff08;拨号、接听、…