网络原理-TCP/IP(4)

TCP原理

滑动窗口

之前我们讲过了确认应答策略,对发送的每一个数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段.  确认应答,超时重传,连接管理这样的特性都是为了保证可靠运输,但就是付出了传输效率(单位时间能传输数据的多少)的代价,因为确认应答机制导致了时间大量都花在ACK上.

既然这样一发一收的效率比较低,那么我们一次发送多条数据,就可以大大提高性能(其实是将多个等待的时间重叠在一起了). (这是降低损失的策略而不是增加速率的策略). 

由上图,这就是滑动窗口方法传递数据的原理,就是把多次请求的等待时间使用同一份时间来等了,减少了总的等待时间.

1.窗口大小指的是无需等待确认应答而可以继续发送数据的最大值.上图的窗口大小就是4000个字节(4个段);

2.发送前四个段时,不需要等待任何ACK,直接发送;

3.收到第一个ACK时,滑动窗口向后移动,继续发送第五个段的数据;以此类推;

4.操作系统内核为了维护这个滑动窗口,需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认过的数据,才能从缓冲区删掉;

5.窗口越大,则网络的吞吐量越高;

那么如果出现了丢包,如何进行重传?这里分两种情况讨论.

情况一:数据包已经到达,ACK被丢了.

这种情况下,部分ACK丢了并不要紧,因为可以通过后续的ACK进行确认;(注意理解:ACK应答报文中的确认序号的含义:eg:2001->2001之前的数据都接收到了(就包含了1001确认序号的情况)). 

情况二:数据包直接丢了.

1.当某一段报文段丢失以后,发送端会一直收到1001这样的ACK,就像是在提醒发送端"我想要的是1001"一样.

2.如果发送端主机连续三次收到了同样一个"1001"这样的应答,就会将对应的数据1001-2000重新发送;

3.这个时候接收端收到1001之后,再次返回的ACK就是7001了(因为2001-7000)接收端其实之前就已经收到了,被放到了接收端操作系统内核的接收缓冲区中. 

这种机制称为"高速重发控制"(也叫"快重传");

流量控制(流控)

 我们知道,通过滑动窗口可以提高传输效率,窗口大小越大,更多数据复用同一块时间等待效率越高.但是窗口可以无限大吗?不能.因为可靠传输的前提->任何提高效率的行为都不影响可靠性.

接收端处理数据的速度是有限的,如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包(因为接收端处理不过来了),继而引起丢包重传等一系列连锁反应.

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度.这个机制就叫做流量控制(Flow Control).

接收端将自己可以接收的缓冲区大小放入TCP首部中的"窗口大小"字段,通过ACK端通知发送端;

窗口大小字段越大,说明网络的吞吐量越高;

接收端一旦发现自己的缓冲区快满了,就将窗口大小设置成一个更小的值通知给发送端;

发送端接受到这个窗口之后,就会减慢自己的发送速度;

如果接收端缓冲区满了,就会把窗口设置为0;这时发送方不再发送数据,但需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端.

接收端如何把窗口大小告诉发送端呢?回忆我们的TCP首部中,有一个16位的窗口字段,就是为了存放窗口大小信息;

那么问题来了,16位数字最大表示65535,那么TCP窗口最大就是65535字节吗?

实际上,TCP首部40字节选项中还包含了一个窗口扩大因子M,实际窗口大小就是窗口字段的值左移M位. 

拥塞控制

之前讲到的流量控制是站在接收方的角度来制约发送速度的,虽然它能够高效可靠的发送大量数据,但是如果在开始阶段就发送大量的数据,仍然可能引发问题.

因为网络上有很多的计算机,可能当前网络状态就比较拥堵.在不清楚当前网络状态的情况下,贸然发送大量的数据,是很有可能雪上加霜的.

TCP引入慢启动机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据.(核心思路:把中间经过的所有的设备,视为整体,然后通过实验的方式找到合适的速率).

 

1.此处引入一个概念为拥塞窗口.

2.发送开始时,定义拥塞窗口为1;

3.每收到一个ACK应答,拥塞窗口+1;

4.每次发送数据包的时候,将拥塞窗口和接收端主机反馈做比较,取较小的值作为实际发送的窗口.

5.如按某窗口大小发送数据之后,出现丢包,就视为中间路径拥堵,就减小窗口大小. 

像上面这样的拥塞窗口的增长速度,是指数级别的,"慢启动"只是指初始时慢,但是增长速度非常快.

1.为了不增长的那么快,因此不能使拥塞窗口单纯的加倍.

2.此处引入一个叫做慢启动的阈值.

3.当拥塞窗口超过这个阈值的时候,不再按指数方式增长,而是按照线性方式增长.

4.当TCP开始启动的时候,慢启动阈值等于窗口的最大值.

5.在每次超时重发时,慢启动阈值会变为原来的一半,同时拥塞窗口置回1;(这个是旧版本了)

少量的丢包,我们仅仅是触发超时重传;大量的丢包,我们就认为网络堵塞; 形成了一种动态平衡:拥塞窗口的大小始终在变,主要是因为拥塞情况在变

当TCP通信开始时,网络吞吐量会逐渐上升;随着网络发生拥堵,吞吐量会立即下降.

拥塞控制,归根结底是TCP协议想尽可能快的把数据传给对方,但是又要避免给网络造成太大压力的折中方案.

TCP拥塞控制的这种过程,就像是热恋的感觉. 

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

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

相关文章

Qt实现类似ToDesk顶层窗口 不规则按钮

先看效果: 在进行多进程开发时,可能会遇到需要进行全局弹窗的需求。 因为平时会使用ToDesk进行远程桌面控制,在电脑被控时,ToDesk会在右下角进行一个顶层窗口的提示,效果如下: 其实要实现顶层窗口&#xf…

计算机设计大赛 深度学习 python opencv 火焰检测识别

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

力扣hot100 对称二叉树 递归

Problem: 101. 对称二叉树 文章目录 思路Code 思路 👨‍🏫 参考 Code 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* …

深入解剖指针篇(3)

个人主页(找往期文章) :我要学编程(ಥ_ಥ)-CSDN博客 目录 二级指针 指针数组 指针数组模拟二维数组 字符指针变量 数组指针 数组指针初始化 二维数组传参的本质 函数指针 函数指针的使用 typedef关键字 函数指针数组 二级指针…

缓存击穿,商详页进不去了!!!

故事 对于小猫来讲,最近的一段日子是不好过的,纵使听着再有节拍的音乐,也换不起他对生活的热情。由于上一次“幂等事件”躺枪,他已经有几天没有休息好了。他感觉人生到了低谷。 当接手这个商城项目之后,他感觉他一直没…

视频怎么加水印?分享两个简单的加水印的方法

在数字媒体时代,视频已经成为信息传播的重要方式。许多人在创作视频是会加上自己独特的水印,防止视频被盗用。水印作为数字版权保护技术的一种,可以有效地防止视频被非法复制、传播或篡改,从而保护创作者的权益和利益。下面我分享…

关闭idea之后,项目还在运行,端口被占用

今天在写项目的时候,中途安装了一个插件,而且插件显示需要重启idea,重启的时候项目正在运行,重启之后发现idea没有显示有项目正在运行,当我要开启项目的时候,发现无法开启,显示端口被占用了&…

【leetcode题解C++】654.最大二叉树 and 617.合并二叉树

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

C++ QT入门2——记事本功能实现与优化(事件处理+基本控件)

C QT入门2——记事本功能优化(事件处理基本控件) 一、记事本功能优化编码乱码问题QComboBox下拉控件QString、string、char * 间的数据转化编码问题解决整合 光标行列值显示记事本打开窗口标题关闭按钮优化—弹窗提示快捷键设计 二、☆ QT事件处理事件处…

flutter GridView控件实践

gridView顶部自带padding问题 如图所示: 顶部有一个比较大的padding。 如何处理:给gridView设置:padding: EdgeInsets.zero,

关于torch_xla.core.xla_model无法导入的问题

直接使用pip install或github中的代码发现仍然无法成功导入torch_xla.core.xla_model, 在conda中conda list发现存在torch_xla为1.0版本,尝试更新发现只有该版本。发现conda_xla库内除了__init__.py以外,没有任何文件。在__init__.py中提示包…

Java 正则匹配sql

文章目录 正则匹配sql表名称insert intoupdate 正则表达式什么时候要加^$ 在线正则校验 正则匹配sql表名称 insert into insert into PING_TABLE (CODE, NAME) VALUES(0, 待提交),(1, 审核中),(2, 审核通过),(3, 已驳回); regex -> insert\sinto\s(\w)\s*\(?update upda…

架构整洁之道-组件构建原则

5 组件构建原则 大型软件系统的架构过程与建筑物修建很类似,都是由一个个小组件组成的。所以,如果说SOLID原则是用于指导我们如何将砖块砌成墙与房间的,那么组件构建原则就是用来指导我们如何将这些房间组合成房子的。 5.1 组件 组件是软件的…

想好新年去哪了吗?合合信息扫描全能王用AI“留住”年味

还有不到十天,除夕就要到了。近几年春节假期中,有人第一次带着孩子直击海面冰风,坐船回老家;也有人选择“漫游”国内外,在旅行中迎接新春的朝气。合合信息旗下扫描全能王APP通过AI扫描技术,提供了一种全新的…

Acwing---798.差分矩阵

差分矩阵 1.题目2.基本思想3.代码实现 1.题目 输入一个 n n n 行 m m m列的整数矩阵,再输入 q q q 个操作,每个操作包含五个整数 x 1 , y 1 , x 2 , y 2 , c x1,y1,x2,y2,c x1,y1,x2,y2,c,其中 ( x 1 , y 1 ) (x1,y1) (x1,y1) 和 ( x …

创新大赛专访丨移步到岗荣膺2023年度人力资源服务质量卓越品牌:“人财税法”综合解决方案专家

日前,2023第三届全国人力资源创新大赛颁奖典礼暨成果展圆满举行。自2023年10月份启动以来,大赛共吸引了457个案例报名参赛,经组委会专家团队评审严格审核,企业赛道共有103个案例获奖、72家企业、13位个人、7个产业园斩获荣誉。 广…

RocketMQ消息队列(一)—— 基本概念和消息类型

RocketMQ是一个来自阿里巴巴的分布式消息中间件,于2012年开源,并在2017年正式成为Apache顶级项目。据了解,包括阿里云上的消息产品以及收购的子公司在内,阿里集团的消息产品全线都运行在RocketMQ上,并且最近几年的双十…

mybatis的一级缓存和二级缓存

一、介绍 1、mybatis缓存: mybatis包含一个非常强大的查询缓存特性,可以非常方便的定制和配置缓存,通过缓存减少Java Application与数据库的交互次数,从而提升程序的运行效率。 2、mybatis一二级缓存 mybatis的缓存分为一级缓存…

Docker中配置MySql环境

目录 一、简单安装 1. 首先从Docker Hub中拉取镜像 2. 启动尝试创建MySQL容器,并设置挂载卷。 3. 查看mysql8这个容器是否启动成功 4. 如果已经成功启动,进入容器中简单测试 4.1 进入容器 4.2 登录mysql中 4.3 进行简单添加查找测试 二、主从复…

MySQL-----初识

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language,是结构化查询语言,用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…