网络原理-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拥塞控制的这种过程,就像是热恋的感觉. 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 SpringBoot+Vue 的大学生租房系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Linux 路由配置与使用

概念 路由信息用于指导数据包从源地址查找到目的地址传输路径的信息; 路由分类 根据路由信息的来源分为静态路由和动态路由 静态路由 由管理员手动配置的路由表项信息,根据路由形式的不同,静态路由又可细分为: 直连路由&#xf…

二叉树(1)

1 树概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&a…

AI数字人训练数据集汇总

唇读(Lip Reading),也称视觉语音识别(Visual Speech Recognition),通过说话者口 型变化信息推断其所说的内容,旨在利用视觉信道信息补充听觉信道信息,在现实生活中有重要应用。例如&…

【文件上传WAF绕过】<?绕过、.htaccess木马、.php绕过

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

【MATLAB源码-第128期】基于matlab的雷达系统回波信号仿真,输出脉压,MTI,MTD等图像。

操作环境: MATLAB 2022a 1、算法描述 ​雷达(Radio Detection and Ranging)是一种使用无线电波来探测和定位物体的系统。它的基本原理是发射无线电波,然后接收这些波从目标物体上反射回来的信号。通过分析这些反射波&#xff0…

Day 17------C语言收尾之链表的删除、位运算、预处理、宏定义

链表 空链表: 注意:函数不能返回局部变量的地址 操作: 1.创建空链表 2.头插 3.尾插 4.链表遍历 5.链表的长度 free:释放 删除: 头删 void popFront(struct Node *head) { //1.p指针变量指向首节点 //2.断…

人工智能深度学习发展历程-纪年录

前言 为了理解模型之间的改进关系、明确深度学习的发展目标、提高自身对模型的深度理解、贯彻爱与和平的理念。总之,我做了如下表格。 时间 重大突破 模型改进 详细信息 1847 SGD 随机梯度下降 1995 SVM 支持向量机 1982 RNN 循环神经网络,…

Kimera2: 面对真实路况中强大且具有准确尺度的语义SLAM

文章:Kimera2: Robust and Accurate Metric-Semantic SLAM in the Real World 作者:Marcus Abate , Yun Chang , Nathan Hughes , and Luca Carlone 编辑:点云PCL 欢迎各位加入知识星球,获取PDF论文,欢迎转发朋友圈。文章仅做学术分享,如有侵权联系删文。 公众号致力于…

基于STM32的DMA在外设数据交换中的应用案例

如何使用STM32的DMA在外设数据交换中实现高效的数据传输呢?下面,我将提供一个应用案例,涉及使用STM32的DMA在UART外设和内存之间进行数据传输的示例。 ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进 ❤欢迎关…

Qt/C++音视频开发65-切换声卡/选择音频输出设备/播放到不同的声音设备/声卡下拉框

一、前言 近期收到一个用户需求,要求音视频组件能够切换声卡,首先要在vlc上实现,于是马不停蹄的研究起来,马上查阅对应vlc有没有自带的api接口,查看接口前,先打开vlc播放器,看下能不能切换&…

undo log 和 redo log的区别

undo log 和 redo log的区别 缓冲池(Buffer Pool)是MySQL用于存储数据页的内存区域,它用于减少对磁盘的读写操作,提高数据库的访问速度。在MySQL中,数据被分为多个固定大小的数据页(通常为16KB&#xff09…

【Golang入门教程】如何使用Goland创建并运行项目

自然语言处理的发展 文章目录 自然语言处理的发展**前言**创建新项目编辑运行/调试配置编写并运行代码总结强烈推荐专栏集锦写在最后 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站: 人工…

算法篇之二分

二分算法简介 特点 最简单的一种算法,也是最恶心,细节最多,最容易写出死循环的算法时间复杂度O(logN) 如何学习 明白其中的算法原理,二分并不是只有数组有序的的时候使用,而是看是否具有二段性。模板 朴素的二分模…

JDK版本如何在IDEA中切换

JDK版本在IDEA中切换 一、项目结构设置 1.Platform——Settings 项目结构---SDKS 2.Project——SDK 3.Modules——SDK——Sources 4.Modules——SDK——Dependencies 二、设置--编译--字节码版本 Settings——Build,——Java Compiler

【linux】校招中的“熟悉linux操作系统”一般是指达到什么程度?

这样,你先在网上找一套完整openssh升级方案(不是yum或apt的,要源码安装的),然后在虚拟机上反复安装测试,直到把他理解了、背下来。 面试的时候让你简单说说linux命令什么的,你就直接把这个方案…

Linux 网络配置及基础服务

目录 一. 查看网络配置信息的相关命令 1.1 ifconfig 命令 作用 1: 作用 2: 拓展: 1.2 ip/ethtool命令 1.3 hostname命令 1.4 route 命令 1.5 netstat 命令 1.6 ss(socket statistics)命令 1.7 ping 命令 …

接口自动化处理动态参数

接口自动化处理动态参数 1、流程说明 某些接口的请求入参数据不能写死,需要动态传参。如用户注册接口,用户名需要动态生成。使用yaml编写测试数据时,在需要动态参数的数据后面添加上特殊字符${生成动态数据的方法名(参数&#x…

网工内推 | 港企、合资公司,厂商认证优先,五险一金

01 九龙仓(长沙)置业有限公司 招聘岗位:IT网络工程师 职责描述: 1.负责公司网络架构规划设计、设备选型、远程组网方案的规划和设计; 2.负责公司网络IP地址规划管理,根据业务需求和公司状况,对…

推荐收藏!算法工程师面试常考的手撕面试题!

今天给大家分享一些算法工程师技术面试中常手撕的代码。 不管是秋招还是社招,互联网大厂的技术面试中的手撕代码这一部分总是绕不过去的一关。 如果你对这些感兴趣,可以文末找我们交流 手撕 numpy写线性回归的随机梯度下降(stochastic gra…