【JavaEE】——四次挥手,TCP状态转换,滑动窗口,流量控制

8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:断开连接的本质

二:四次挥手

1:FIN

2:过程梳理

3:能合二为一吗?

三:“三次握手”和“四次挥手”异同

1:相同点

2:不同点

四:TCP连接状态转换

1:TCP状态转换图

2:LISTED

3:ESTABLISHED状态

4:CLOSE_WAIT(面试高频)

(1)过程梳理

(2)作用

5:TIME_WAIT(面试高频)

(1)过程梳理

(2)作用

五:滑动窗口

1:批量传输

2:滑动窗口

3:ack丢包

4:数据丢包

(1)快速重传

注意点①

注意点②

(2)优点

(3)总结

六:流量控制

1:缓存区上限

2:窗口动态变化


一:断开连接的本质

通过上一篇文章的学习,我们知道“三次握手”的目的和本质就是让通信双方能够保存对端的信息,当信息这个数据量过大的时候,就要引用数据结构。

那么断开连接的本质就是把对端的信息从数据结构中进行删除,释放掉

二:四次挥手

1:FIN

同样我们先认识一下TCP数据报包中,6个标志符中的FIN——结束报文段

单词为finish(结束)——>缩写为FIN

在之前的学习中,我们调用通过ServerSocket类调用close方法就会触发FIN,这里的FIN也是在内核中完成。

同样如果我们结束一个进程也会触发FIN【JavaEE】——TCP回显服务器(万字长文超详细)-CSDN博客

2:过程梳理

引入:与“三次握手”中“一定是客户端先主动”不同,“四次挥手”中服务器和客户端两者谁都可以先主动(分手像极了爱情~)这里我们用“客户端先主动”充当例子

(1)客户端发起FIN(结束报文段)

(2)服务器ACK应答并且也发起FIN(结束报文段)

(3)客户端ACK应答

3:能合二为一吗?

引入:在上述图解步骤下,服务器和客户端各自给对方发起FIN,并再给对方返回ACK,“四次挥手”后代表着通信双方“和平分手”。那么这里的②③步骤是否也能“合并”呢?

答案是:可以合并,但是不能100%的合并——“如合~”

如果②③两者发送的时间间隔很长,那么就不能合并

三:“三次握手”和“四次挥手”异同

1:相同点

都是需要有一端先发起SYN/FIN,然后对端在返回ACK

传输顺序:syn/ack/syn/ack     fin/ack/fin/ack

2:不同点

三次握手中中间两次一定能够合并,四次挥手中中间来那个词不一定能够合并

三次握手中一定是客户端先主动,四次挥手中谁先主动都可以

四:TCP连接状态转换

引入:在TCP的连接中,数据结构会保存两端的信息,在这里面就有一个属性,叫做“状态”,操作系统可以根据状态的不同,决定应该对连接做什么

1:TCP状态转换图

铁铁们看到这个图脑壳都大了吧,俺也是,这里我们只介绍几个比较重要的状态即可

2:LISTED

listed(译为:已登录的)表示:服务器这边已经建立好了ServerSocket,并且绑定好了端口号,随时准备接收客户端的连接

步骤一:我们先启动服务器(代码在之前TCP回显服务器那一篇文章,直接复制粘贴即可)

【JavaEE】——TCP回显服务器(万字长文超详细)-CSDN博客

步骤二:打开命令窗口,输入netstat -ano

步骤三:服务器加上限制条件,我们看9090这个在代码里选择连接的端口

3:ESTABLISHED状态

注:established(译为:已建立的)

表示:客户端和服务器已经建立完毕(三次握手完了)

步骤四:客户端和服务器连接进入ESTABLISHED

注:这里双方进入时间差极小,肉眼是看不出来先后顺序的,除非精确查看日志里的时间戳

4:CLOSE_WAIT(面试高频)

close_wait(译为:关闭等待)——谁被断开连接,谁进入close_wait状态

(1)过程梳理

看图客户端发起FIN断开连接(四次挥手),服务器收到后发送ACK应答报文后进入close_wait状态。

这个状态是比较难观察到的,因为服务器发送ACK和FIN的时间间隔极短,即关闭socket文件的时间极短,此时close_wait -> last_ack 状态的切换非常快

(2)作用

阻塞等待客户端数据请求

注:如果发现服务器或者客户端出现大量的CLOSE_WAIT,意味着很可能是socket没有关闭,出bug了。

5:TIME_WAIT(面试高频)

谁主动断开连接,谁进入TIME_WAIT状态

(1)过程梳理

服务器返回给客户端ASK和FIN,客户端收到返回ASK应答后,进入TIME_WAIT状态

(2)作用

如果最后一个ACK丢包了,服务器迟迟收不到ACK,就会重传一个FIN,客户端收到后也会相应重传一个ACK。

TIME_WAIT就为这个过程留下充足的时间,这个等待的时间不是无休止的等待(连机器都不会无限制的等待,更何况爱情呢~),最多2MSL(MSL是系统内核的配置项)

五:滑动窗口

引入:之前我们简单了解一次数据传输,所经历的过程。 

我们可以发现一个问题:发一个数据就要等一个ack,这样的效率是不足以满足现在“信息爆炸”的现状的。

所以我们引出:批量传输这个概念

1:批量传输

顾名思义——先发一个数据,不等ack了,下一个数据接着发,连续发了好多个ack之后,使用同一份时间来等待ack

好处:减少了总的等待的时间内(下面这张图能非常形象的表现出来)

2:滑动窗口

3:ack丢包

看图——

1001的ack应答丢包了,但是2001这个ack没有丢包,主机A收到②这个ack后就知道主机B2001之前的数据都收到了,所以①号ack丢包问题不大,这种情况无需处理,对于TCP传输的可靠性没有影响。

4:数据丢包

(1)快速重传

注意点①

看上图,主机A发送的1001~2000这个数据丢包了,但是2001后面的数据还在发送,此时主机B就会对2001后面的数据,返回ack,多次强调下一个数据是1001,服务器收到三次这个ack之后,就知道1001~2000这个数据丢包了,就会重传(有点超时重传的感脚~)

注意点②

主机B收到1001~2000这个丢包的数据后,直接会跳到索要7001这个数据包了,而不是2001~。

这是因为TCP有一个接受缓冲区,你可以想象成一个队列

(2)优点

上述重传的过程,整体效率非常高,做到了“针对性”的丢包重传,不必重新发送,这种重传叫做“快速重传”

(3)总结

①“确认应答”、“超时重传”、“滑动窗口”、“快速重传”这四种机制并不冲突,可以同时存在。

②短时间发送了很多数据,窗口才滑的起来

③判定丢包的标准是:连续有多个ack索要同一个数据;普通传输判定标准是:ack超时没有到达

六:流量控制

引入:上述滑动窗口可以提高数据的传输效率,窗口越大,更多数据复用同一块时间,效率就更高,那么问题来了,窗口越大越好吗?显然不行

1:缓存区上限

数据到达接收方是先暂时存储在缓冲区当中,等到一定的数量后,接受方在一次性拿(read)出来

试想发送方如果一下子发送数据太快,导致接收方的缓冲区装不下了,就会导致丢包,这时在重传也没用了(因为已经返回ack了)

2:窗口动态变化

与其等待接收方缓存区满了,不如提前感知到,就减慢发送数据的速度,(下面有请我们的老朋友)

16位窗口大小,就能很好的动态控制窗口的大小,通过这个字段,来给发送方反馈发送速度,很明显这个字段对于发送方的报文中没有意义,只有ack报文中才有意义

注:这个16位并不是实际上的大小——在TCP报头中有一个参数叫做窗口扩展因子

       实际窗口大小 = 16位窗口大小* 2^窗口扩展因子

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

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

相关文章

新时代AI桌宠:XGO Rider让你的办公室瞬间高大上

​ XGO Rider Luwu 智能打造了桌面双轮足式机器人 XGO Rider,这款全球首创的轮腿式桌面AI机器人,正在悄然改变我们的办公环境。它不仅是一个高科技玩具,更是一个能大幅提升工作效率和办公室科技感的智能助手。 XGO Rider 新时代“桌宠” micr…

基于java+springboot的宇宙动漫网站

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图 前言 文章底部名片,获取项目的完整演示视频,免费解答技术疑问 项目介绍 本系统为用户而设计制作宇宙动漫网站,旨在实现宇宙动漫智能化、现代化管理。本宇宙动漫管理自…

爬虫——scrapy的基本使用

一,scrapy的概念和流程 1. scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 框架就是把之前简单的操作抽象成一套系统,这样我们在使用框架的时候,它会自动的帮我们完成很…

【数据结构与算法】之有序链表去重(保留重复元素)

目录 1.问题描述 2.思路讲解 3.Java 代码实现 4.代码解释 5.复杂度分析 6.其它方法 6.1 递归实现 6.2 双指针 7.总结 相关教程: 有序链表去重(不保留重复元素) 数据结构之链表详解 递归详解 1.问题描述 给定一个已排序的单链表…

Java可以做人工智能吗-回答是当然可以

Java在人工智能应用开发中的角色与优势 人工智能主要分为两个部分:一个是做底层的大语言模型的训练,另一个是基于大模型进行业务应用。Java最适合做的就是第二个方面,即基于大模型构建业务应用。由于过去大量的企业级应用都是使用Java开发的…

网络服务请求流程简单理解

网络流程: DNS负责将域名解析为IP地址,ALB可以在多个服务实例之间分配流量,APISIX作为API网关处理更细粒度的流量管理,Service在Kubernetes中为Pod提供稳定的访问入口,而Kubernetes则负责整个应用的部署、扩展和运维。…

Java项目-基于springboot框架的逍遥大药房管理系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

【UML】一个UML学习的还不错的几个帖子

https://segmentfault.com/a/1190000042775634 寂然解读设计模式 - UML类图&类的六大关系-阿里云开发者社区

最佳简历--JAVA程序员的项目经验如何写

小熊学Java全能学习+面试指南:https://www.javaxiaobear.cn 首先你要明确,你能干什么,包括你自己编写的专业技能,到底会不会,怎么运用到技术上的? 1、你能干什么? 你能干什么,其实就展现你的能力,这是简历中最重要的部分,你需要证明前面说的你会的东东; 这就有点…

【前端】如何制作一个自己的网页(14)

当我们还需要对网页中的内容进行局部样式的修改。这时候,就需要用到HTML中的重要元素:span。 span是一个行内元素,可以对HTML文档中的内容进行局部布局。 如图,我们给标题和段落元素的部分内容设置了各种样式。 接下来&#xff0…

rk3588 opencv 的使用

-------------------------------------------------------------------------------------------------------- 目前是 3588 上无法 直接编译出 C程序。 报错如下: -----------------------------------------------------------------------------------------…

LeetCode 精选 75 回顾

目录 一、数组 / 字符串 1.交替合并字符串 (简单) 2.字符串的最大公因子 (简单) 3.拥有最多糖果的孩子(简单) 4.种花问题(简单) 5.反转字符串中的元音字母(简单&a…

[ComfyUI]Flux:爆火禅语小和尚素材!禅意人生,享受自在

在快节奏的现代生活中,人们越来越渴望一种宁静和放松的状态。而禅意小和尚素材正是这样一种能够带给我们内心宁静和智慧的存在。ComfyUI的Flux框架结合了禅意小和尚素材,为我们提供了一个探索禅意人生的独特方式。 禅意小和尚素材源于佛教文化&#xff…

AJAX—— jQuery 发送 AJAX 请求

1、get 请求 $.get(url,[ data ] , [ callback ] , [ type ]) url :请求的 URL 地址 data :请求携带的参数 callback :载入成功时回调函数 type :设置返回内容格式(xml&#xf…

UniHttp 框架,请求http接口

项目案例下载地址: https://download.csdn.net/download/jinhuding/89902024 1.快速开始 2.1引入依赖 <dependency><groupId>io.github.burukeyou</groupId><artifactId>uniapi-http

leetcode动态规划(十一)-分割等和子集

题目 416.分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5,…

如何进行数据库缩容 | OceanBase应用实践

作者&#xff1a;关炳文&#xff0c;爱可生 DBA 团队成员&#xff0c;负责数据库相关技术支持。 本文详细介绍了OceanBase V3.2版的集群中&#xff0c;面对数据文件缩容的场景的一套缩容方案&#xff0c;作为大家的参考。 缩容场景 某银行运行的一套采用1-1-1架构的OceanBase…

自动驾驶---基于dds/ros的通信中间件

1 背景 DDS&#xff08;数据分发服务&#xff0c;Data Distribution Service&#xff09;和ROS&#xff08;机器人操作系统&#xff0c;Robot Operating System&#xff09;是两种在各自领域内具有重要影响的技术。它们是两种不同的中间件&#xff0c;并且在分布式系统、尤其是…

源代码加密技术的一大新方向!

在当今这个信息爆炸的时代&#xff0c;企业所面临的数据安全挑战日益严峻。传统的文档加密方法已经无法满足日益复杂的安全需求。幸运的是&#xff0c;SDC沙盒加密系统以其革命性的安全理念和先进技术&#xff0c;为企业提供了一个更可靠、更高效的数据保护方案。 传统加密方案…