【计算机网络】传输层协议——TCP(下)
文章目录
- 1. 三次握手
- 三次握手的本质是建立链接,什么是链接?
- 整体过程
- 三次握手过程中报文丢失问题
- 为什么2次握手不可以?
- 为什么要三次握手?
- 2. 四次挥手
- 整体过程
- 为什么要等待2MSL
- 3. 流量控制
- 4. 滑动窗口
- 共识
- 滑动窗口的一般情况
- 理解滑动窗口
- 滑动窗口的特殊情况
1. 三次握手
SYN: 是一个连接请求的报文 (三次握手),发送的是TCP报头
三次握手的本质是建立链接,什么是链接?
操作系统内会存在多个已经建立好的链接,操作系统是需要把这些建立好的链接 管理起来的
而管理的本质是 先描述 在组织
操作系统内为了管理连接维护的数据结构
先使用 struct tcp_link结构体,内部包含链接的各种字段
再使用链表 将其组织起来
创建并维护链接是有成本的
1. 内存空间的消耗 (想要创建链接,就需要创建链接对象,所以就要new/nalloc链接对象)
2. CPU资源的消耗 (维护定时器,来保证超时重传等)
整体过程
客户端只要把 SYN 发出去了,客户端的状态变为 SYN_SENT,称为 同步发送
只要服务器端收到 SYN,服务器端的状态 变为 SYN_RCVD
服务器端再进行 SYN+ACK 响应,响应后
客户端收到了ACK,并且发出ACK时,客户端的三次握手就完成了
服务器端直到收到 ACK时,服务器端的三次握手才完成
三次握手过程中报文丢失问题
若第一个报文丢失 即SYN丢失
服务器端不会受到任何影响,因为从来没有收到过报文
若第二个报文丢失 即SYN+ACK丢失
双方的三次握手过程没有成功,因为双方的连接没有建立起来
若第三个报文丢失 即ACK丢失
对于客户端来说,只需把ACK发出,就认为 三次握手就完成了
对于服务器端来说,只有收到了ACK报文,才认为三次握手完成了
所以当ACK报文丢失时,客户端认为完成了,而服务器端认为没完成
此时客户端认为建立好了,所以会直接给服务器发消息
而服务器端没建立好,则服务器端立即进行连接重置,响应RST
此时客户端会把连接关掉,然后重新建立连接
为什么2次握手不可以?
2次握手不可以,因为非常容易收到攻击
很容易收到 一台机器不断给你发送海量的SYN,服务器端收到SYN后,直接就给ACK不管客户端有没有收到
服务器已经认为建立好了连接
维护连接是有成本的,如果机器发送大量的SYN
服务器立马维护,就会立马消耗内存,内存被消耗的非常多,可能服务器无法对正常用户提供服务
为什么要三次握手?
1. 没有明显的设计漏洞,一旦建立连接出现异常,成本嫁接到客户端,服务器端成本较低
2. 验证双方的通信信道的通畅情况
三次握手是验证全双工通信 信道通畅的最小成本
第一次握手时,能证明 客户端 能发报文
第二次握手时,能证明 客户端 能收报文
第一次握手时,证明服务器 能收到报文
第三次握手时,能证明服务器 能发报文
(只有当客户端收到报文时并做出应答时,才能证明服务器发了报文)
2. 四次挥手
断开时,客户端想断开,服务器有可能不想断开
服务器想断开,客户端有可能不想断开
要断开连接,是需要征得双方同意的,不能只征得一方同意,因为双方的地位是对等的
四次挥手使双方以最小成本断开
整体过程
FIN: 是一个连接断开的请求报文
第一次挥手:
当发送 FIN报文后, 客户端状态 为 FIN_WAIT 1
服务器端收到FIN 报文 ,服务器端状态为 CLOSE_WAIT
第二次挥手:
客户端收到 服务器 做出 响应的 ACK报文时,客户端 状态为 FIN_WAIT 2
第三次挥手:
若服务器端也想断开连接,则向客户端发送 FIN报文,之后服务器端 进入 LAST_ACK 状态
第四次挥手:
客户端收到 收到服务器来自 FIN报文后,会向服务器端发送ACK应答
由于是客户端主动关闭,所以客户端之后进入 TIME_WAIT 状态,而服务器收到 来自客户端的ACK应答后,服务器就进入 CLOSE状态
客户端进入 TIME_WAIT 状态,需要等待2MSL后,客户端进入CLOSE 状态
发出最后一次 ACK报文后, 客户端就认为 完成 四次挥手
服务器端收到 ACK报文,服务器端才认为 完成 四次挥手
主动断开连接的一方,一定会发送最后一次ACK报文
为什么要等待2MSL
TCP协议规定 主动关闭连接的一方 要进入 最终的TIME_WAIT 状态,并且等待 2MSL
MSL 表示 一个报文在网络里存在的最大时间
TCP规定一般要等待 2个 MSL时间
发出的报文的最大生存时间是 1个 MSL,对方将来需要应答,应答的时间也是一个 MSL
要等待2MSL
保证两个传输方向上的尚未被接收 或 迟到 的报文段 都已经消失
若不等待2MSL
则有可能 刚把连接断开,网络里有断开连接之前的残余报文,断开连接后,立马对服务器进行重新连接
当把连接建立好后,就会有历史的残余报文存在,就会影响接收方对应的正常的接收数据
所以尽量保证历史的报文消散,不要影响下一次 正常通信
3. 流量控制
客户端和服务器在通信时,都有自己的发送和接收缓冲区
客户端发数据时,将客户端的发送缓冲区里的数据 发送到 服务器的接收缓冲区 中
服务器发数据时,将服务器的发送缓冲区里的数据 发送到 客户端的接收缓冲区 中
在确认应答中,就可以携带16位窗口大小,来表示接收缓冲区中剩余空间的大小,即承载能力
作为接收方,知道了数据接收的承载能力,可以让发送方发送数据时,发送慢一点,导致能够接收
这种操作就叫做 流量控制
若接收端发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值 通知给发送端
若发送端接收到这个窗口之后,就会减慢自己的发送速度
若接收端缓冲区满了,就会将窗口置为0,这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端
4. 滑动窗口
共识
对于每个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段
但是这样做 收发效率非常低下
并发访问效率高,但是也是有接收能力上限的
发送方并发发送,一定要在对方能够接受的前提条件下,进行并发发送
发送方最大一次可以向对方发送多少数据,是由对方的窗口大小决定的
滑动窗口的一般情况
因为接收方的接受能力有限,所以发送方的发送
发送方的发送速度受对方接收缓冲区剩余空间大小影响的
滑动窗口是发送缓冲区的一部分
滑动窗口这部分数据 :暂时不用收到应答,可以直接发送
因为滑动窗口的存在,将发送缓冲区切成三部分
左侧 称为 已经发送已经确认
可以被覆盖 即无效数据
右侧 称为 尚未发送的数据区域
滑动窗口:可以直接发送,但是尚未收到应答
滑动窗口的大小与对方的接收能力有关
理解滑动窗口
把发送缓冲区 看作一个char类型的数组
因为char类型 只占一个字节,体现字节流
该数组叫做 sendbuffer
滑动窗口本质就是 由两个数组下标(start end)维护的区间
窗口进行滑动 就是让 start 和end 下标进行++
滑动窗口的特殊情况
情况1 ——滑动窗口只能向右滑动吗? 能不能向左滑动?
不能向左滑动,因为左侧的区域是 已经发送并且收到确认的数据,没有意义
所以只能向右滑动
情况2 ——滑动窗口能变大,能变小吗?能变成0吗? 变0之后表示什么意思?
可以变大/变小,滑动窗口变大变小 是取决于对方的接收能力的
滑动窗口变大 即 end 下标增加
滑动窗口变小 即 end下标不动,start下标向右移动
所以 滑动窗口的大小是浮动的,不是固定大小的
接收方的上层应用层 从来不取数据,则会导致接收缓冲区的剩余空间 越来越小,直至为0
从而导致发送方的发送数据越来越少,直至为0 即 滑动窗口为0 表示对方无法接收
start 和end 指向同一个
情况3 —— 滑动窗口内存在多个报文 可以直接发送,如果第一个丢失了呢?
若有报文 1000 2000 3000 4000
若第一个报文1000丢失,则有两种情况
情况1:报文收到了,但是确认应答(ACK)丢失
根据确认序号,当收到报文2000 对应的确认应答2001时,就知道对应的报文1000,接收方一定收到了
情况2:第一个报文1000的数据丢失
此时由于第一个报文丢失了,即 1001-2000区间内的数据丢失了 ,所以确认序号不能返回2001 、3001
因为 2001 表示 2000之前的序号全部接收到了,而1000是没有接收到的
所以就只能返回确认序号1001,表示1000之前的序号已经收到了
所以就会收到很多重复的ACK序号,TCP就识别到丢包了,进行超时重传
而数据要支持重传,就必须被暂时保存起来,保存到滑动窗口中
相关文章:
【计算机网络】传输层协议——TCP(下)
文章目录 1. 三次握手三次握手的本质是建立链接,什么是链接?整体过程三次握手过程中报文丢失问题为什么2次握手不可以?为什么要三次握手? 2. 四次挥手整体过程为什么要等待2MSL 3. 流量控制4. 滑动窗口共识滑动窗口的一般情况理解…...
Vue前端页面打印
前端依赖10-插件"print-js": “^1.6.0” 一:简介 print-js 是一个 Vue.js 插件,用于在 Vue.js 项目中实现打印功能。它依赖于 print-js 库,所以需要安装这个库。 能实现以下功能: PDF打印(默认ÿ…...
Visual Studio将C#项目编译成EXE可执行程序
经常看文章时会收获不少实用工具,有的在github上是编译好的,有的则是未编译的项目文件。所以经常会使用Visual Studio编译项目文件成exe可执行程序,以下为编译的流程。 第一步,从github上下载项目文件,举个例子&#…...
git把某一次commit修改过的文件打包导出(git)
1、使用命令把修改的文件打包导出:打包某次commit: git diff-tree -r --no-commit-id --name-only f4710c4a32975904b00609f3145c709f31392140 | xargs tar -rf xxx_1.1.tar 2、使用命令把某次节点后的文件导出: window 下: git diff f4710c4a32975904b00609f3145c709f31392…...
Vue3 Ajax(axios)异步
文章目录 Vue3 Ajax(axios)异步1. 基础1.1 安装Ajax1.2 使用方法1.3 浏览器支持情况 2. GET方法2.1 参数传递2.2 实例 3. POST方法4. 执行多个并发请求5. axios API5.1 传递配置创建请求5.2 请求方法的别名5.3 并发5.4 创建实例5.5 实例方法5.6 请求配置项5.7 响应结构5.8 配置…...
idea2023全量方法debug
为什么要全量debug 刚上手项目或者研读开源项目源码的时候,我们对项目的结构,尤其是功能链路非常陌生,想要debug根本不知道断点打在哪,光靠文件名类名或者方法名去猜也不是个事。这时候只要配置一下全量debug模式,就能…...
Docker镜像解析获取Dockerfile文件
01、概述 当涉及到容器镜像的安全时,特别是在出现镜像投毒引发的安全事件时,追溯镜像的来源和解析Dockerfile文件是应急事件处理的关键步骤。在这篇博客中,我们将探讨如何从镜像解析获取Dockerfile文件,这对容器安全至关重要。 02…...
使用maven命令打jar包
参考:https://blog.csdn.net/qq_27525611/article/details/123487255 https://blog.csdn.net/qq_35860138/article/details/82701919 小伙伴给我的项目自己尝试命令行打包遇到的坑,简单记录下 // 打包(1.8环境下打的,17会报错&…...
【多线程】死锁 详解
死锁 一. 死锁是什么二. 死锁的场景1. 一个线程一把锁2. 两个线程两把锁3. N 个线程 M 把锁 三. 死锁产生的四个必要条件四. 如何避免死锁 一. 死锁是什么 死锁是这样一种情形: 多个线程同时被阻塞,因为每个进程都在等其他线程释放某些资源,…...
成考[专升本政治]科目必背知识点
1. 马克思主义哲学研究的对象是:关于自然、社会、思维发展的一般规律。 2. 对待马克思主义的科学态度是:坚持和发展。 3. 物质的唯一特性是客观实在性。这里的客观实在是指:不以人的意志为转移。 4. 在实际工作中,要注意掌握…...
spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表
一、添加aop starter依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>二:自定义字段翻译注解。(修改功能时,需要显示如…...
【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)
目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量(Tensor) 1. 维度(Dimensions) 2. 数据类型(Data Types) 3. GPU加速(GPU Acceleration) 一、前言 ChatGP…...
多线程|多进程|高并发网络编程
一.多进程并发服务器 多进程并发服务器是一种经典的服务器架构,它通过创建多个子进程来处理客户端连接,从而实现并发处理多个客户端请求的能力。 概念: 服务器启动时,创建主进程,并绑定监听端口。当有客户端连接请求…...
云计算——ACA学习 云计算分类
作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页 目录 写在前面 前期回顾 本期介绍 一.云计算分类 1.公有云…...
3 分钟,带你了解低代码开发
一、低代码平台存在的意义 传统软件开发交付链中,需求经过3次传递,用户→业务→架构师→开发,每一层传递都可能使需求失真,导致最终交付的功能返工。 业务的变化促使软件开发过程不断更新、迭代和演进,而低代码开发即是…...
小白学Unity03-太空漫游游戏脚本,控制飞船移动旋转
首先搭建好太阳系以及飞机的场景 需要用到3个脚本 1.控制飞机移动旋转 2.控制摄像机LookAt朝向飞机和差值平滑跟踪飞机 3.控制各个星球自转以及围绕太阳旋转(rotate()和RotateAround()) 1.控制飞机移动旋转的脚本 using System.Collections; using…...
接口自动化测试推荐用什么框架?
在推荐接口自动化测试框架时,需要考虑多个因素,包括项目需求、技术栈、团队经验和个人偏好。 以下是几个常用的接口自动化测试框架供你参考: Postman: Postman是一个功能强大且易于上手的接口测试工具,它提供了许多…...
防火墙 FireWall
这里写自定义目录标题 一、概述二、防火墙分类三、防火墙性能四、硬件防火墙定义五、硬件防火墙作用(拓扑图 ups)六、硬件防火墙品牌七、软件防火墙八、iptables一、iptables是什么?二、netfilter/iptables功能三、iptables概念四、iptables中…...
【Linix-Day12-线程同步和线程安全】
线程同步 和 线程安全 线程同步 除了信号量和互斥锁(互斥锁和条件变量上次介绍过),还有两种方式同步 1.读写锁 当同时对一块内存读写时,会出现下列问题,故而引入读写锁 接口介绍: 1.int pthread_rwloc…...
C++中使用嵌套循环遍历多维数组
C中使用嵌套循环遍历多维数组 一维数组:数组元素可以看做是一行数据。 二维数组:更像是一个表格,既有行数据又有列数据。 C没有提供二维数组类型,但用户可以创建每个元素本身都是数组的数组。例如,假设要存储 5 个城…...
linux入门---命名管道
如何创建命名管道 使用mkfifo函数就可以在程序里面创建管道文件,该函数的声明如下: 该函数需要两个参数,第一个参数表示要在哪个路径下创建管道文件并且这个路径得待上管道文件的名字,因为每个文件都有对应的权限,所…...
SpringBoot2.0入门(详细文档)
文章目录 Springboot是什么Springboot2.x依赖环境和版本新特性说明为什么学习Springboot从springboot优点来看从未来发展的趋势来看 开发环境Spring Boot开发环境搭建和项目启动jdk 的配置Spring Boot 工程的构建maven配置IDEA 快速构建maven 创建工程常用注解 完整代码 Spring…...
Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私
1. 引言 Aztec的架构,不同于当前“通过EVM兼容执行环境”所实现的区块链水平扩容趋势。Aztec内部笑称其构建的为首个非zkEVM协议。 Aztec专注于实现: 成为理解和需要智能合约隐私的开发者的终极解决方案。 Aztec为开发者提供构建隐私优先app所需的网…...
【Vue】详细介绍Vue项目的目录结构及各个核心文件的示例代码
Vue.js并没有严格的文件和目录结构要求,但一般情况下,我们的Vue项目目录结构如下: ├── node_modules/ # 项目依赖的 node 模块 ├── public/ # 公共资源目录 │ ├── favicon.ico # 网页图标 │ └──…...
【人大金仓】迁移MySql数据库到人大金仓,出现sys_config表重复
需要迁移的数据库中有张表名称为sys_config,查询的时候查询结果不符合我们的预期,经咨询金仓售后人员后得知和系统表重名… 解决问题方法如下: alter database [数据库名] set search_path to "$user", [模式名,(可选&…...
linux内核进程间通信IPC----消息队列
消息队列:提供一种从一个进程向另一个进程发送一个数据块的方法。与FIFO相比,消息队列的优势在于,它独立于发送和接收进程而存在。 1.链表式结构组织,存放于内核。 2.通过队列标识来引用。 3.通过一个数据类型来索引指定的数据。 …...
PHP实现微信小程序状态检测(违规、暂停服务、维护中、正在修复)
实现原理 进入那些状态不正常的小程序会被重定向至一个Url,使用抓包软件抓取这个Url,剔除不必要参数,使用cURl函数请求网页获得HTML内容,根据内容解析出当前APPID的小程序的状态。 代码 <?php// 编码header(Content-type:ap…...
ubuntu在线直接升级
前几天VMware上安装了ubuntu,当时的内核版本支持(ipguard,加密软件),后来ubuntu自动升级了linux内核,导致加入软件不支持,无法访问加密文件了。后来加密软件商更新了软件,但还是赶不上linux内核更新速度,还…...
学习笔记:卸载nav2 navigation2导航
nav2二进制文件安装 nav2导航安装方式分为二进制文件安装和源码方式安装,如果想用最快的方式跑通代码,推荐二进制安装,不用编译,没有缺少依赖编译失败的烦恼, 安装命令: sudo apt install ros-$ROS_DISTR…...
觉非科技数据闭环系列 | BEV感知研发实践
随着自动驾驶迈向量产场景,“BEV感知数据闭环”已成为新一代自动驾驶量产系统的核心架构。数据成为了至关重要的技术驱动力,发挥数据闭环的飞轮效应或将成为下半场从1到N的胜负关键。 觉非科技在此方面已进行了大量的研究工作,并在实际量产项…...
做网站seo推广公司/百度seo网站优化 网络服务
启明星新版增加系统,增加了请假时长的自动计算。本文讨论请假系统算法的实现。(如果您有好的算法,欢迎和我联系。) 在请假前,我们假定,公司的工作时间是 上午:8:00--12:00 下午13:00…...
企业门户网站属于什么层/免费个人网站建站申请
关于德扑AI有两个核心问题: "它是如何工作的?" 和" 为什么这么玩能赢?" 对于第一个问题的答案是一些算法的名字(i.e. Counterfactual Regret Minimization)。对于第二个问题的答案是博弈论中的一些概念(i.e. Nash Equili…...
邢台企业做网站/关键词优化设计
1.变量 sass中可以定义变量,方便统一修改和维护。 //sass style //----------------------------------- $fontStack: Helvetica, sans-serif; $primaryColor: #333;body {font-family: $fontStack;color: $primaryColor; } //css style //---------------------…...
做标签网站是什么样的/贵阳搜索引擎排名推广
VMware发布Linux虚拟桌面技术预览版 在众多客户的一片呼吁声中,VMware在3月中旬发布了Linux虚拟桌面的技术预览版。从此,用户可以通过VMware Horizon View来建立、发布并管理Linux虚拟桌面了。抢鲜尝试连接: http://www.surveymethods.com/En…...
可以做软件的网站有哪些内容吗/seo刷关键词排名软件
流程控制if-else语法:if 条件:语句else:语句例子:a1#使用方式一if a>1:print(大于1)else:print(小于等于1)#使用方式二print(大于1) if a>1 else print(小于等于1)输出:>>小于等于1>>小于等于1if-elif-else语法:if 条件:语句elif 条件:语句else:语句例子a1if…...
产品做优化好还是超级网站好/广西seo
正则 (20\d{2}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2},\d{1,4}) - (.\.py)\[line:(\d{1,5})\]\[(.)\] - (.)\n替换为 \n时间:$1\n定位的文件:$2\n所在行数:$3\n函数名:$4\n日志信息:$5\n时间:2022-06-24…...