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 ࿰…...

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的, 第二…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...