当前位置: 首页 > news >正文

TCP核心机制详解(三)

目录

前言:

滑动窗口

滑动窗口处理丢包问题

流量控制

拥塞控制

延时应答

捎带应答

面向字节流

异常情况

小结:


前言:

    前两篇文章讲述了,TCP十种核心机制的前三种。这篇文章详细介绍其他的一些核心机制,让我们更深入理解网络原理。

滑动窗口

    由于TCP为了保证可靠性,引入了一些机制。这些机制必然导致TCP的效率降低。比如每发一个数据报就需要等待ACK(比较消耗时间)滑动窗口就是为了提高TCP的效率。

    滑动窗口本质上就是降低了确认应答等待ack的时间(批量发送,批量等待)。对于基本的确认应答情况来说,每次发一个数据,都要等待ack。而滑动窗口的本质就是不等待的批量发送一组数据,然后使用一份时间来等待一组多个ack。这里把不需要等待就直接发送的数据称为“窗口大小”。 

    注意:这里在等待ack的时候,不是说等待所有的ack全部到达后才继续发送,而是只要到达一个ack就继续发送。那么窗口的大小始终都是不变的,同时也体现出 “滑动”的特性。

滑动窗口处理丢包问题

1)ACK丢了

    不需要做任何事情,只要后面的ack到达了,就可以证明前面的数据到达了。ACK返回的确认序号就是证明这个序号以前的数据已经成功到达。

2) 数据包丢了

解释:

    如果2001 - 3000的数据丢了,后面的ack都是2001。直到数据发送到7001 - 8000返回的ack也是2001(索要2001的数据)。这时候主机A发现丢包了,将2001 - 3000的数据包重新传一下,然后返回的ack就是8001(最新的索要序号)。就证明前面的数据发送完成。

    这样的重传方式叫做“快速重传”。如果传输数据密集,采用滑动窗口的方式,使用快速重传处理丢包。如果数据传输不是很密集,不按照滑动窗口的方式,就是一般的超时重传。

流量控制

    滑动窗口越大,传输效率就越高(一份时间等待的ack就越多),但是窗口也不能无限大。需要根据接收方处理数据的能力来控制窗口的大小。

    衡量接收方处理数据的能力,直接查看缓冲区剩余空间的大小。

    每次发送方发送数据,接受方返回的ack就会携带,根据缓冲区剩余空间大小计算的窗口大小。选项中存在“窗口扩展因子”,接收的窗口值再左移窗口扩展因子位。(为了使窗口足够大,效率做到最大的提升)

注意:

    由于接收方缓冲区大小是动态变化的,那么对应的窗口大小也是动态调整的。

    当窗口大小为0的时候,发送方就会等待。在这个时间里,发送方会发送“窗口探测报文”触发ack查询窗口大小。

拥塞控制

    网络传输中中间需要经历很多节点,现在只考虑了接收方处理数据的能力,如果中间哪个节点处理数据的能力较低,那么总体效率也不会高(木桶效应)。

    流量控制和拥塞控制共同决定窗口的大小。流量控制考虑的是接收方处理数据的能力。拥塞控制考虑的是中间节点处理数据的能力。

    拥塞控制,就是在网络中发生拥塞时(路由器处理数据慢),减少向网络中发送数据的速度,防止造成恶性循环;同时在网络空闲时(路由器处理数据快),提高发送数据的速度,最大限度地利用网络资源。

    由于每次网络传输的中间节点都是不固定的。因此没办法衡量中间节点的处理数据的能力。采用 “实验” 的方式。

注意:

    开始是指数增长,当窗口达到一定大小就变为线性增长。当传输过程一旦丢包了(网络拥塞),说明窗口大小已经是极限了。此时就把窗口大小一下缩小为很小的值(重复刚才的指数增长和线性增长)。

    拥塞窗口不是固定的数值,而是一直动态变化的。随着时间推移,逐渐达到一个相对平衡的状态。        

    拥塞窗口和流量控制共同决定了发送发实际的窗口大小(窗口大小取两者的较小值)。

延时应答

    在滑动窗口的基础上,尽可能的扩大窗口的大小。

    所谓延时就是收到数据后,不是立即返回ack而是稍等一会再返回。等待的时间里,接收方程序就能够把缓冲区的数据处理一波,此时剩余空间就大了,那么发送方窗口也就大了。

    实际上延时应答的具体做法,就是在滑动窗口下,ack不在每一条数据都返回了。比如隔一条返回,相对于第一条数据这里的ack就等于等待了。

捎带应答

    本来ack和要返回的业务数据不是同一时机,但是在延时应答的机制上,可能就会在同一时机。然后就会合并为一条报文发送过去。提高效率的方式。

面向字节流

    TCP的特点就是面向字节流。面向字节流,就引出了一个问题:粘包问题。进行read读取的时候,读到哪里才算结束呢?读到哪里才算一个完整的数据包呢?

解决方案:(需要自己代码实现)

    1)约定好分隔符,当读到分隔符就结束。

    2)约定好每个包的长度,只读取这么长的数据。

异常情况

1)进程崩溃

2)主机关机

3)主机掉电

4)网线断开

注意:

1)

    进程没了,对应的pcb也就没了,对应的文件描述符表也就释放了,相当于Socket.close()。此时内核就会完成四次挥手,也就是正常的断开流程。(主机关机,首先关闭进程,和这里原理一样)。

2)

    假设接收方掉电,发送方等不到ack,然后超时重传多次,依然失败。接下来断线重连(RST复位报文段)还是失败,就单方面放弃了。

    假设发送方掉电,接收方发现没有数据了,先等。这个时候会周期性的发送 “心跳包” 确认对方是否工作正常。(心跳包来确认通信双方是否处在正常的工作状态)

小结:

    TCP核心机制到这里就结束啦,TCP是一个很复杂的协议还有很多的机制。需要继续了解可以去查阅官方文档。

相关文章:

TCP核心机制详解(三)

目录 前言: 滑动窗口 滑动窗口处理丢包问题 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 小结: 前言: 前两篇文章讲述了,TCP十种核心机制的前三种。这篇文章详细介绍其他的一些核心机制,让我们…...

最易上手的爬虫请求库:Requests核心功能速览(下)

上一个章节我们讲了如何快速使用Requests发送网络请求、处理URL参数和提取响应内容,这些是最基本的操作。 然而还有很多场景下,我们的网络请求更加复杂。比如我们必须要定制请求头来假装成浏览器,不然可能会被网站识别为机器并且被屏蔽;又比如我们需要在发送请求时以表单形…...

生产故障|Kafka ISR频繁伸缩引发性能急剧下降

生产故障|Kafka ISR频繁伸缩引发性能急剧下降-阿里云开发者社区 本文是笔者双十一系列第二弹,源于一个双十一期间一个让笔者猝不及防的生产故障,本文将详细剖析Kafka的副本机制,以及ISR频繁变更(扩张与伸缩)为什么会导致集群不可…...

c++终极螺旋丸:₍˄·͈༝·͈˄*₎◞ ̑̑“类与对象的结束“是结束也是开始

文章目录 前言一.构造函数中的初始化列表 拷贝对象时的一些编译器优化二.static成员三.友元四.内部类总结前言 前两期我们将类和对象的重点讲的差不多了,这一篇文章主要进行收尾工作将类和对象其他的知识点拉出来梳理一遍,并且补充前两篇没有讲过的…...

【Python--torch.nn.functional】F.normalize用法 + 代码说明

【Python–torch.nn.functional】F.normalize介绍 代码说明 文章目录【Python--torch.nn.functional】F.normalize介绍 代码说明1. 介绍2. 代码说明2.1 一维Tensor2.2 二维Tensor2.3 三维Tensor3. 总结1. 介绍 import torch.nn.functional as F F.normalize(input: Tensor, …...

【算法题】1887. 使数组元素相等的减少操作次数

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 题目: 给你一个整数数组 nums &#xff0…...

GD库图片裁剪指定形状解决办法(PHP GD库 海报)

需求描述:需要把图片裁剪成一个指定的平行四边形,目的是使用GD库,把裁剪后的图片放在底图上面,使最终合成的图片看起来是一个底图平行四边形的样子提示:可以结合本作者的其他文章,来生成一个定制化的海报&a…...

redis的简介及应用场景

1、基本信息 Redis英文官网介绍: Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queri…...

2、HAL库利用滴答定时器systick(1ms中断)实现时间计数戳

文档说明:通过滴答定时器的1ms中断实现时间计数,标记需要的时间标志,在主函数中查询标志,避免延时函数消耗CPU 1、HAL库systick定时器说明 在CubeMx生成的代码main()函数首先执行的函数为HAL_Init();里面会进行滴答定时器初始化…...

Spring入门学习

Spring入门学习 文章目录Spring入门学习Spring概述Spring FrameworkIOCIOC容器DIIOC容器的实现类①FileSystemXmlApplicationContext②ClassPathXmlApplicationContext基于XML管理bean入门案例创建类创建xml在Spring配置文件中配置bean测试Spring概述 Spring 是最受欢迎的企业级…...

webpack(4版本)使用

webpack简介:webpack 是一种前端资源构建工具,一个静态模块打包器(module bundler)。在 webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块处理。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源(bundle)…...

Linux安装ElasticSearch

下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch 1 版本选择 ElasticSearch 7 及以上版本都是自带的 jdk,假如需要配置指定的 jdk 版本的话,可以在 es 的 bin 目录下找到elasticsearch-env.bat 这个文件&#x…...

Linux中C语言编程经验总结

​ 修改记录 版本号日期更改理由V1.02022-03-15MD化 总则 仅总结一些常用且实用的编程规范和技巧,且避免记忆负担,聚焦影响比较大的20% ! 编译器 打开全warning编译器开关 正例 gcc -W -Wall -g -o someProc main.c反例 gcc -g -o someProc main…...

jvisualvm工具使用

jdk自带的工具jvisualvm,可以分析java内存使用情况,jvm相关的信息。 1、设置jvm启动参数 设置jvm参数**-Xms20m -Xmx20m -XX:PrintGCDetails** 最小和最大堆内存,打印gc详情 2、测试代码 TestScheduleClassGc package com.core.schedule;…...

redis五大IO网络模型、内存回收

目录1.0用户空间和内核态空间1.1 网络模型-阻塞IO1.2 网络模型-非阻塞IO1.3 网络模型-IO多路复用1.3.1 网络模型-IO多路复用-select方式1.3.2 网络模型-IO多路复用模型-poll模式1.3.3 网络模型-IO多路复用模型-epoll函数1.3.4 网络模型-epoll中的ET和LT1.3.5 网络模型-基于epol…...

【C/C++】内存管理详解

目录内存布局思维导图1.C/C内存分布数据段:栈:代码段:堆:2.C语言中动态内存管理方式3.C内存管理方式3.1new/delete操作内置类型3.2new和delete操作自定义类型4.operator new 与 operator delete函数5.new和delete的实现原理5.1内置类型5.2自定…...

Android ProcessLifecycleOwner 观察进程生命周期

文章目录简介使用依赖用法1,结合 LiveData用法2,获取 owner的 lifecycle 实例,并对 lifecycle 添加观察者简介 ProcessLifecycleOwner 直译,就是,进程生命周期所有者。 通过 DOC 注释了解到: Lifecycle.E…...

如何编写一个 npm 插件?

提到写 npm 插件,很多没搞过的可能第一感觉觉得很难,无从下手,其实不然。 我们甚至写个简单的 console.log(hello word),都是可以当成一个插件发布上去的。 其实无从下手的主要难点还是在于你的具体要做的功能逻辑,这…...

mapstruct- 让VO,DTO,ENTITY转换更加便捷

mapstruct- 让VO,DTO,ENTITY转换更加便捷 1. 简介 MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所谓映射指的就是从一个实体变化成一个实体。例如我们在实际开发中,DAO层的实体和一些数据传输对…...

IAR警告抑制及还原

工作中需要临时抑制 警告 Pa084,源代码如下: sy_errno_t sy_memset_s(void *dest, sy_rsize_t dmax, int value, sy_rsize_t n) { sy_errno_t err; if (dest NULL) { return SY_ESNULLP; } if (dmax > SY_RSIZE…...

7.4.分块查找

一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...

Qt 按钮类控件(Push Button 与 Radio Button)(1)

文章目录 Push Button前提概要API接口给按钮添加图标给按钮添加快捷键 Radio ButtonAPI接口性别选择 Push Button&#xff08;鼠标点击不放连续移动快捷键&#xff09; Radio Button Push Button 前提概要 1. 之前文章中所提到的各种跟QWidget有关的各种属性/函数/方法&#…...

可下载旧版app屏蔽更新的app市场

软件介绍 手机用久了&#xff0c;app越来越臃肿&#xff0c;老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法&#xff0c;还能帮我们卸载不需要的app。 手机现状 如今的app不断更新&#xff0c;看似在优化&#xff0c;实则内存占用越来越大&#xff0c;对手机性…...