tcp窗口滑动以及拥塞控制

2023-05-16

转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html
     TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。
一、滑动窗口协议
     关于这部分自己不晓得怎么叙述才好,因为理解的部分更多,下面就用自己的理解来介绍下TCP的精髓:滑动窗口协议。
     所谓滑动窗口协议,自己理解有两点:1. “窗口”对应的是一段可以被发送者发送的字节序列,其连续的范围称之为“窗口”;2. “滑动”则是指这段“允许发送的范围”是可以随着发送的过程而变化的,方式就是按顺序“滑动”。在引入一个例子来说这个协议之前,我觉得很有必要先了解以下前提:
-1. TCP协议的两端分别为发送者A和接收者B,由于是全双工协议,因此A和B应该分别维护着一个独立的发送缓冲区和接收缓冲区,由于对等性(A发B收和B发A收),我们以A发送B接收的情况作为例子;
-2. 发送窗口是发送缓存中的一部分,是可以被TCP协议发送的那部分,其实应用层需要发送的所有数据都被放进了发送者的发送缓冲区;
-3. 发送窗口中相关的有四个概念:已发送并收到确认的数据(不再发送窗口和发送缓冲区之内)、已发送但未收到确认的数据(位于发送窗口之中)、允许发送但尚未发送的数据以及发送窗口外发送缓冲区内暂时不允许发送的数据;
-4. 每次成功发送数据之后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据包含到窗口中准备发送;
     TCP建立连接的初始,B会告诉A自己的接收窗口大小,比如为‘20’:
     字节31-50为发送窗口

     A发送11个字节后,发送窗口位置不变,B接收到了乱序的数据分组:

     只有当A成功发送了数据,即发送的数据得到了B的确认之后,才会移动滑动窗口离开已发送的数据;同时B则确认连续的数据分组,对于乱序的分组则先接收下来,避免网络重复传递:



二、流量控制
     流量控制方面主要有两个要点需要掌握。一是TCP利用滑动窗口实现流量控制的机制;二是如何考虑流量控制中的传输效率。
1. 流量控制
     所谓流量控制,主要是接收方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是返回的ACK中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送:

     这里面涉及到一种情况,如果B已经告诉A自己的缓冲区已满,于是A停止发送数据;等待一段时间后,B的缓冲区出现了富余,于是给A发送报文告诉A我的rwnd大小为400,但是这个报文不幸丢失了,于是就出现A等待B的通知||B等待A发送数据的死锁状态。为了处理这种问题,TCP引入了持续计时器(Persistence timer),当A收到对方的零窗口通知时,就启用该计时器,时间到则发送一个1字节的探测报文,对方会在此时回应自身的接收窗口大小,如果结果仍未0,则重设持续计时器,继续等待。
2. 传递效率
     一个显而易见的问题是:单个发送字节单个确认,和窗口有一个空余即通知发送方发送一个字节,无疑增加了网络中的许多不必要的报文(请想想为了一个字节数据而添加的40字节头部吧!),所以我们的原则是尽可能一次多发送几个字节,或者窗口空余较多的时候通知发送方一次发送多个字节。对于前者我们广泛使用Nagle算法,即:
*1. 若发送应用进程要把发送的数据逐个字节地送到TCP的发送缓存,则发送方就把第一个数据字节先发送出去,把后面的字节先缓存起来;
*2. 当发送方收到第一个字节的确认后(也得到了网络情况和对方的接收窗口大小),再把缓冲区的剩余字节组成合适大小的报文发送出去;
*3. 当到达的数据已达到发送窗口大小的一半或以达到报文段的最大长度时,就立即发送一个报文段;
     对于后者我们往往的做法是让接收方等待一段时间,或者接收方获得足够的空间容纳一个报文段或者等到接受缓存有一半空闲的时候,再通知发送方发送数据。


三、拥塞控制
     网络中的链路容量和交换结点中的缓存和处理机都有着工作的极限,当网络的需求超过它们的工作极限时,就出现了拥塞。拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。常用的方法就是:
1. 慢开始、拥塞控制
2. 快重传、快恢复
     一切的基础还是慢开始,这种方法的思路是这样的:
-1. 发送方维持一个叫做“拥塞窗口”的变量,该变量和接收端口共同决定了发送者的发送窗口;
-2. 当主机开始发送数据时,避免一下子将大量字节注入到网络,造成或者增加拥塞,选择发送一个1字节的试探报文;
-3. 当收到第一个字节的数据的确认后,就发送2个字节的报文;
-4. 若再次收到2个字节的确认,则发送4个字节,依次递增2的指数级;
-5. 最后会达到一个提前预设的“慢开始门限”,比如24,即一次发送了24个分组,此时遵循下面的条件判定:
*1. cwnd < ssthresh, 继续使用慢开始算法;
*2. cwnd > ssthresh,停止使用慢开始算法,改用拥塞避免算法;
*3. cwnd = ssthresh,既可以使用慢开始算法,也可以使用拥塞避免算法;
-6. 所谓拥塞避免算法就是:每经过一个往返时间RTT就把发送方的拥塞窗口+1,即让拥塞窗口缓慢地增大,按照线性规律增长;
-7. 当出现网络拥塞,比如丢包时,将慢开始门限设为原先的一半,然后将cwnd设为1,执行慢开始算法(较低的起点,指数级增长);

     上述方法的目的是在拥塞发生时循序减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。慢开始和拥塞控制算法常常作为一个整体使用,而快重传和快恢复则是为了减少因为拥塞导致的数据包丢失带来的重传时间,从而避免传递无用的数据到网络。快重传的机制是:
-1. 接收方建立这样的机制,如果一个包丢失,则对后续的包继续发送针对该包的重传请求;
-2. 一旦发送方接收到三个一样的确认,就知道该包之后出现了错误,立刻重传该包;
-3. 此时发送方开始执行“快恢复”算法:
*1. 慢开始门限减半;
*2. cwnd设为慢开始门限减半后的数值;
*3. 执行拥塞避免算法(高起点,线性增长);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tcp窗口滑动以及拥塞控制 的相关文章

  • 从尾到头打印链表(链表反转)

    时间限制 xff1a 1秒 空间限制 xff1a 32768K 热度指数 xff1a 265674 本题知识点 xff1a 链表 算法知识视频讲解 题目描述 输入一个链表 xff0c 从尾到头打印链表每个节点的值 笔记收藏纠错 span c
  • 重建二叉树

    时间限制 xff1a 1秒 空间限制 xff1a 32768K 热度指数 xff1a 177198 算法知识视频讲解 题目描述 输入某二叉树的前序遍历和中序遍历的结果 xff0c 请重建出该二叉树 假设输入的前序遍历和中序遍历的结果中都不含
  • 用两个栈实现队列

    时间限制 xff1a 1秒 空间限制 xff1a 32768K 热度指数 xff1a 118150 本题知识点 xff1a 队列 栈 算法知识视频讲解 题目描述 用两个栈来实现一个队列 xff0c 完成队列的Push和Pop操作 队列中的元
  • 旋转数组的最小数字

    时间限制 xff1a 3秒 空间限制 xff1a 32768K 热度指数 xff1a 162501 本题知识点 xff1a 查找 算法知识视频讲解 题目描述 把一个数组最开始的若干个元素搬到数组的末尾 xff0c 我们称之为数组的旋转 输入
  • 变态的台阶

    时间限制 xff1a 1秒 空间限制 xff1a 32768K 热度指数 xff1a 98625 算法知识视频讲解 题目描述 一只青蛙一次可以跳上1级台阶 xff0c 也可以跳上2级 它也可以跳上n级 求该青蛙跳上一个n级的台阶总共有多少种
  • 解决xterm显示远程窗口出现“Can't open display: localhost:11.0”的问题

    参考 xff1a http unix stackexchange com questions 117159 cannot start xterm over ssh after several successes 问题描述 xff1a 远程调
  • 数值的整数次方

    时间限制 xff1a 1秒 空间限制 xff1a 32768K 热度指数 xff1a 117073 算法知识视频讲解 题目描述 给定一个double类型的浮点数base和int类型的整数exponent 求base的exponent次方 笔
  • 机器人走方格I

    链接 xff1a https www nowcoder com questionTerminal e8bb8e68434e42acbcdff0341f2a32c5 orderByHotValue 61 1 amp mutiTagIds 61
  • 年终奖

    链接 xff1a https www nowcoder com questionTerminal 72a99e28381a407991f2c96d8cb238ab orderByHotValue 61 1 amp mutiTagIds 61
  • 最近公共祖先

    链接 xff1a https www nowcoder com questionTerminal 70e00e490b454006976c1fdf47f155d9 orderByHotValue 61 1 amp mutiTagIds 61
  • 直方图内最大矩形

    有一个直方图 xff0c 用一个整数数组表示 xff0c 其中每列的宽度为1 xff0c 求所给直方图包含的最大矩形面积 比如 xff0c 对于直方图 2 7 9 4 它所包含的最大矩形的面积为14 即 7 9 包涵的7x2的矩形 给定一个
  • 罪犯转移

    题目描述 C市现在要转移一批罪犯到D市 xff0c C市有n名罪犯 xff0c 按照入狱时间有顺序 xff0c 另外每个罪犯有一个罪行值 xff0c 值越大罪越重 现在为了方便管理 xff0c 市长决定转移入狱时间连续的c名犯人 xff0c
  • 路灯

    一条长l的笔直的街道上有n个路灯 xff0c 若这条街的起点为0 xff0c 终点为l xff0c 第i个路灯坐标为a i xff0c 每盏灯可以覆盖到的最远距离为d xff0c 为了照明需求 xff0c 所有灯的灯光必须覆盖整条街 xff
  • 哈希表

    哈希表 概念 哈希表 Hash Table 也叫散列表 xff0c 是根据关键码值 xff08 Key Value xff09 而直接进行访问的数据结构 它通过把关键码值映射到哈希表中的一个位置来访问记录 xff0c 以加快查找的速度 这个
  • 哈夫曼树

    概念 哈夫曼树是一种带权路径长度最短的二叉树 xff0c 也称为最优二叉树 下面用一幅图来说明 它们的带权路径长度分别为 xff1a 图a xff1a WPL 61 5 2 43 7 2 43 2 2 43 13 2 61 54 图b xf
  • tomcat配置问题导致IDEA报错

    总结一下遇到的问题 xff1a 1 tomcat的startup闪退 xff1a 解决办法 xff1a 1 环境变量配置不能错 2 端口错误这个是新手特别超级容易犯的错误 xff0c 在装tomcat的时候经常一顿next安装了 xff0c
  • 递归转动态规划套路总结

    来自左神的教导总结 1 确定递归函数意义 2 确定大小范围 xff0c 设计表 3 确定递归终止状态 xff0c 填表边界 xff08 自底向上时 xff1a 从结尾填表 xff1b 自顶向下时 xff0c 跟踪递归流程填表 xff09 例
  • 最长公共子串

    对于两个字符串 xff0c 请设计一个时间复杂度为O m n 的算法 这里的m和n为两串的长度 xff0c 求出两串的最长公共子串的长度 这里的最长公共子串的定义为两个序列U1 U2 Un和V1 V2 Vn xff0c 其中Ui 43 1
  • JAVA虚拟机加载类到运行过程总结

    理解Java跨平台运行原理 java之所以可以跨平台是因为编译器并没有把源码文件直接编译成机器指令 xff0c 而是编译成java虚拟机可以识别和运行的字节码文件 java gt class 而字节码文件是一种无关平台的中间编译结果 xff
  • 硬币表示

    有数量不限的硬币 xff0c 币值为25分 10分 5分和1分 xff0c 请编写代码计算n分有几种表示法 给定一个int n xff0c 请返回n分有几种表示法 保证n小于等于100000 xff0c 为了防止溢出 xff0c 请将答案M

随机推荐

  • 最长公共子序列

    我们有两个字符串m和n xff0c 如果它们的子串a和b内容相同 xff0c 则称a和b是m和n的公共子序列 子串中的字符不一定在原字符串中连续 例如字符串 abcfbc 和 abfcab xff0c 其中 abc 同时出现在两个字符串中
  • 完全二叉树的特点

    定义 完全二叉树是由满二叉树而引出来的 对于深度为K的 xff0c 有n个结点的二叉树 xff0c 当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树 一棵二叉树至多只有最下面的一层上的结点的度数可以小
  • 数据库事务的四大特性与隔离级别及测试

    四大特性 原子性 xff08 Atomicity xff09 原子性是指事务包含的所有操作要么全部成功 xff0c 要么全部失败回滚 xff0c 这和前面两篇博客介绍事务的功能是一样的概念 xff0c 因此事务的操作如果成功就必须要完全应用
  • Integer与int的比较

    原文 xff1a http blog csdn net yang5726685 article details 54572938 locationNum 61 2 amp fps 61 1 Integer与int的比较 Java是一个近乎纯
  • 装箱问题

    01背包 span class hljs keyword for span int span class hljs built in i span 61 span class hljs number 0 span span class hl
  • 采药

    01背包 Problem Description 辰辰是个天资聪颖的孩子 xff0c 他的梦想是成为世界上最伟大的医师 为此 xff0c 他想拜附近最有威望的医师为师 医师为了判断他的资质 xff0c 给他出了一个难题 医师把他带到一个到处
  • 解决OpenCV在Python中无法使用cv2.face的问题

    1 包不完整 只用pip install opencv python 装的依赖之后第二个 xff0c 这样里边没有face模块 xff0c 需要装第一个依赖才行 pip install opencv contrib python 2 包完整
  • 生日礼物

    01背包 Problem Description 一对双胞胎兄妹同一天过生日 xff0c 这一天 xff0c 他们的朋友给他俩送来了礼物 xff0c 每个人送的礼物都是2本书 xff0c 一本给哥哥 xff0c 一本给妹妹 xff0c 但没
  • 砝码称重

    多重背包 Problem Description 设有1g 2g 3g 5g 10g 20g的砝码各若干枚 xff08 其总重 lt 61 1000 xff09 xff0c 要求 xff1a 输入方式 xff1a a1 a2 a3 a4 a
  • Piggy-Bank

    完全背包 Problem Description Before ACM can do anything a budget must be prepared and the necessary financial support obtain
  • Edit Distance(LeetCode)

    Given two words word1 and word2 find the minimum number of steps required to convert word1 to word2 each operation is co
  • OSI,TCP/IP,五层协议的体系结构,以及各层协议简介

    OSI分层 xff08 7层 xff09 xff1a 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 TCP IP分层 xff08 4层 xff09 xff1a 网络接口层 网际层 运输层 应用层 五层协议 xff08 5层 x
  • IP地址的分类,及子网掩码,网络号,主机号

    A类地址 xff1a 以0开头 xff0c 第一个字节范围 xff1a 1 127 xff08 1 0 0 0 127 255 255 255 xff09 xff1b B类地址 xff1a 以10开头 xff0c 第一个字节范围 xff1a
  • 了解集线器,调制解调器,交换机、路由器、网关的概念,并知道各自的用途

    集线器 集线器是对网络进行集中管理的重要工具 xff0c 像树的主干一样 xff0c 它是各分支的汇集点 xff0c 它的实质是一个中继器 xff0c 而中继器的主要功能是对接收到的信息进行再生放大 xff0c 以扩大网络的传输距离 简单点
  • 并查集

    并查集作用 xff1a 1 判断两节点是否联通 2 连接两个节点 xff0c 使之联通 并查集数据结构 xff1a 多路树结构 例 xff1a 存储结构 xff1a 数组模拟 xff1a 设数组为pre i i为当前节点 xff0c pre
  • 袋鼠过河

    一只袋鼠要从河这边跳到河对岸 xff0c 河很宽 xff0c 但是河中间打了很多桩子 xff0c 每隔一米就有一个 xff0c 每个桩子上都有一个弹簧 xff0c 袋鼠跳到弹簧上就可以跳的更远 每个弹簧力量不同 xff0c 用一个数字代表它
  • 最短路径算法(Dijkstra)

    一 前言 最短路径算法 xff0c 顾名思义就是求解某点到某点的最短的距离 消耗 费用等等 xff0c 有各种各样的描述 xff0c 在地图上看 xff0c 可以说是图上一个地点到达另外一个地点的最短的距离 比方说 xff0c 我们把地图上
  • linux安装nodejs【详细教程】

    一 下载node包 先看一下官网 https nodejs org en download 下载 Node js 中文网 nodejs cn 二 将node包放到linux上 1 解压 xff1a tar xvf node v14 15 1
  • 红明谷杯-SMU

    2021红明谷杯安全意识赛 一 单项选择题 1 以下不属于采用密码技术对数据本身进行保护的是 xff08 xff09 A 防火墙技术 B 使用现代加密算法对数据进行加密以获得机密性 C 采用数字签名算法确保数据源的可靠性 D 采用杂凑算法和
  • tcp窗口滑动以及拥塞控制

    转自 xff1a http blog chinaunix net uid 26275986 id 4109679 html TCP协议作为一个可靠的面向流的传输协议 xff0c 其可靠性和流量控制由滑动窗口协议保证 xff0c 而拥塞控制则