[计算机网络]:流量控制

一、流量控制简介

一条TCP连接的每一侧主机都为其设置了接收缓存,当TCP成功连接后,它发送的数据会放入接受缓存中。相关联的进程会从缓存中读取数据。但是存在一个问题,当某应用程序读取数据速率太慢,而发送数据一方不停的发送数据,会导致缓存区溢出,为了解决这类情况出现了流浪控制。

注意:UDP并不提供流量控制,报文段由于缓存溢出后可能会在接收方丢失掉。

二、流量控制具体过程

TCP为它的应用程序提供了流量控制服务(flow - control service )以消除发送方使接收方缓存溢出的可能性。
TCP通过让发送方维护一个称为
接收窗口
的变量来提供流量控制。
在这里插入图片描述
TCP连接的双方都有一个接收窗口,并用RcvBuffer表示缓存接收大小。rwnd表示缓存区中剩余大小(rwnd是动态变化的)。
我们定义两个变量:

  • LastByteRead:主机上的应用进程从缓存区读出的数据流最后一个字节的编号。
  • LastByteRcvd:从网络中到达并且已放入主机进程缓存区中的数据流的最后一个字节的编号。

两个必须成立的公式:
LastByteRead — LastByteRcvd <= RcvBuffer
rwnd = RcvBuffer — [ LastByteRcvd — LastByteRead ]

当有一个A主机向B主机发送数据时
主机B把rwnd值放入发送给主机A的报文段中,告诉主机A还有多少缓存大小。为了实现这一点,主机B必须跟踪几个与连接有关的变量。
主机A轮流跟踪两个变量,LastByteSent 和 LastByteAcked ,LastByteSent — LastByteAcked = 主机A发送到连接中但未被确认的数据量,通过将其控制在rwnd值以内,就可以保证主机A发送的数据到达主机B后不会溢出。

LastByteSent — LastByteAcked <= rwnd

三、存在的一个小问题

主机A向主机B发送数据
假设主机B中rwnd=0,即缓存区已经满了,并且主机B没有任何数据要发送给主机A ,当主机B缓存区读取完后,TCP并不会向主机A发送带有rwnd新值的新报文段。这样主机A会一直阻塞而不会发送新数据。为了解决这个问题,TCP中要求:当主机B的接收窗口为0时,主机A继续发送只有一个字节数据的报文段。这些报文段会被接收方接收,最终缓存区开始情况,并且确定报文里包含一个非0的rwnd值。

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

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

相关文章

5. 【Codeforces Round 927 (Div. 3)】B.查亚日历

B . 查亚日历 B.查亚日历 B.查亚日历 每次测试时限&#xff1a; 2 秒 每次测试时限&#xff1a;2 秒 每次测试时限&#xff1a;2秒 每次测试的内存限制&#xff1a; 256 兆字节 每次测试的内存限制&#xff1a;256 兆字节 每次测试的内存限制&#xff1a;256兆字节 题目描述 查…

【数据结构】复杂度详解

目录 &#xff08;一&#xff09;算法的复杂度 &#xff08;二&#xff09;时间复杂度 &#xff08;1&#xff09;练笔解释&#xff1a; i&#xff0c;示例1 ii&#xff0c;示例2 iii&#xff0c;二分查找 iv&#xff0c;斐波那契 &#xff08;三&#xff09;空间复杂度…

英福康INFICON真空计MPG400MPG401使用说明PPT讲解课件

英福康INFICON真空计MPG400MPG401使用说明PPT讲解课件

Java解决杨辉三角

Java解决杨辉三角 01 题目 给定一个非负整数 *numRows&#xff0c;*生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRo…

浏览器常见进程和线程

文章目录 进程和线程的联系和区别早期浏览器Chrome 打开一个页面有多少进程&#xff1f;分别是哪些渲染进程中的线程说下浏览器的进程、线程模型&#xff0c;线程模型中的每个线程都是干嘛用的&#xff1f;你知道哪些进程间通信的方式&#xff1f;多标签之间怎么通信&#xff1…

LeetCode 3069.将元素分配到两个数组中 I

给你一个下标从 1 开始、包含 不同 整数的数组 nums &#xff0c;数组长度为 n 。 你需要通过 n 次操作&#xff0c;将 nums 中的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操作中&#xff0c;将 nums[1] 追加到 arr1 。在第二次操作中&#xff0c;将 nums[2] 追加到 …

计网面试题整理下

1. HTTP常见的状态码有哪些&#xff1f; 常见状态码&#xff1a; 200&#xff1a;服务器已成功处理了请求。 通常&#xff0c;这表示服务器提供了请求的网页。301 &#xff1a; (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时&am…

python c++混合编程-cmake

利用cmake将c文件编译成.so库文件&#xff0c;通过import调用 简单调用高级用法-调用c项目 简单调用 创建trypybind.cpp文件 #include <pybind11/pybind11.h> #include <iostream> namespace py pybind11; using namespace std; //绑定一个函数 int main() { co…

前端面试 跨域理解

2 实现 2-1 JSONP 实现 2-2 nginx 配置 2-2 vue 开发中 webpack自带跨域 2 -3 下载CORS 插件 或 chrome浏览器配置跨域 2-4 通过iframe 如&#xff1a;aaa.com 中读取bbb.com的localStorage 1)在aaa.com的页面中&#xff0c;在页面中嵌入一个src为bbb.com的iframe&#x…

vscode ctrl+左键不能转到定义修理

找到C_Cpp: Intelli Sense Engine&#xff0c;改成disable&#xff0c;再改成默认就可以了原来是当前的工作目录不包括函数定义的文件&#xff0c;调整一下工作目录即可。或者&#xff0c; "includePath": [ "${workspaceFolder}/**", …

云原生环境中的自动化测试成功案例分析

在云原生环境中,DevOps通过结合云原生技术和持续集成/持续部署(CI/CD)流程,实现了软件的快速交付和质量保证。自动化测试是DevOps实践中的重要组成部分,它能够提高测试的效率和覆盖率,从而加速软件的交付周期并确保软件质量[3][5][13]。 成功案例之一是视野数科利用SAE和…

在全志V853平台上成功部署深度学习步态识别算法

北理工通信课题组辛喆同学在本科毕业设计《基于嵌入式系统的步态识别的研究》中&#xff0c;成功将深度步态识别算法GaitSet移植到全志V853开发板上。本研究在CASIA-B数据集上进行测试&#xff0c;正常行走状态下该系统的步态识别准确率达到了94.9%&#xff0c;背包行走和穿外套…

C++基于多设计模式下的同步异步日志系统day5

C基于多设计模式下的同步&异步日志系统day5 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&am…

scau:程序设计与算法基础 18104 练习使用多case解题

18104 练习使用多case解题 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC Description 多CASE的问题在般有3种情形&#xff1a;&#xff08;1&#xff09;有一个数字开始表明CASE数目&#xff1b;&#xff08;2&#xff09;以特殊标…

linux文件结构总结

/&#xff1a;根目录&#xff0c;所有的目录、文件、设备都在/之下&#xff0c;/就是Linux文件系统的组织者&#xff0c;也是最上级的领导者。 /bin&#xff1a;bin 就是二进制&#xff08;binary&#xff09;英文缩写。在一般的系统当中&#xff0c;都可以在这个目录下找到li…

C++:Vector的模拟实现

创作不易&#xff0c;感谢三连 &#xff01;&#xff01; 一&#xff0c;前言 在学习string类的时候&#xff0c;我们可能会发现遍历的话下标访问特别香&#xff0c;比迭代器用的舒服&#xff0c;但是下标其实只能是支持连续的空间&#xff0c;他的使用是非常具有局限性的&am…

第 125 场 LeetCode 双周赛题解

A 超过阈值的最少操作数 I 排序然后查找第一个大于等于 k 的元素所在的位置 class Solution { public:int minOperations(vector<int> &nums, int k) {sort(nums.begin(), nums.end());return lower_bound(nums.begin(), nums.end(), k) - nums.begin();} };B 超过阈…

C++ 位运算OJ

目录 1、 191. 位1的个数 2、 338. 比特位计数 3、 461. 汉明距离 4、136. 只出现一次的数字 5、 260. 只出现一次的数字 III 6、面试题 01.01. 判定字符是否唯一 7、 268. 丢失的数字 8、 371. 两整数之和 9、 137. 只出现一次的数字 II 10、面试题 17.19. 消失的两个…

【C++】二叉树进阶面试题(上)

目录 1. 二叉树创建字符串 题目 分析 代码 2. 二叉树的分层遍历1 题目 分析 代码 3. 二叉树的分层遍历2 题目 分析 代码 4. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 题目 分析 代码 5. 二叉树搜索树转换成排序双向链表 题目 分析 代码 1. …

使用GitHub API 查询开源项目信息

一、GitHub API介绍 GitHub API 是一组 RESTful API 接口&#xff0c;用于与 GitHub 平台进行交互。通过使用 GitHub API&#xff0c;开发人员可以访问和操作 GitHub 平台上的各种资源&#xff0c;如仓库、提交记录、问题等。 GitHub API 提供了多种功能和端点&#xff0c;以…