音视频学习笔记——TCP网络原理

news2024/10/25 16:22:11

✊✊✊🌈大家好!本篇文章主要记录自己在进行音视频学习中,整理的包括可靠传输、流量控制、拥塞控制等部分TCP网络原理相关的内容重点😇。


本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统学习,按照学习重点梳理总结后写下文章,对音视频相关内容感兴趣的读者,可以点击观看课程网址:零声教育


🎡导航小助手🎡

    • 1. TCP的可靠传输
    • 2. TCP的流量控制
      • 2.1 流量控制(滑动窗口)
      • 2.2 死锁问题
    • 3. 拥塞控制
      • 3.1 拥塞控制介绍
      • 3.2 TCP的拥塞控制方法
    • 4.小结

1. TCP的可靠传输

TCP连接的两个端口都有两个窗口

  • 发送窗口:准备发送的数据和已发送但未接收的数据

  • 接收窗口:按序接收但没有上交的数据,不按序接收的数据。
    在这里插入图片描述

  • P3 - P1 = A的发送窗口(又称为通知窗口)

  • P2 - P1 = 已发送但尚未收到确认的字节数

  • P3 - P2 = 允许发送但尚未发送的字节数(又称为可用窗口)

  1. 发送窗口按序发送窗口中的字节流,如果发送且收到确认则滑出窗口。如果已发送但未收到确 认则留在发送窗口中用来准备重传。
  2. 接收窗口将按序接收字节流如果收到的字节流无序则仍然会留在接收窗口中。

2. TCP的流量控制

2.1 流量控制(滑动窗口)

在网络通信中,我们都会希望数据的传输效率更高一些,让通信更加流畅。但是,如果发送方的发送速率太快,可能会导致接收方来不及接收和处理数据。所以需要一种机制控制发送方的传输速率——滑动窗口

注意,流量控制是一种接收方针对发送方来讲的机制。

流量控制过程中:

  • 发送方:一次发送的字节数量不要太多,要让对方来的及接收。
  • 接收方:通过调整滑动窗口来进行流量控制的。
    在这里插入图片描述

现在我们假定数据流向是单向的,也就是说实例A只负责发送数据,不负责处理和接受数据,实例B只负责处理和接收数据,并且对接收到的数据进行应答(ACK)。B的接收窗口大小(Rwnd设置为400)。

假定A每次会发送TCP报文段包含数据100字节,并且A将自己发送窗口大小设置为400字节

  1. A向B连续发送3个TCP报文段,每一个报文段都包含了100字节的数据,其中第3个TCP报文段因某种网络原因丢失
  2. B向A发送回复报文ACK=201,Rwnd=300。表示已经接收到1~200字节的数据,下一次从201字节开始发送就行,并表示自己现在能接受300字节
  3. A收到了来自B的回复报文,了解到B的接收窗口大小(Rwnd)为300,因为没有收到201-300的确认报文,因此此时滑动窗口的位置是201-500,并且发送301-400和401-500的TCP报文段给B。
  4. 当201-300的报文段的超时重传计时器到达时,A重新发送201-300的TCP报文段给B。
  5. A收到了B成功收到401的报文,下一次要从501开始发,而且又进行了一次流量控制rwnd = 100(还能接收100字节的数据)。
  6. 然后A又继续发送了一个序号为501的报文,然后A停止发送。然后收到了B返回的回复序号为601滑动窗口置为0的报文。

2.2 死锁问题

接上一小节,A需一直等待,直到B新发送的接收窗口大小更新的数据(rwnd > 0)才能继续发送数据。
终于,B意图向A更新自己的rwnd,但是因为网络原因,更新报文段丢失了。此时会出现死锁局面,即A在等待B的rwnd,B在等待A的新数据

解决方案:
设置A在收到B的0接收窗口大小(rwnd=0)时会自动启动一个“持续计时器”,当持续计时器timeout时,如果还没有收到来自B的rwnd更新报文段,则会发送一个零窗口探测报文段(携带1字节数据),当B接收到这个TCP报文段后,会给A回复一个rwnd的更新,如果此时rwnd > 0,那么A就可以继续发送数据,如果rwnd=0,则重新启动一个持续计时器,重复上述步骤。

3. 拥塞控制

3.1 拥塞控制介绍

在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大。

拥塞:当对网络资源的需求超过了现有的资源你的可用部分。
拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的

拥塞控制与流量控制对比:

拥塞控制流量控制
全局性网络点对点
防止过多数据注入到网络控制发送方的速率
针对网络问题发送缓存与接收缓存的问题

3.2 TCP的拥塞控制方法

TCP采用基于窗口的方法进行拥塞控制,该方法属于闭环控制方法。
发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么加入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),即拥塞窗口和接收窗口中的最小值。

拥塞控制主要是四个算法:

  1. 慢启动
  2. 拥塞避免
  3. 拥塞发生
  4. 快速恢复

3.2.1 慢启动算法

TCP 在刚建立连接完成后,首先是有个慢启动的过程,在这过程中,一点一点的提高发送数据包的数量
规则:当发送方每收到一个 ACK,就拥塞窗口 cwnd 的大小就会加 1。
在这里插入图片描述
慢启动算法,发包个数按照指数型增长(1->2->4->8>…)
慢开始门限ssthresh(状态变量)防止拥塞窗口cwnd增长过大引起网络拥塞。

  • 当cwnd < ssthresh,使用慢开始算法。
  • 当cwnd > sshresh,停止使用慢开始算法而使用拥塞避免方法。
  • 当cwnd = sshresh时既可以使用慢开始算法也可以使用拥塞避免算法。

3.2.2 拥塞避免算法
规则:每当收到一个 ACK 时,cwnd 增加 1(线性增长)。
接上前面的慢启动的例子,现假定 ssthresh 为 8:
当cwnd > 8后,使用拥塞避免方法,每收到一个ACK确认,cwnd增加1。
3.2.3 拥塞发生算法
当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:

1.超时重传
当发生了「超时重传」,则就会使用拥塞发生算法。
这个时候,sshresh 和 cwnd 的值会发生变化:

ssthresh 设为 cwnd/2,cwnd 重置为 1,执行慢开始算法。

2.快速重传
当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。
TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和cwnd 变化如下:

cwnd = cwnd/2 ,也就是设置为原来的一半; ssthresh = cwnd; 进入快速恢复算法

3.2.4 快速恢复算法
快速恢复算法如下:

  • 拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了)
  • 如果再收到重复的 ACK,那么 cwnd 增加 1, 并且在允许的条件下发送一个报文段
  • 如果收到新数据的 ACK 后,设置 cwnd = ssthresh,接着就进入了拥塞避免算法

4.小结

本文首先整理了可靠传输、流量控制以及遇到死锁问题后应该如何解决,简单介绍了拥塞控制中包括慢启动、拥塞、拥塞发生、快速恢复等的相关算法,对TCP网络原理有了较深的理解。

文章均参考网上资源,进行学习梳理,用于个人学习

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

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

相关文章

一个平台满足你对测试工具的所有需求

背景 目前&#xff0c;测试人员普遍使用的测试工具有Postman、JMeter等&#xff0c;但这些工具都存在一定的局限性。例如&#xff0c;Postman缺少对API性能测试方面的支持&#xff0c;而JMeter则缺乏一个整合测试报告、测试脚本的统一管理系统以及UI测试功能。 RunnerGo是什么…

常用的几种concrt140.dll丢失的解决方法,关于concrt140.dll修复教程

concrt140.dll是Microsoft Visual Studio 2015&#xff08;或更高版本&#xff09;中包含的一个动态链接库文件&#xff0c;它是C运行时库的一部分&#xff0c;主要用于支持并行计算、并发处理等功能。当你的应用程序需要执行多线程操作或者使用了C的并发库时&#xff0c;就会依…

windows下编译boost1.84.0库

boost系列文章目录 文章目录 boost系列文章目录前言一、boost编译二、boost使用三 、参考 前言 Boost简介 官方网址 Boost提供免费的同行评审的可移植C源代码库。 我们强调与C标准库配合良好的库。Boost库旨在广泛使用&#xff0c;并可在广泛的应用程序中使用。Boost许可证鼓…

AI预测福彩3D第4弹【2024年3月7日预测】

经过前面几次的预测&#xff0c;7码命中率已经有了明显提高&#xff0c;今天&#xff0c;继续咱们的预测。 老规矩&#xff0c;先给各位展示下百十个的神经网络蒙特卡洛统计频次图及部分号码的冷温热走势图。 最终&#xff0c;经过研判分析&#xff0c;2024年3月7日福彩3D的七…

TikTok矩阵获客软件的核心源代码是什么?

随着互联网的不断发展&#xff0c;社交媒体已成为企业获客的重要渠道之一&#xff0c;在众多的社交媒体平台中&#xff0c;TikTok凭借其庞大的用户群体和活跃的社交氛围&#xff0c;成为了众多企业竞相争夺的营销高地。 在这样的背景下&#xff0c;TikTok矩阵获客软件应运而生…

tiktok矩阵引流系统开发常用源代码!

在数字营销领域&#xff0c;TikTok已成为一个不可忽视的平台&#xff0c;随着其用户基数的不断增长&#xff0c;如何利用TikTok进行有效的引流成为了许多企业和营销人员关注的焦点。 为了实现这一目标&#xff0c;许多开发者开始构建TikTok矩阵引流系统&#xff0c;这些系统通…

AI论文速读 | 【综述】城市计算中跨域数据融合的深度学习:分类、进展和展望

题目&#xff1a;Deep Learning for Cross-Domain Data Fusion in Urban Computing: Taxonomy, Advances, and Outlook 作者&#xff1a;Xingchen Zou, Yibo Yan, Xixuan Hao, Yuehong Hu, Haomin Wen&#xff08;温皓珉&#xff09;, Erdong Liu, Junbo Zhang&#xff08;张钧…

一文读懂HDMI的演变-从HDMI1.0到HDMI2.1(建议收藏)

HDMI&#xff0c;全称为&#xff08;High Definition Multimedia Interface&#xff09;高清多媒体接口&#xff0c;主要用于传输高清音视频信号。 HDMI System HDMI系统包括HDMI的source和HDMI的sink, 其中source 是源端&#xff0c;即信号的来源&#xff1b;Sink的接收端&a…

2024最新GPT4.0使用教程,AI绘画,一站式解决

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

Unity类银河恶魔城学习记录8-4 P80 Blackhole ability state源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic…

13年测试老鸟,接口性能测试-压测总结汇总,一文概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、概述 性能测试…

Unity性能优化篇(四) GPU Instancing

使用GPU Instancing可以在一个Draw Call中同时渲染多个相同或类似的物体&#xff0c;从而减少CPU和GPU的开销。 官方文档&#xff1a;https://docs.unity3d.com/Manual/GPUInstancing.html 启用GPU Instancing&#xff0c;我们可以选中一个材质&#xff0c;然后在Inspector窗口…

1.3 数据库系统的结构

目录 1.3.1 数据库系统模式的概念 1.3.2 数据库系统的三级模式结构 1. 模式 2. 外模式 3.内模式&#xff08;也称存储模式&#xff09; 1.3.3 数据库的二级映像功能与数据独立性 1.外模式&#xff0f;模式映像 2.模式&#xff0f;内模式映像 1.3.4 总结 模式 内模式…

Vue+OpenLayers7入门到实战:OpenLayers7如何使用gifler库来实现gif动态图图片叠加到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 OpenLayers7本身不支持gif图片作为图标要素显示到地图上,所以需要通过其他办法来实现支持gif图片。 本章介绍如何使用OpenLayers7在地图上使用gifler库先生成canvas画板,然后通过canvas画板的重绘事件来重新渲染地图…

通过Dockerfile创建镜像

通过Dockerfile创建镜像 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 1. 常用选项说明--build-arg&#xff0c;设置…

【剑指offer--C/C++】JZ6 从尾到头打印链表

一、题目 二、本人思路及代码 直接在链表里进行翻转不太方便操作&#xff0c;但是数组就可以通过下标进行操作&#xff0c;于是&#xff0c; 思路1、 先遍历链表&#xff0c;以此存到vector中&#xff0c;然后再从后往前遍历这vector,存入到一个新的vector&#xff0c;就完成…

2024年最佳WordPress奖励插件

谁不想获得奖励呢&#xff1f;当激励客户返回您的网站时&#xff0c;它的价值就会增加。为了让您更轻松地完成此任务&#xff0c;在本文中&#xff0c;我编译了16个最佳WordPress奖励插件&#xff0c;这些插件为您的客户提供了坚持使用您的网站的充分理由。此外&#xff0c;您无…

Android视角看鸿蒙第一课(工程目录)

Android视角看鸿蒙第一课&#xff08;工程目录&#xff09; 导读 鸿蒙马上就来了&#xff0c;这个工作很有可能落到Android开发的头上&#xff0c;既是机遇也是挑战&#xff0c;希望能跟上时代的浪潮&#xff0c;迫不得已开始学习鸿蒙开发&#xff0c;顺带分享记录下 我的学…

快速排序hoare优化

目录 三数取中法选key 优化点 基本思想 代码实现 小区间优化 优化点 基本思想 代码实现 由于hoare版快排在一些特殊情况下性能并不优&#xff0c;这里我们进行一些优化。 三数取中法选key 优化点 当数据有序时&#xff0c;快排就会很吃力&#xff0c;这是为什么呢…

电脑工作电压是多少你要看看光驱电源上面标的输入电压范围

要确定电脑的工作电压&#xff0c;必须查看电源上标注的输入电压范围。 国内法规规定民用220V电压范围为10%-15%&#xff0c;也就是说通信220V电压正常范围为187--242V&#xff0c;供电设备一般为180V。 --250V电压范围&#xff0c;即正常情况下电脑电源电压不低于187V即可工作…