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

news2024/11/18 19:57:57

文章目录

  • 一、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.coloradmin.cn/o/1062789.html

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

相关文章

计算机网络-计算机网络体系结构-物理层

目录 一、通信基础 通信方式 传输方式 码元 传输率 *二 准则 2.1奈氏准则(奈奎斯特定理) 2.2香农定理 三、信号的编码和调制 *数字数据->数字信号 数字数据->模拟信号 模拟数据->数字信号 模拟数据->模拟信号 *四、数据交换方式 电路交换 报文交换…

【刷题笔记10.5】LeetCode:排序链表

LeetCode:排序链表 一、题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 二、分析 这题咱们默认要求:空间复杂度为O(1)。所以这把咱们用自底向上的方法实现归并排序,则可以达到O(1) 的空间复杂…

[极客大挑战 2019]FinalSQL - 异或盲注

1、这题的关键是找注入点,如果选择用户名、密码作为输入点就麻烦了 2、注入点:按钮,点击就传id;当id1时,提示Click others   可以利用id的特性,构造异或匹配   payload: f"1^(ord(substr((select…

nodejs+vue中医体质的社区居民健康管理系统elementui

可以实现首页、中医体质量表、健康文章、健康视频、我的等,在我的页面可以对医生、小区单元、医疗药品等功能进行操作。目前主要的健康管理系统是以西医为主,而为了传扬中医文化,提高全民健康意识,解决人民日益增长的美好生活需要…

基于SpringBoot的图书进销存管理系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 图书类型管理 商品退货管理 客户信息管理 图书添加 客户添加 应收金额 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实…

Ubuntu无法引导启动的修复

TLDR:使用Boot-Repair工具。 Boot-Repair Boot-Repair是一个简单的工具,用于修复您在Ubuntu中可能遇到的常见启动问题,例如在安装Windows或其他Linux发行版后无法启动Ubuntu时,或者在安装Ubuntu后无法启动Windows时,…

[CISCN 2019华北Day2]Web1 - 布尔盲注

考点:布尔盲注【注意,sql中的substr初始位置是1不是0】 1、页面提示用id传参,而且我们发现是post传参 2、我们传了id1后提示“Hello, glzjin wants a girlfriend.“ 3、由于这题直接输入查询字符,可以通过字典爆破过滤&#xff0…

深度学习基础之参数量(3)

一般的CNN网络的参数量估计代码 class ResidualBlock(nn.Module):def __init__(self, in_planes, planes, norm_fngroup, stride1):super(ResidualBlock, self).__init__()print(in_planes, planes, norm_fn, stride)self.conv1 nn.Conv2d(in_planes, planes, kernel_size3, …

人机关系不是物理关系也不是数理关系

人机关系是一种复杂的社会技术系统,涉及到人类和机器、环境之间的相互作用和影响。它不仅限于物理接触和数理规律,同时还包括了思维、情感、意愿等方面的交流和互动。在人机关系中,人类作为使用者和机器作为工具(将来可能会上升到…

rust入门一:安装 Hello World

环境: window 11 专业版rust 1.72.1 一、下载安装 直接去官网: https://www.rust-lang.org/tools/install 下载完成后如下: 双击运行一步步安装就行。 如果是更新或卸载,在命令行中运行: rustup update&#xff1a…

ChatGPT基础使用总结

文章目录 一、ChatGPT基础概念大型语言模型LLMs---一种能够以类似人类语言的方式“说话”的软件ChatGPT定义---OpenAI 研发的一款聊天机器人程序(2022年GPT-3.5,属于大型语言模型)ChatGPT4.0---OpenAI推出了GPT系列的最新模型ChatGPT典型使用…

[GXYCTF2019]禁止套娃 无回显 RCE 过滤__FILE__ dirname等

扫除git 通过githack 获取index.php <?php include "flag.php"; echo "flag在哪里呢&#xff1f;<br>"; if(isset($_GET[exp])){if (!preg_match(/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i, $_GET[exp])) {if(; preg_replace(/[a-z,_]\(…

DevicData-D-XXXXXXXX勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

引言&#xff1a; 在数字时代&#xff0c;数据安全成为一项至关重要的挑战。DevicData-D-XXXXXXXX勒索病毒&#xff08;以下简称DevicData病毒&#xff09;是这场战斗中的新敌人&#xff0c;它能够以毁灭性的方式加密您的数据&#xff0c;迫使您在数据和时间之间做出艰难的选择…

nodejs+vue游戏测评交流系统elementui

可以实现首页、发布招募、公司资讯、我的等&#xff0c;另一方面来说也可以提高在游戏测评交流方面的效率给相关管理人员的工作带来一定的便利。在我的页面可以对游戏攻略、我的收藏管理、实际上如今信息化成为一个未来的趋势或者可以说在当前现代化的城市典范中,发布招募等功能…

[图论]哈尔滨工业大学(哈工大 HIT)学习笔记23-31

视频来源&#xff1a;4.1.1 背景_哔哩哔哩_bilibili 目录 1. 哈密顿图 1.1. 背景 1.2. 哈氏图 2. 邻接矩阵/邻接表 3. 关联矩阵 3.1. 定义 4. 带权图 1. 哈密顿图 1.1. 背景 &#xff08;1&#xff09;以地球为建模&#xff0c;从一个大城市开始遍历其他大城市并且返回…

逆变器下垂控制单机

仿真控制参数 主电路 坐标变换 功率计算 下垂控制 电压电流双闭环控制 结果变量监控 断路器闭合&#xff0c;负载突增 负载突增&#xff0c;有功和无功突增 有功增加&#xff0c;频率减小 无功增加&#xff0c;参考电压减小

【JavaScript】相等运算符(== 和 ===)

如果x和y的类型相同&#xff0c;JavaScript会用equals 方法比较这两个值或对象。 没有出现在表格中的情况都会返回 false。&#xff08;表格中的方法都是内部规定的&#xff09; 对于 toNumber 方法&#xff1a; 对于 toPrimitive 方法&#xff1a; // 举个例子&#xff1a; c…

基于JavaWeb技术的在线考试系统设计与实现

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 考试统计管理 专业列表管理 忘记密码人员登记管理 修改密码 试卷信息 考试信息管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理…

GPX可视化工具 GPX航迹预览工具

背景 当我们收到别人分享的航迹文档&#xff0c;即gpx文档时&#xff0c;如何快速的进行浏览呢&#xff1f;我们可以使用GIS软件来打开gpx文档并显示gpx中所记录的航迹&#xff0c;例如常用的GIS软件有googleEarth&#xff0c; Basecamp&#xff0c; GPXsee&#xff0c; GPX E…

SSM-XML整合

SSM-XML整合 核心配置文件 maven坐标 <dependencies><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.27</version></dependency><!--数据…