【网络协议栈】Tcp协议(下)的可靠性和高效性(超时重传、快速重传、拥塞控制、流量控制)

news2024/11/24 20:48:15

绪论:
承接上文,上文写到Tcp协议的结构以及对tcp协议的性能优化的滑动窗口,本章我们将继续了解Tcp协议的可靠性和高效性的具体展示。后面我将继续完善网络协议栈的网络层协议敬请期待!
请添加图片描述
话不多说安全带系好,发车啦(建议电脑观看)。


OSI定制的七层网络协议栈:
在这里插入图片描述

Tcp协议可靠性和高效性:

在这里插入图片描述

1. 再次对tcp序号的理解:

发送的数据本质是从发送缓冲区中来的,而发送缓冲区本质就是个字符类的数组,所以tcp的序号本质其实就是缓冲区数组的下标!
也就有一下几点需要注意的:

  1. 序号表示的并不是数据的起始位置,而是终点位置
  2. 返回来的确认序号表示的则是下一次从那个序号开始,而不是表示为下次要发的序号
  3. 接收、发送缓冲区:char类型的数组
    在这里插入图片描述
    我们看到的数组数据的插入和删除也就是所谓的面向字节流(流在缓冲区中是不断的进出进出的类似于流动的概念)

注:

  1. tcp是不管报文的分割的,他只进行将tcp报文的报头和有效载荷(数据)的分割,将数据存进对应的缓冲区中(留给应用层使用)
  2. 在不同的tcp连接中他们tcp报文的序号是能一致的,但因为每对tcp他们的源端口和目的端口是不一样的连接都要有自己的发送和接收缓冲区,所以并不会影响

2. 超时重传

先通过图片大概了解其过程,后面通过文字描述后就会更加清晰的认识
在这里插入图片描述
上图在A->B过程中报文丢失。
在这里插入图片描述
上图是B主机返回的应答丢失
上面都是超时重传的机制发送的情况:

当A主机发送报文给B主机,当一段时间内未收到返回的应答报文,那么主机A就会再次发送报文数据给B主机。

因为有了超时重传机制,所以也会一下问题:

主机B可能会接受到同一个报文(某个报文在某处堵塞了会,导致主机A又重传,而那个报文阻塞后发送到了B主机),所以主机B还需要能够识别出那些包是重复的包并去重(此时就可以通过查看序号是否重复)

也表明:
发送方一旦把数据发出去,一段时间内已经发送的数据是不能被移除的,要被暂时保存起来(于滑动窗口有关)。

网络的状态是变化的,超时时间设置太久会影响效率,超时时间太短过于频繁的重传(去重次数增加),所以超时时间也是变化的(根据网络的状况)

超时时间的设置:
在Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制, 每次判定超时重发的超时时间都是500ms的整数倍

  1. 如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.
  2. 如果仍然得不到应答, 等待 4*500ms 进行重传. 依次类推, 以指数形式递增.
  3. 累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接.

3. 连接管理

在这里插入图片描述
图中SYN_SENT(#define SYN_SENT 1)、SYN_RCVD、ESTABUSHED其实就是宏,将这几个宏对应的值填进下方结构体status中就完成了握手,三次握手是仅传递的是报头(不带数据)。
OS管理链接(先描述再组织)的本质就是结构体:

struct links
{
    string src_ip; 
    string dst_ip;
    int srcport/dstport;   
    uint64_t timestamp;
    int status;
    int urgdatatptr;//
    struct links* next;
};

所谓的链接就是双方维护的数据结构
并且需要理解:建立维护 连接 是有成本的(时间 + 空间(创建结构体))
在这里插入图片描述

4. SYN洪水问题:

Server被发送大量SYN建立连接请求(建立连接是有成本的),但并不为了真正的连接。这些假链接就会导致真链接在传输过程中被大量假链接阻挡,从而导致三次握手完成不了,也就使其无法上网。

为什么要三次握手:

在这里插入图片描述

  1. 以最小成本印证全双工(全双工:既能接收数据又能发送数据;C、S都能验证你能接收和发送数据;第一连接能证明:Server能收数据、第二次连接能证明:Client能收 发数据,第三次连接才能证明S能发数据(发出报文并且收到答应ACK才能证明能发送数据,而只要能接受到数据就表明能接受数据)),一次两次都无法完成。
  2. 奇数次握手,能保证客户端优先把链接建立好,然后服务器才建立
  3. 4次握手 + 捎带应答 = 三次握手在这里插入图片描述

四次挥手:

通过四次挥手进行连接的断开
在这里插入图片描述
他本质上来说也是能写成3次挥手的,但是因为在第二次挥手中,ACK和FIN一般不会同时发送(可以理解成断开连接是需要双方同意 确认的,所以需要分开来发送)(通俗的把三次握手看成渣男(发来就直接同意),把四次挥手看成结婚(需要双方同意))

断开连接需要 C -> S 和 S -> C(断开的本质是断开c 、 s的读写描述符也就是关闭打开文件,通过函数shutdown())
在这里插入图片描述

上图若不 close(断开连接)就会一直在 close_wait状态(而这个状态会持续较长时间),而文件描述符就没有被关闭,也就表明了连接还存在,就会持续的占用系统资源(维护的连接结构体)从而导致服务器越来越卡!(在网络应用中)

注:
查看一些配置信息(ip信息):ifconfig

在这里插入图片描述
在一台主机上,因为Tcp是全双工的所有连接一次就会有两个连接分别是S->C、C->S


5. 报文的最大存活时间(MLS)

TIME_WAIT(不认识的TIME_WAIT可以看看这篇blog)让报文消散原理:将TIME_WAIT时间设置比MLS长即可

TIME_WAIT存在的时间是:2MLS,这样就能一定保证阻塞的数据,再超时重传后不会再次发来(MLS时间就消散了,2MLS肯定没了)
(MLS是报文的最大存活时间,不同系统设定的时间是不一致的,其中centos7中MSL是60s)

查看MLS:
cat /proc/sys/net/ipv4/tcp_fin_timeout

在这里插入图片描述


6. 快(速)重传:

当发送方连续收到的ACK是同样的确认序号时,会立即将对应的报文进行补发(因为当发送方连续收到的ACK是同样的确认序号时,是不对的,本应该是收到每个发送数据对应的确认序号(序号+1),对此表示着有报文的丢失(因为正常的确认序号之前的数据都是收到的,所以丢失的报文就是发回来的确认序号后面的那个报文数据,下图返回的是1001(表示1000之前的数据是接收到的,而后面的丢失了)所以丢失的就是1001~2000的这段数据报文))
在这里插入图片描述
发送方,发送的数据发送出去,一段时间内,已经发送的数据不能被移除,会被暂时保存起来,这些暂时保存起来的数据都是在发送缓冲区的滑动窗口,只有收到对应的应答时,才会通过窗口滑动,删除指定的报文(被覆盖)

在当ACK丢了时:
在这里插入图片描述

  1. 最前面的ACK丢了时(1001),后面的ACK只要正常发送(2001),默认表示前面的数据也是被接收到了的(ACK答应报文)
  2. 而若是中间或者最后的报文丢了时,同样的转换成把他当成最前的ACK丢失,先看后面的是否有成功的(因为窗口是不断往右扫描的,当扫描到中间/最后时,它又变成了最前,这样就能套用1的方法)

7. 快(速)重传 VS 超时重传

快重传的前提连续收到三个以上的序号报文
快重传 和 超时重传他们是相互配合的:
超时重传是兜底的,快重传是提高效率的重传策略,两者相互配合

滑动窗口里面有很多可以直接发送的数据,为什么要分成多个数据段发送,不直接发一个就行了?

  1. TCP协议在传输数据时数据报文的最大消息长度(MSS)限制
  2. 避免设备处理不过来而导致的数据丢失或网络拥塞(数据从主机传送到另一个主机往往要经过路由器、网关等设备,这些设备对数据的处理能力有限。)
  3. 提高传输效率:并发多个发送多个数据段。
  4. 流量控制:接收方可以通过滑动窗口的大小来控制发送方的发送速度,从而避免网络拥塞(窗口)
  5. 差错控制:滑动窗口协议具有自动重传的功能

8. 拥塞控制:

若出现了大面积丢包,发送方就会判定是否是网络出现了问题(少量丢包采用重传是非常合理的,若大面积丢包则不能重传,就再不适合重传了,因为此时网络已经非常拥塞,再重传会损坏到网络甚至导致网络瘫痪(因为网络不止一个主机多台主机都再向该网络发送数据就可能会导致网络瘫痪))

所以tcp还考虑了网络的健康状态,即若出现大面积丢包,判断网络出现拥塞,拥塞避免算法。

TCP慢启动(拥塞算法)

先发送少量的数据,先摸清楚网络状况, 再决定按照多大的速度传输数据
在这里插入图片描述
若状态不好则先发送少量的数据,然后拥塞窗口然后再以2 ^ n 指数级的增长,前期慢 中后期快

拥塞窗口

拥塞窗口是发送数据的数值,当发送数据量超过这个拥塞窗口的值时,很大概率会网络拥塞。单次发送数据量的多少由滑动窗口决定,所以滑动窗口的大小就应该:

  • 滑动窗口大小 = min(拥塞窗口大小,对方的窗口大小)
  • win_start = ack+seq;
  • win_end = min(拥塞窗口大小,对方的窗口大小)

拥塞控制算法:慢启动 机制
防止滑动窗口一下发送大量数据到网络中,而本来网络状态就是非常拥堵的,就会导致网络状态雪上加霜。
具体如下图(拥塞窗口的增长情况)
在这里插入图片描述
采取的方法:

  1. TCP引入 慢启动 机制, 先发少量的数据, 探探路,每次收到一个ACK应答, 拥塞窗口加1;摸清当前的网络拥堵状态记录,设置拥塞窗口从1开始进行慢启动方式(只是初始慢,增长时并不慢), 再决定按照多大的速度传输数据:
  2. 每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口

  • 使用一个拥塞窗口的阈值(记为ssthresh值):当拥塞窗口增长到一定程度时到达ssthresh,由指数增长变成线性增长。
  • 在每次超时重发的时候, 慢启动阈值会变成原来的一半, 同时拥塞窗口置回1
  • 网络拥塞:
    少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为
  • 拥塞窗口必须一直在变化(探测),因为网络状态是需要一直被探测出来的

9. 延迟应答

在这里插入图片描述
作用:
通过当发送来一个报文后等待一段时间再发送的方法,让接收主机把发送来的数据给取走,从而扩大了窗口的大小,使后面再发送的数据能更大,提高了传输的效率。

其中:窗口越大, 网络吞吐量就越大, 传输效率就越高。
Tcp协议的目标就是在保证网络不拥塞的情况下尽量提高传输效率;

延迟应答一般有两种方法(也表明并不是所有的包都会延迟应答的):

  • 数量限制: 每隔N个包就延迟应答一次(如上图:一般N取2)
  • 时间限制: 超过最大延迟时间(200ms)就延迟应答一次(比如:当等待了200ms后应答一次(这样也能避免超时重传))
    延迟应答使用的情况:

假设接收端缓冲区为1M. 一次收到了500K的数据; 如果立刻应答, 返回的窗口就是500K; 但实际上可能处理端处理的速度很快, 10ms之内就500K数据从缓冲区消费掉了;在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些, 也能处理过来;如果接收端稍微等一会再应答, 比如等待200ms再应答, 那么这个时候返回的窗口大小就是1M;


10. TCP异常情况的解决方案(心跳机制)

  1. 进程终止:底层连接自动正常关闭(连接由OS管理,OS自动四次挥手)
  2. 机器重启:提示用户是否先关闭进程(然后再回到1情况)
  3. 机器掉电/网络断开
    1. 对于长时间的直接掉电/网络断开,通过服务器的心跳机制解决在这里插入图片描述
    2. 对于短时间的掉电/网络断开(网线拔了又快速的插上),此时服务器的心跳机制还没启动所以服务器就认为是正常连接的,对此当服务器给用户再次发送response包时,用户就会返回带有标志位RST的报文,表示连接错误了需要重新连接(因为对用户来说还没进行三次握手能,服务器就直接发送了报文过来)在这里插入图片描述

11. 滑动窗口

滑动窗口blog分开来写了可以看看这篇博客


本章完。预知后事如何,暂听下回分解。

如果有任何问题欢迎讨论哈!

如果觉得这篇文章对你有所帮助的话点点赞吧!

持续更新大量计算机网络细致内容,早关注不迷路。

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

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

相关文章

普推知产:商标初审已下,商标申请通过如何高些!

近期下来一批商标注册的初步审公告通知书,一些客户对商标下证要求比较高的,普推知产商标老杨发现,要像下证高核心还是在于名称,名称起好备用的多,让商标专业人士经检索后层层过滤后提报,通过会好很多。 普推…

CentOS 7镜像下载

新版本系统镜像下载(当前最新是CentOS 7.4版本) CentOS官网 官网地址 http://isoredirect.centos.org/centos/7.4.1708/isos/x86_64/ http://mirror.centos.org/centos/7/isos/ 国内的华为云,超级快:https://mirrors.huaweiclou…

计算机毕业设计Java银行存取系统 银行交易管理系统 金融数据处理 用户存取管理系统(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

信息安全工程师(55)网络安全漏洞概述

一、定义 网络安全漏洞,又称为脆弱性,是网络安全信息系统中与安全策略相冲突的缺陷,这种缺陷也称为安全隐患。漏洞可能导致机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控性下降、真实性不保等问题。 二、分类 网络安全漏洞可以根据…

Unity(四十八):Unity与Web双向交互

效果 游戏对象绑定脚本 游戏脚本源码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Tent : MonoBehaviour {public Camera camera;// Start is called before the first frame updatevoid Start(){}// Update is called once…

面包种类图像分割系统:多层面改进

面包种类图像分割系统源码&数据集分享 [yolov8-seg-GhostHGNetV2&yolov8-seg-C2f-DCNV3等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Globa…

YOLOv11/10/8算法改进【NO.149】引入新的现代卷积网络系列——多阶门控聚合网络

前 言 YOLO算法改进系列出到这,很多朋友问改进如何选择是最佳的,下面我就根据个人多年的写作发文章以及指导发文章的经验来看,按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通: 首推…

JAVA基础:多线程 (学习笔记)

多线程 一,什么是线程? 程序:为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码进程:程序的一次执行过程。 正在运行的一个程序,进程作为资源分配的单位,在内存中会为每个进程分配不同的…

国内大语言模型哪家更好用?

大家好,我是袁庭新。 过去一年,AI大语言模型在爆发式增长,呈现百家争鸣之态。国内外相关厂商积极布局,并相继推出自家研发的智能化产品。 我在工作中已习惯借助AI来辅助完成些编码、创作、文生图等任务,甚至对它们产…

基于SSM轻型卡车零部件销售系统的设计

管理员账户功能包括:系统首页,个人中心,用户管理,配件类型管理,配件信息管理,订单信息管理,检修休息管理,系统管理 用户账号功能包括:系统首页,个人中心&…

鸿蒙是必经之路

少了大嘴的发布会,老实讲有点让人昏昏入睡。关于技术本身的东西,放在后面。 我想想来加把油~ 鸿蒙发布后褒贬不一,其中很多人不太看好鸿蒙,一方面是开源性、一方面是南向北向的利益问题。 不说技术的领先点,我只扯扯…

【汇编语言】第一个程序(二)—— 带你真正了解一个源程序的结构是怎样的

文章目录 前言1. 示例程序2. 伪指令2.1 XXX segment2.2 end2.3 assume 3. 源程序中的“程序”4. 标号5. 程序的结构6. 程序返回7. 语法错误和逻辑错误结语 前言 📌 汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅…

ubuntu22 安装labelimg制作自己的深度学习目标检测数据集

参考文章:目标检测---利用labelimg制作自己的深度学习目标检测数据集-CSDN博客 以上文章是windows下使用的方法,本章是在ubuntu22下使用的方法 一、准备工作 确保您的Ubuntu系统已安装Python 3.7或更高版本。可以通过在终端输入 python3 --version 来检…

2024 BuildCTF 公开赛|MISC

1.what is this? BuildCTF{S0_TH1S_15_M0R5E_C0DE_!!} 2.一念愚即般若绝,一念智即般若生 解压缩密码:s2j6dg* BuildCTF{D3crypt10n_1s_4_l0ng_r04d} 3.如果再来一次,还会选择我吗? 修复png 密码:8!67adz6&#xff…

二进制方式部署k8s集群

目标任务: 1、Kubernetes集群部署架构规划 2、部署Etcd数据库集群 3、在Node节点安装Docker 4、部署Flannel网络插件 5、在Master节点部署组件(api-server,schduler,controller-manager) 6、在Node节点部署组件(kubelet,kube-proxy) 7、查看集群状态 8、运行⼀个测…

springboot087植物健康系统(论文+源码)_kaic

植物健康系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了植物健康系统的开发全过程。通过分析植物健康系统管理的不足,创建了一个计算机管理植物健康系统的方案。文章介绍了植物健康系统的系统…

web3对象如何连接以太网络节点

实例化web3对象 当我们实例化web3对象,我们一般开始用本地址,如下 import Web3 from web3 var web3 new Web3(Web3.givenProvider || ws://localhost:5173)我们要和以太网进行交互,所以我们要将’ws://localhost:5173’的本地地址换成以太…

哪些CRM系统适合医疗行业?主流10款产品全解析

本文介绍了10款crm系统:纷享销客、Zoho CRM、海创CRM、红云CRM、慧影CRM、易华录CRM、用友健康CRM、Highrise CRM、Maximizer CRM、Infusionsoft by Keap。 在医疗行业中,选择合适的客户关系管理(CRM)系统可能是一项令人头疼的挑战…

fastGpt

参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的,ollama由1.5G,还是比较大,所有采用在windows下下载,然后安装的方式,linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…

Vue3学习:汇率计算器案例中event.target与event.currentTarget比较

今天从一本vue.js书中学习了《汇率计算器》的案例,这个案例的效果如下: 案例可以查询人民币、日元、港元、美元、欧元之间的汇率关系,代码中定义了一个汇率表rate,包含了每种货币对其他5种货币的汇率。其中还有一个功能是点击下方…