深入理解TCP网络协议(2)

目录

1.TCP的状态转换

1.1 LISTEN状态和ETABLISHED状态

​编辑2.TIME_WAIT 和 CLOSE_WAIT

2.滑动窗口


1.TCP的状态转换

我们通过上图可以看到TCP状态转换的详细过程.在实际开发的过程中,我们不需要了解的这么细致.为了方便大家的理解,我挑几个主要的状态来给大家聊一下

1.1 LISTEN状态和ETABLISHED状态

我们可以通过命令行 netstat -ano | findstr 10111

表示查询端口号为10111的服务器状态 注:此时我们仅仅是将服务器启动了,并没有做别的操作

可以看到有一个LISTENING的服务器状态(Windows操作系统上是这样,但是到了Linux操作系统上就是我们说的LISTEN状态了),该状态的意思是服务器已经启动就绪(即创建好了SeverSocket对象,并且绑定好了端口号),客户端可以给它发送请求了,这就好比开了一个饭店,早上起来把门打开,告诉路过的客人,我们这个饭店已经开门了,欢迎随时来吃饭.

接下来我们来观察一下

ESTABLISHED这个状态,这个状态的意思是已经有客户端和该服务器完成了三次握手创建链接的了

即可以向这个服务器发送请求了

我们接着输入 netstat - ano | findstr 10111 来观察一下

2.TIME_WAIT 和 CLOSE_WAIT

CLOSE_WAIT表示,在接下来的代码中需要调用close来主动发起fin 收到对方的fin之后进入这个状态.通俗易懂的说,就是加入客户端要向服务器发起fin,断开连接,服务器立马回了一个ack,并且进入到

对端给我发送了一个fin以后,我需要主动也调用close,这个时候的状态就是CLOSE_WAIT状态.属于一种被动的状态.

而TIME_WAIT则表示本端给对方发起FIN之后,对端业给我发FIN,此时本端进入TIME_WAIT.给最后一个ACK重传留有一定的时间.

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

一般情况下,不太容易观察到CLOSE_WAIT状态,待会会比较快速的关闭socket,状态就会从CLOSE_WAIT->LAST_ACK

如果发现服务器有大量的CLOSE_WAIT就意味着代码有bug,如忘记关socket

TIME_WAIT状态.更容易观察到.它存在的意义是为了防止最后一个ack丢包

2.滑动窗口

滑动窗口机制是TCP协议中很有意思的一种机制,它的作用主要是为了提升传输效率,据我们前面所讲的,TCP协议中每次传输数据都会等待对端发送一个ack报文以后才会继续重传下一份,但是这样的效率会很低,不利于我们传输大量的数据.所以前辈们设计了滑动窗口机制.主要的机制是,我们发送端可以一次发送多个数据,然后等待一份ack即可,等到了以后继续发送,这样可以将传输效率大大提高了, 我们用一张图来生动形象的描述一下滑动窗口的过程.

这就是滑动窗口,属于一种批量传输,之前我们是发送一个数据等一下ack然后在发下一条数据.,

而现在则是发送一波数据以后,统一等一波ack,把多次请求的时间统一成一份时间来等.

虽然这种方式提高了传输效率,但是TCP协议的一大特性就是可靠传输,那么滑动窗口这种特性该如何保证可靠传输呢?

我们分为两种情况来看

第一种.ack丢了,这种方式其实并不影响我们的可靠传输,只要后续有ack传过来就行,比如我们2001这份ack丢了,但是后面传来了3001这个ack,就说明3000之前的所有数据都是完整的到了接收方了,此时发送方接着发就行,

这对于可靠性没有影响,也不需要重传.

如上图所示,虽然1001和2001都丢了,但是3001顺利反馈过去了,此时发送方就明白了.我们3001前面的数据都没问题,就不需要重传了.

2.数据丢了 (这种就得重传了)

如上图锁是,我们的1001-2000丢了以后,接收方就会一直重复的发送1001这个ack,告诉我们应该要以1001作为首个字节来发送,当窗口大小到了极限时,就会发送1001,此时会受到7001,就会告诉我们7001之前的数据都没问题,所以可以继续发送了.

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

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

相关文章

MySQL库表操作 作业

题目: 1. sql语句分为几类?2. 表的约束有哪些,分别是什么,设置的语法分别是什么?3. 做出班级表,学生表的E-R图,数据库模型图,以及核心的sql语句. 1. MySQL致力于支持全套ANSI/ISO SQL标准。在MySQL数据库中,SQL语句主要可以划分为以下几类: > DD…

CentOS gui 图形界面显示文字乱码

一、现象 CentOS(CentOS 7.5)控制台下显示中文乱码: 或者通过X11 Forwarding远程显示CentOS的图形化程序文字乱码: 二、解决方法 安装中文语言包: yum install kde-l10n-Chinese 注:网上有些文章会推荐安…

最小化安装BCLinux-for-Euler-21.10-dvd-x86_64-230731版

本文记录最小化安装BCLinux-for-Euler-21.10-dvd-x86_64-230731版。 一、镜像获取 1、下载镜像 移动云官方网站 最新镜像为2023-11-02 15:04:56更新的BCLinux-for-Euler-21.10-dvd-x86_64-230731版 直接下载地址:https://mirrors.cmecloud.cn/bclinux/oe21.10/I…

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入…

excel中提取一串数字中的某几个数字

excel中提取一串数字中的某几个数字 提取一串数字中的某几个数字,使用公式函数截取数据 LEFT函数:用于截取单元格左边的字符,例如“LEFT(A1,5)”会返回A1单元格中的前5个字符。RIGHT函数:用于截取单元格右边的字符,例…

华为云codeArts使用操作流程

一、开启服务 什么是华为云CodeArts? 本实验将在华为云CodeArts平台上搭建一个凤凰商城开发项目,并完成需求管理、代码仓库、代码检查、编译构建、发布、部署、流水线等软件开发操作。 1)新建项目 进入华为云“控制台”,鼠标移动到页面左侧菜…

【鸿蒙】大模型对话应用(二):对话界面设计与实现

Demo介绍 本demo对接阿里云和百度的大模型API,实现一个简单的对话应用。 DecEco Studio版本:DevEco Studio 3.1.1 Release HarmonyOS SDK版本:API9 关键点:ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 对话页…

Mac下手动源码编译安装Swig

使用Homebrew安装 这个方式最简单,但是一般都是安装的最新版: brew install swig如果按照特定版本,需要看一个当前支持的列表: brew search swig brew install swig3源码编译安装 swig依赖pcre库,需要先安装pcre …

一文掌握SpringBoot注解之@Component 知识文集(8)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

Nginx 本地部署vue项目

1、 下载 Nginx 稳定版本 2、下载安装后,打开 nginx.conf配置文件 3、找到打包好的文件,并配置运行文件 文件的位置 root C:/server/build location /{root C:/server/build;index index.html index.htm;#解决刷新后nginx报404问题try_files $uri …

redis复习笔记05(小滴课堂)

案例实战之注册登录-图形验证码谷歌开源Kaptcha引入 验证码配置工具类。 验证码存储Redis逻辑编码实战 工具类用于获取本机ip和md5加密,直接使用就行,我们这里主要是学习redis不是学习这个。 获取验证码并存到redis中的接口: 运行测试&…

聚焦AI新动能,九州未来与燧弘华创签约!

1月24日,厦门市电子信息与人工智能产业高质量发展大会成功举办。来自电子信息产业、人工智能领域的企业家、专家等近300位嘉宾齐聚一堂,共谋智能基础,共话产业合作,共享发展商机。 会上,九州未来与燧弘华创签署算力租…

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇,我们介绍了Tomcat提供服务的整体结构,本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能: 处理 Socket 连接,负责网络字节流与…

详解SpringCloud微服务技术栈:深入ElasticSearch(1)——数据聚合

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch实战(旅游类项目) 📚订阅专栏&#x…

Docker容器引擎镜像创建

目录 一、镜像的创建 (一)基于现有镜像创建 1.启动一个镜像,在容器里做修改 2.将修改后的容器提交为新的镜像 (二)基于本地模板创建 (三)基于Dockerfile 创建 1.联合文件系统&#xff08…

【DB2 流浪之旅】 第一讲 Linux 环境安装 db2 数据库

DB2数据库是IBM开发的一种大型关系型数据库平台。它支持多用户或应用程序在同一条SQL 语句中查询不同database甚至不同DBMS中的数据。一般DB2是搭配IBM Power系列小机使用的,兼容性好、性能高。当然DB2也有Linux版本的,相对性能会差一些,主要…

大创项目推荐 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…

前端基础-事件循环(消息循环)

这里写自定义目录标题 1. 浏览器进程主要的进程(了解) 2. 渲染主线程是如何工作的?3. 面试题:如何理解 JS 的异步?3. JS为何会阻碍渲染?4. 任务有优先级吗?5. 面试题:阐述一下 JS 的…

React-Native跟Android交互--简单示例记录

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程:https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

Docker 镜像的创建

创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建。 一、基于现有镜像创建 创建nginx镜像: 1、首先启动一个容器,在容器里做修改 2、然后将修改后的容器提交为新的镜像,需要使用该容器的 I…