【计算机网络】传输层协议——TCP(下)

news2024/11/14 20:52:09

文章目录

  • 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就识别到丢包了,进行超时重传

而数据要支持重传,就必须被暂时保存起来,保存到滑动窗口中

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

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

相关文章

星际争霸之小霸王之小蜜蜂(十三)--接着奏乐接着舞

系列文章目录 星际争霸之小霸王之小蜜蜂(十二)--猫有九条命 星际争霸之小霸王之小蜜蜂(十一)--杀杀杀 星际争霸之小霸王之小蜜蜂(十)--鼠道 星际争霸之小霸王之小蜜蜂(九)--狂鼠之…

国家网络安全周 | 天空卫士荣获“2023网络安全优秀创新成果大赛优胜奖”

9月11日上午,四川省2023年国家网络安全宣传周在泸州开幕。在开幕式上,为2023年网络安全优秀创新成果大赛——成都分站赛暨四川省“熊猫杯”网络安全优秀作品大赛中获奖企业颁奖,天空卫士银行数据安全方案获得优秀解决方案奖。 本次比赛由四川…

免费好用的天翎bpm流程引擎,实现生产管理系统

1.什么是生产管理系统 针对中小型制造企业的生产应用而开发,能够帮助企业建立一个规范准确即时的生产数据库,同时实现轻松、规范、细致的生产业务、库存业务一体化管理工作。提高管理效率(企业管理的科学方法)、掌握及时、准确、全…

Mysql高级——索引创建和使用

索引的创建 1. 索引的声明与使用 1.1 索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 从功能逻辑上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。 按照物理实现方式&#xff…

Spring之IOC容器(依赖注入)基本介绍基本配置多模块化

标题一:什么是spring,它能够做什么? Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的…

【计算机视觉 | CNN】Image Model Blocks的常见算法介绍合集(一)

文章目录 一、Residual Block二、Bottleneck Residual Block三、Dense Block四、Squeeze-and-Excitation Block五、Inception Module六、Non-Local Block七、Spatial Attention Module八、Spatial Transformer九、ResNeXt Block十、Fire Module十一、Inception-v3 Module十二、…

数据结构与算法(C语言版)P2---线性表之顺序表

前景回顾 #mermaid-svg-sXTObkmwPR34tOT4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sXTObkmwPR34tOT4 .error-icon{fill:#552222;}#mermaid-svg-sXTObkmwPR34tOT4 .error-text{fill:#552222;stroke:#552222;}#…

拥有这个中文版CustomGPT,你也能定制自己的AI问答机器人

人工智能技术的快速发展为各行各业带来了前所未有的机会,其中之一就是定制化的问答机器人。这些机器人可以用于客户支持、知识管理、虚拟助手等多个领域,帮助企业提高效率,提供更好的用户体验。很多人可能都知道通过CustomGPT能够设计自己的人…

Golang使用sqlx报错max_prepared_stmt_count超过16382

文章目录 背景mysql的预处理查看实例预处理详情com_stmt_prepare开启performance_schema 本地查看预处理语句 预处理语句飙升的原因生成预处理语句但是不close执行sql过程中发生错误 go服务分析抓包分析发送给mysql的包debug查看预处理细节sqlx发送statement command指令sqlx关…

伦敦银时走势与获利机会

交易时间灵活、资金杠杆充沛是伦敦银交易的主要优势,投资者应该充分利用这个品种的制度优势,结合自己个人的作息时间,在工作、投资与生活三者之间取得平衡的前提下,借助国际白银市场的波动,通过交易逐步实现自己的财富…

外贸电商商品如何做好上架工作?

跨境电商业务的蓬勃发展已经成为互联网行业的热点话题之一。不论是将海外货源卖回国内,还是通过国内货源销往海外,跨境电商平台都面临着如何实现商品上架的关键问题。在这篇文章中,将探讨成功上架商品的关键步骤。 一、准备好接口。 跨境电商…

【LangChain系列 10】Prompt模版——Message的partial用法

原文地址:【LangChain系列 10】Prompt模版——Message的partial用法 本文速读: 字符串partial 方法partial partial是什么意思呢?简单来说:将一个prompt模版传入部分变量值而生成一个新的prompt模版,当使用新的promp…

小技巧!Python生成excel文件的三种方式!

在我们做平常工作中都会遇到操作excel,那么今天写一篇,如何通过python操作excel。当然python操作excel的库有很多,比如pandas,xlwt/xlrd,openpyxl等,每个库都有不同的区别,具体的区别&#xff0…

递归路由,怎么递归的?BGP4+

问题 R2上去往5::5的递归路由怎么生成的??? BGP4路由表 Destination : 5:: PrefixLength : 64 NextHop : 4::4 Preference : 255 Cost : …

sed命令在Mac和Linux下的不同

问题 &#xff08;1&#xff09;Windows系统里&#xff0c;文件每行结尾是<回车><换行>, \r\n &#xff08;2&#xff09;Mac系统里&#xff0c; 文件每行结尾是<回车>&#xff0c;即\r &#xff08;3&#xff09;Unix系统里&#xff0c; 文件每行…

Sleuth--链路追踪

1 链路追踪介绍 在大型系统的微服务化构建中&#xff0c;一个系统被拆分成了许多模块。这些模块负责不同的功能&#xff0c;组合成系统&#xff0c;最终可以提供丰富的功能。在这种架构中&#xff0c;一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上&…

Python技巧---tqdm库的使用

文章目录 一、tqdm基本知识二、在pytorch中使用tqdm 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、tqdm基本知识 “tqdm” 是一个 Python 库&#xff0c;用于在命令行界面中创建进度条。 基本使用如下&#xff1a; from tqdm import tqdm impor…

linux安装nacos2.2.0

1、使用docker拉取镜像&#xff1a;docker pull nacos/nacos-server:v2.2.0 2、下载官方配置文件&#xff1a;https://github.com/alibaba/nacos/releases 3、修改配置文件的数据库连接信息&#xff0c;修改完成后将配置文件移至挂载目录/home/shixp/docker/nacos/conf&#xf…

无涯教程-JavaScript - ISNONTEXT函数

描述 如果指定的值引用的不是文本,则ISNONTEXT函数将返回逻辑值TRUE。否则返回FALSE。如果该值引用空白单元格,则该函数返回TRUE。 语法 ISNONTEXT (value)争论 Argument描述Required/OptionalvalueValue or expression or a reference to a cell.Required Notes 您可以在…

Echarts 饼图的详细配置过程

文章目录 饼图 简介配置步骤简易示例 饼图 简介 Echarts饼图是Echarts中常用的一种图表类型&#xff0c;也是数据可视化中常用的一种形式。饼图通过扇形的方式展示数据的比例和占比关系。 Echarts饼图的特点如下&#xff1a; 直观的数据占比展示&#xff1a;饼图通过不同大小…