计算机网络(9) TCP超时重传以及滑动窗口流量控制

news2024/11/27 11:46:36

一.确认机制与流量控制

引用:滑动窗口,TCP的流量控制机制 | 小菜学网络

确认机制

        由于 IP 协议缺乏反馈机制,为保证可靠性,TCP 协议规定:当接收方收到一个数据后,必须回复 ACK 给发送方。这样发送方就能得到反馈,如果数据发出去后很长时间都没有收到 ACK 确认,说明数据很有可能已经丢失了。

一旦数据在传输过程中丢失,发送方必须重传。因此,TCP 每次发送数据后,都会启动一个定时器。如果定时器超时还没收到对方确认,TCP 就会重新发送数据。我们来看一个例子:

图中左边是发送方待发送字节流状态,字节流中每个字节都有一个序号,假设从零开始。数据颜色代表发送状态:

  • 灰色,表示已经发出去而且收到对方确认的数据;
  • 蓝色,表示已经发出去但还未收到确认的数据;
  • 绿色,表示还未发送的数据(包括未来要发但此刻还不存在的数据);

刚开始时,发送方已经成功发送了前 5 个字节,如灰色部分所示。随后它开始发送数据①,其实序号为 5 ,总共 5 个字节。再啰嗦一句,起始序号 5 保存在 TCP 报文段中的序号字段;而数据长度 5 无须保存,TCP 可以根据 IP 包数据长度和 TCP 头部长度来计算。

发送方在发送数据的同时,启动了一个计时器。这些数据虽然已经发送出去了,但还没收到对方确认,因而处于蓝色状态。随后它收到接收方发来的确认,状态转为灰色,万事大吉!注意到,确认号是最后一个字节加一,也就是下一个数据的起始序号。

紧接着,发送方又发出了数据②,首字节序号为 10 ,总共 4 个字节。这次比较背,数据②在传输过程中丢失了!发送方等到计时器超时都没收到确认,因此它将数据重新发送一次,并再次启动计时器。

这时,数据②仍维持蓝色不变,因为发送方还没收到确认。等数据成功送达对方,并收到对方的确认后,数据转成灰色状态。待发送字节流颜色不断交替,滚滚向前。

接收缓冲区

由于承载 TCP 报文段的 IP 包是独立路由的,可能走不同的网络路径,无法保证一定按照发送顺序送达目标主机。 TCP 协议需要向上提供连续字节流传输服务,如果报文段错序到达,TCP 必须根据序号重新排列数据。

另一方面,数据到达后目标主机后,接收方应用程序可能忙于其他事情,无法及时处理。鉴于这两个点,TCP 接收方需要在内存中准备一个接收缓冲区,用于临时保存数据。

当 TCP 报文段到达后,数据先临时保存在缓冲区中,位置由序号决定。当相邻的数据均达到后,组成连续字节流提交给应用程序。当应用程序将数据取走后,缓冲区中的副本就可以删除。如果应用程序忙于其他任务,数据则继续缓存在缓冲区中。

TCP 协议一般由操作系统内核实现,应用程序只需通过系统调用发送/接收数据,完全不用关心序号或 ACK 。 TCP 数据到达后,内核先将其保存于接收缓冲区,再通知应用程序读取。

我们来看一个新例子,这次站在接收方的角度,考察数据流在接收缓冲区中的状态:

  1. 刚开始时,接收方缓冲区已接收了 5 字节数据,但应用程序尚未读取;
  2. 发送方又发来 5 字节数据,接收方回复 ACK ,数据保存在缓冲区,应用程序仍未读取;
  3. 与此同时,接收方通告窗口大小为 5 字节,表示自己还能接收 5 字节数据(超过缓冲区就会溢出);
  4. 应用程序将缓冲区中的 10 字节数据全部读取,接收方通告新窗口大小为 15 字节;
  5. 发送方又前后发来两份数据,分别是数据②和数据③,大小均为 4 字节;
  6. 其中,数据②在网络中丢失了;
  7. 数据③顺利到达,接收方根据序号将其保存在缓冲区中,并回复 ACK ,确认号和窗口均不变;
  8. 由于数据②尚未到达,未能组成连续数据提交给应用程序;
  9. 因长时间没收到 ACK ,发送方重传数据②(数据③也被重传,因为 ACK 只确认 10 以前的数据);
  10. 数据②顺利到达,接收方将其保存在缓冲区中,并回复 ACK (注意确认号,数据③也一并确认了);
  11. 数据②和数据③组成连续数据,可以提交给应用程序读取;

综上所述,接收缓冲区主要起到两个关键作用:

  • 应用进程繁忙时暂存数据
  • 数据乱序到达时重排数据

流量控制

接收缓冲区大小是有限的,如果应用进程处理缓慢,发送方还拼命发送,最终肯定会压垮接收方。因此,当缓冲区有变化时,接收方应该通过 窗口大小 字段,将它的剩余大小告知发送方。

接收方通告的窗口大小通常称为 通告窗口( advertised window ),可缩写为 awnd 。它起到约束发送方发送速度的作用:

  • 如果接收方应用进程繁忙,迟迟未读取缓冲区里的数据,那么窗口大小将慢慢变小;
  • 当窗口大小降为零,发送方就停止发送新数据;

通过通告窗口,发送方可以实时感知接收方缓冲区的状态,然后根据缓冲区剩余空间动态调整发送速度,这就是 TCP 的 流量控制( flow control )机制。

滑动窗口

重新站在发送方的角度,来考察数据的发送状态,可以分为四种:

  1. 已发送且已确认,这部分已经发送完毕,可以忽略;

  2. 已发送但未确认,这部分可能在网络中丢失,数据必须保留以便必要时重传;

  3. 未发送但可发送,这部分接收方缓冲区还有空间保存,可以发出去;

  4. 未发送且暂不可发送,这部分已超出接收方缓冲区存储空间,就算发出去也没意义;

注意到,第②和第③部分加起来就刚好是接收方缓冲区大小,如图红框部分。红框的左边缘由接收方的最后一个 ACK 确认决定,而长度由接收方通告的窗口大小决定,它规定了当前发送方能发送的最大数据量。

当发送方收到对方的 ACK ,意味着有数据已成功到达接收方,窗口左边缘将向右移动:

当接收方应用进程将数据从缓冲区取出后,向接收方通告新的窗口大小,这时窗口右边缘向右扩张:

随着双方通信的进行,由 已发送但未确认 以及 未发送但可发送 这两部分数据组成的窗口将不断向右移动,因此被形象地称为 滑动窗口( sliding window ),TCP 流量控制机制也因此被称为滑动窗口机制。

二.CS144关于Slide Window的讲解

        使用停止-等待算法进行单包传输的缺点:假设通信最大带宽为10Mbyes/s,RTT = 50ms。则每秒可以发送20个数据包,假设链路层使用以太网传输。一个包最多有12Kbit数据,则每秒最多可以传输240Kbit数据约等于30KBytes约等于带宽的百分之3左右。

        故而使用停止等待算法传输数据,无法达到最大传输带宽,带宽利用率极低。

解决方案(滑动窗口):

        滑动窗口允许在等待时间内(Flight Time)连续发送多个包,当窗口长度够大时,理论可以达到传输的最大带宽。

停止等待与滑动窗口两种流控制算法示例如下:

发送端滑动窗口:

        每个发送段落都有一个序列号。发送端滑动窗口维护三个变量,一个是窗口长度SWS(由接收端缓存区剩余长度决定),一个是 LAR最后一次接收确认ACK(主要决定窗口起点),最后一个是最后一个发送序列的序列号LSS。满足(LSS - LAR)<= SWS,也就是说最后一次发送的序列减去窗口左边界必须小于窗长。

        LAR是运行时变化的,故而窗口是可以移动的。

        当接收缓存区中元素被取出时,可以通知发送端滑动窗口长度增加,增大发送速率。

        接收端滑动窗口维护三个变量。RWS即为接收窗口长度(接收缓冲区),LAS允许接收的最后一个序列号,LSR最后一次接受的序列号。并且满足(LAS - LST) <= RWS 。

例如:RWS = 5, LSR = 3(窗口左边界)。那么可以继续接收序列号为4 5 6 7 8 9的数据。

如果小于最大可接收边界则发送ACK回复发送端

此时ACK采用累积和的形式。

 

 

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

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

相关文章

Python学习打卡:day04

day4 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 目录 day428、while 循环的嵌套应用29、while 循环案例 — 九九乘法表补充知识示例&#xff1a;九九乘法表 30、for 循环基本语法while 和 for 循环对比f…

react 自定义Hook的实现

// 问题&#xff1a;当前组件耦合在一起的不方便复用 // 解决思路&#xff1a;自定义hook// 1。封装use打头的函数 // 2.在函数体内封装我们可复用的逻辑&#xff08;只要是可复用的都行&#xff09; // 3.要把组件中用到的状态&#xff08;变量&#xff09;或者回调return出去…

使用tkinter创建带有图标的菜单栏

使用tkinter创建带有图标的菜单栏 效果代码代码解析创建主窗口加载图标创建菜单栏添加文件菜单添加带图标的菜单项 Tkinter 的默认菜单外观较为简单&#xff0c;可以通过自定义和添加图标&#xff0c;让菜单显示更好看。 效果 代码 import tkinter as tk from tkinter import …

父亲节|“鞋”守一生,致敬那些年父亲的默默付出

父亲节&#xff0c;是一个感谢父亲的节日。普遍认为的日期是每年6月的第三个星期日&#xff0c;在这一天世界上有52个国家和地区在过父亲节。同时注重孝道也是我们中华民族的传统文化。 在岁月的长河中&#xff0c; 父亲如同那坚实的基石&#xff0c; 承载着家庭的重担&#…

N3 中文文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊# 前言 前言 前面学习了相关自然语言编码&#xff0c;这周进行相关实战 导入依赖库和设置设备 import torch import torch.nn as nn import torchvision fro…

栈的实现详解

目录 1. 栈1.1 栈的概念及结构1.2 栈的实现方式1.3 栈的应用场景 2. 栈的实现2.1 结构体2.2 初始化2.3 销毁2.4 入栈2.5 出栈2.6 获取栈顶元素2.7 判空2.8 获取个数 3. test主函数4. Stack.c文件5. Stack.h文件6. 运行展示 1. 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的…

找不到dll文件如何修复,总结多种dll丢失的修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少DLL文件”。那么&#xff0c;DLL到底是什么呢&#xff1f;为什么计算机会缺失DLL文件&#xff1f;缺失DLL文件会对电脑产生什么具体影响&#xff1f;本文将详细解析这些问题&#xff0…

UC Berkeley简介以及和Stanford的区别与联系

UC Berkeley Source: Google Map 中文版 UC Berkeley&#xff0c;全称University of California, Berkeley&#xff0c;是一所位于美国加利福尼亚州伯克利市的世界知名公立研究型大学。以下是关于UC Berkeley的详细介绍&#xff1a; 学术声誉和排名 学术声誉&#xff1a; U…

Android入门第69天-AndroidStudio中的Gradle使用国内镜像最强教程

背景 AndroidStudio默认连接的是dl.google的gadle仓库。 每次重新build时: 下载速度慢;等待了半天总时build faild;build到一半connection timeout;即使使用了魔法也难以一次build好;这严重影响了我们的学习、开发效率。 当前网络上的使用国内镜像的教程不全 网上的教程…

056、PyCharm 快速代码重构的方法

在实际的编程过程中&#xff0c;如果有一段代码需要在多个地方重复使用&#xff0c;我们应该将这段代码封装成一个函数。这样可以提高代码的可重用性和可维护性。 在PyCharm编辑器里&#xff0c;可以使用以下操作对代码块进行快速的重构。 &#xff08;1&#xff09;、选中一…

【数据分析】推断统计学及Python实现

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

Spring Boot整合Redis通过Zset数据类型+定时任务实现延迟队列

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

mac终端:定位于当前文件夹位置Terminal设置快捷键,实现快速启动--m系列

mac自动脚本(f3直接搜或者找其他->自动操作) 然后找到如下功能: 代码如下: on run {input, parameters} tell application "Finder" set currFolder to POSIX path of (folder of the front window as string) end tell tell application "Termina…

人大高瓴/腾讯提出QAGCF:用于QA推荐的图形协同过滤

【摘要】问答(Q&A)平台通常推荐问答对来满足用户的知识获取需求,这与仅推荐单个项目的传统推荐不同。这使得用户行为更加复杂,并为Q&A推荐带来了两个挑战,包括:协作信息纠缠,即用户反馈受问题或答案的影响;以及语义信息纠缠,其中问题与其相应的答案相关联,不同问答对之…

软件工程实务:软件产品

目录 1、软件产品的基本概念 2、软件工程是什么&#xff1f; 为什么产生软件工程? 软件工程是做什么的? 3、定制软件和软件产品的工程比较 4 、软件产品的运行模式 5、软件产品开发时需要考虑的两个基本技术因素 6、产品愿景 7、软件产品管理 8、产品原型设计 9、小结…

C/C++:指针用法详解

C/C&#xff1a;指针 指针概念 指针变量也是一个变量 指针存放的内容是一个地址&#xff0c;该地址指向一块内存空间 指针是一种数据类型 指针变量定义 内存最小单位&#xff1a;BYTE字节&#xff08;比特&#xff09; 对于内存&#xff0c;每个BYTE都有一个唯一不同的编号…

DeepSORT(目标跟踪算法)卡尔曼滤波中的贝叶斯定理

DeepSORT&#xff08;目标跟踪算法&#xff09;卡尔曼滤波中的贝叶斯定理 flyfish 从例子中介绍名词 假设我们有一个袋子&#xff0c;里面有5个红球和3个蓝球。我们从袋子里随机抽取一个球。 概率 (Probability) 我们想计算从袋子里抽到红球的概率 P ( R ) P(R) P(R)。 …

4D毫米波雷达技术及发展

文章目录 前言一、4D毫米波雷达是什么&#xff1f;二、毫米波雷达是什么&#xff1f;毫米波雷达的基本原理多普勒效应 前言 现阶段自动驾驶技术中&#xff0c;主要用到的传感器有摄像头、激光雷达和毫米波雷达。 摄像头的光谱从可见光到红外光谱&#xff0c;是最接近人眼的传感…

useEffect的概念以及使用(对接口)

// useEffect的概念以及使用 import {useEffect, useState} from reactconst Url"http://geek.itheima.net/v1_0/channels"function App() {// 创建状态变量const [lustGet,setLustGet]useState([]);// 渲染完了之后执行这个useEffect(() > {// 额外的操作&#x…

Vector VH6501使用CANoe工程CANDisturbanceMain进行模拟干扰测试

系列文章目录 文章目录 系列文章目录一、文档介绍二、打开工程 CANDisturbanceMain三、模拟干扰3.1 CAN_H或CAN_L短接到地3.2 CAN_H和CAN_L短接3.3 CAN_H或CAN_L短接到电源3.4 CAN_H和CAN_L反接3.5 CAN_H和CAN_L之间的电阻/电容值调整一、文档介绍 本文档主要介绍如何使用CANo…