JavaEE: 深入探索TCP网络编程的奇妙世界(三)

文章目录

  • TCP核心机制
    • TCP核心机制三: 连接管理
      • 建立连接(三次握手)
      • 断开连接(四次挥手)
      • 三次握手/四次挥手 流程简图


TCP核心机制

前一篇文章 JavaEE: 深入探索TCP网络编程的奇妙世界(二)
书接上文~

TCP核心机制三: 连接管理

建立连接(三次握手),断开连接(四次挥手).
这里的次数指的是网络通信的次数,挥手/握手是形象的比喻(handshake,计算机中的常见术语)

网络中的握手,发送不携带业务数据(没有载荷,只有报头)的数据包,但是能起到"打招呼"的作用.

建立连接(三次握手)

在这里插入图片描述
要想搞懂三次握手,那就要知道三次握手要解决啥问题,为啥要三次握手,三次握手的意义何在?

答:

  1. 投石问路: 初步的验证通信的链路是否畅通.(这是进行可靠传输的"前提条件")

  2. 确认通信双方各自的发送能力和接收能力是否都正常
    举个例子:
    我和朋友连麦打游戏.
    在这里插入图片描述
    把麦克风看成发送能力,耳机看成接收能力,这就是确认的过程~

    为啥是三次握手?

    1. 四次是否可行?
      • 可行的,中间的一次,拆成两次,也可以.但是没必要这么做.
    2. 两次是否可行?
      • 不可行~
        这样就无法完成通信双方针对各自发送能力和接收能力的验证~

    针对TCP来说,必须是三次握手.
    其他协议,握手过程可不一定是三次~

  3. 让通信双方在进行通信之前,先对通信过程中需要用到的一些关键参数进行协商.
    TCP通信时,起始数据的序号,就是通过三次握手,来协商确定的~(换而言之,TCP序号,并不是从1开始的)
    每次建立连接,TCP的起始序号都不同(而且故意差别很大)

    这么约定的意义,在于避免出现"前朝的剑,斩本朝的官".
    具体解释一下~
    A和B建立连接了.
    在这里插入图片描述
    A和B传输业务数据.
    在这里插入图片描述

    在上面的过程中,可能有某个数据包"迷路"了,绕了一个大圈最终才到达对端~
    当他到达的时候,已经"改朝换代"了.

    针对这样的"迟到"的数据包,就需要把它丢弃掉,不能按照正常的流程来处理这里的数据了.

    A和B断开连接
    在这里插入图片描述
    过了一会,A和B又重新建立连接~
    在这里插入图片描述
    虽然还是 A B 两个主机的连接,但是可能是不同的应用程序.

    对于B来说,就需要区分当前收到的数据是"本朝"的还是"前朝"的.

    如何区分呢?
    答:给每个连接,都协商不同的起始的序号,如果发现收到的数据,和起始序号以及和最近收到的数据序号,都差别很大的话,那么就视为这个数据就是"前朝"的数据,把它丢掉.

小小的总结一下.
进行TCP三次握手的原因:

  1. 投石问路,验证通信路径上是否畅通.
  2. 验证通信双方的发送能力和接收能力是否正常.
  3. 协商重要的参数,比如TCP连接中的起始序号.
    在这里插入图片描述

断开连接(四次挥手)

四次挥手:(优雅地)断开连接.

前面谈到"超时重传"的时候,说到了"单方面释放连接".
而这里的四次挥手则是双方各自把对端的信息删除掉.

断开连接,不一定是"客户端主动",服务器也可以主动断开.

在这里插入图片描述
通信双方,各自给对方发送"FIN",各自给对方返回"ACK".

三次握手,之所以是三次,是因为中间两次的交互,合并在一起了.

对于四次挥手来说,中间两次,不一定能合并(大概率不能).

对于三次挥手来说,中间的两次,ACK+SYN,都是在系统内核中,由操作系统负责进行的,时机都是在收到SYN之后,就可以合并了.

对于四次挥手来说.
ACK是内核控制的,但是FIN的触发,则是通过应用程序,调用close/进程退出,来触发的.

代码中针对socket.close() => 系统内部,就是发送FIN.
在这里插入图片描述

三次握手/四次挥手 流程简图

在这里插入图片描述
在这里插入图片描述
通过看图,我们可以看到:

  1. TCP是有状态的.
  2. TCP的状态转换.

这些东西很复杂,我们只要能够认识这里面的几个关键状态就可以了.

  • LISTEN
    服务器进入的状态
    服务器把端口绑定好,相当于进入了listen状态了.
    此时服务器就已经初始化完毕,准备好随时迎接客户端了.

    类似于手机开机,信号良好,随时可以有人来打电话了.

  • ESTABLISHED
    客户端和服务器都会进入的状态.
    表示TCP连接建立完成(保存了对方的信息了)
    接下来就可以进行业务数据的通信了.

    类似于电话接通,可以说话了.

  • CLOSE_WAIT
    被动断开连接的一方,会进入这个状态.
    先收到FIN的一方,“等待代码执行close方法”

    如果发现,服务器这端,存在在大量的CLOSE_WAIT状态的TCP连接,说明什么?
    此时说明服务器代码可能有bug.
    排查close是否写了,以及是否及时执行到了.

  • TIME_WAIT
    主动断开连接的一方,会进入这个状态.
    此处的TIME_WAIT按照时间来等待,达到一定时间之后,连接也就释放了.

    为啥不直接释放,而是要等待一定时间呢?
    就是为了防一手最后的ACK丢包~
    在这里插入图片描述

    TIME_WAIT存在的时间,称为MSL(MSL => 数据报在网络传输中消耗的最大时间)
    MSL在不同的系统不一样,都是可配置的.
    比如Linux默认的值为60s.正常来说,网络数据,是不会消耗这么久的时间的.

最后再给一张TCP状态转换的一个汇总(简单了解一下就行):
在这里插入图片描述

下一篇文章JavaEE: 深入探索TCP网络编程的奇妙世界(四)

本文到这里就结束啦~

在这里插入图片描述

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

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

相关文章

二叉树的前序遍历,中序遍历,后序遍历(非递归方法+C语言代码)

#include<stdlib.h> #include<stdio.h> #include<assert.h> #include<stdbool.h> //定义一个二叉树结点结构体 typedef int ElemTpye; typedef struct TreeNode {ElemTpye data;struct TreeNode* left;struct TreeNode* right; }TreeNode; //创建结点 …

【中间件——基于消息中间件的分布式系统的架构】

1. 基于消息中间件的分布式系统的架构 从上图中可以看出来&#xff0c;消息中间件的是 1&#xff1a;利用可靠的消息传递机制进行系统和系统直接的通讯 2&#xff1a;通过提供消息传递和消息的排队机制&#xff0c;它可以在分布式系统环境下扩展进程间的通讯。 1.1 消息中间件…

影视站群程序大对比,苹果cmsv10 vs海洋cms

在影视站群程序领域&#xff0c;苹果CMSv10和海洋CMS是两款备受站长们青睐的程序。它们分别具备各自的优势&#xff0c;适合不同需求的站群管理和优化。以下是两者的详细对比&#xff0c;并重点介绍苹果CMS的主要优势和插件功能。 苹果CMSv10简介 maccmscn 苹果CMSv10&#x…

CV之OCR:GOT-OCR2.0的简介、安装和使用方法、案例应用之详细攻略

CV之OCR&#xff1a;GOT-OCR2.0的简介、安装和使用方法、案例应用之详细攻略 目录 GOT-OCR2.0的简介 1、更新 GOT-OCR2.0的安装和使用方法 1、安装 安装环境cuda11.8torch2.0.1 安装包 安装Flash-Attention GOT权重&#xff1a;1.43G 2、演示 3、训练 4、评估 GOT-…

记录Mac编译Android源码踩过的坑

学习Android源码&#xff0c;如果电脑配置还不错&#xff0c;最好还是下载一套源码&#xff0c;经过编译后导入到Android Studio中来学习&#xff0c;这样会更加的直观&#xff0c;代码之间的跳转查看会更加方便。因此&#xff0c;笔者决定下载并编译一套源码&#xff0c;以利于…

[Redis][哨兵][下]详细讲解

目录 1.安装部署(基于Docker)1.编排Redis主从节点2.编排Redis-Sentinel节点 2.重新选举1.redis-master宕机之后2.redis-master重启之后3.总结 3.选举原理4.总结 1.安装部署(基于Docker) 1.编排Redis主从节点 编写docker-compose.yml 创建/root/redis/docker-compose.yml&…

【web安全】——信息收集

一、收集域名信息 1.1域名注册信息 工具&#xff1a;站长之家 whois查询 SEO综合查询 1.2子域名收集 原理&#xff1a;字典爆破&#xff0c;通过字典中的各种字符串与主域名拼接&#xff0c;尝试访问。 站长之家 直接查询子域名 ip138.com https://phpinfo.me/domain/ …

StoryMaker 在文本到图像的生成过程中实现一致的字符

StoryMaker 是一种个性化解决方案&#xff0c;它不仅能保持多个角色场景中面部的一致性&#xff0c;还能保持服装、发型和身体的一致性&#xff0c;从而有可能制作出由一系列图像组成的故事。 StoryMaker 生成图像的可视化。 前三行讲述的是 "上班族 "一天的生活&…

创建javaWeb项目(详细版本)2021年2月

1、新建一个java项目 2、点击工程名称&#xff0c;找到add framework support&#xff0c;并点击 建好如图 3、分别在工程目录下创建resourse文件夹和web目录下创建classes和lib文件夹 建好如图 4、file找到 project structure 5、选中resourse 将其mark as sources 6、路径改…

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档&#xff1a;https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…

godot4.2入门项目 dodge_the_creep学习记录

前言 在学习博客Godot4 你的第一个2d游戏中的项目时&#xff0c;遇到了点小问题&#xff0c;记录一下。 官方项目 传送门 问题 怪兽直接从屏幕中间部分冒出来&#xff0c;以及角色出现时位于屏幕外角色被设置的背景图遮挡 解决方法 1.节点的位置没有对齐&#xff0c;正确示例…

Apache APISIX学习(2):安装Grafana、prometheus

一、Grafana安装 1、介绍 Grafana 是一个监控仪表系统&#xff0c;它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度&#xff0c;你只需要提供你需要监控的数据&#xff0c;它就可以帮你生成各种可视化仪表。同时它…

Vue-Bag-Admin 采用漂亮的 Naive UI 构建的开源中后台系统,基于 Vue3 / Vite / TypeScript 等最新的前端技术栈

这是一款完成度很高、实用性很强的 admin 前端框架&#xff0c;颜值不错&#xff0c;推荐给大家。 Vue-Bag-Admin 在官网上也直接称为 Bag-Admin&#xff0c;这是一款专门为企业项目搭建中后台管理平台的前端框架&#xff0c;基于目前最新的前端技术栈 Vue3、Vite、TypeScript…

程序设计题(65—72)

第六十五题 题目 请编写函数fun&#xff0c;它的功能是&#xff1a;计算下列级数和&#xff0c;和值由函数值返回。 例如&#xff0c;当n10&#xff0c;x0.3时&#xff0c;函数值为1.349859。 #include <conio.h> #include <stdio.h> #include <math.h> #…

5.使用 VSCode 过程中的英语积累 - Go 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

react:React Hook函数

使用规则 只能在组件中或者其他自定义的Hook函数中调用 只能在组件的顶层调用&#xff0c;不能嵌套在if、for、 其他函数中 基础Hook 函数 useState useState是一个hook函数&#xff0c;它允许我们向组件中添加一个状态变量&#xff0c;从而控制影响组件的渲染结果 示例1…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么&#xff0c;翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit&#xff08;&#xff09; 新建文本文档后缀改成py 编写 运行 安装编写代码…

开放词汇全景分割

开放词汇全景分割是一种先进的计算机视觉任务&#xff0c;它旨在将图像中的每个像素分割并分类到预先定义或未定义的类别中。这与传统的图像分割不同&#xff0c;后者通常仅限于识别有限的、预先定义的对象类别。开放词汇全景分割的目标是识别和处理图像中的任何可能的对象&…

Fastadmin 前台任意文件读取漏洞

漏洞描述 FastAdmin是一个基于ThinkPHP5和Bootstrap的后台开发框架&#xff0c;支持权限管理、响应式开发、多语言、模块化开发、CRUD和自由可扩展等功能。 漏洞复现 FOFA body"fastadmin.net" || body"<h1>fastadmin</h1>" && tit…

SpringMVC源码-SpringMVC框架中Spring父容器和SpringMVC子容器加载的流程以及SpringMVC九大内置组件的初始

一、Spring父容器启动 SpringMVC 的项目结构如下: applicationContext.xml spring的配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.o…