从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 计算机简史

  • 数字电路

  • 计算机组成原理

  • 操作系统

  • Linux

  • 计算机网络

    • 计算机网络微课堂

      • 课程概述
      • 1-1 计算机网络在信息时代的作用
      • 1-2 因特网概述
      • 1-3 三种交换方式
      • 1-4 计算机网络的定义和分类
      • 1-5 计算机网络的性能指标
      • 1-6 计算机体系结构
      • 2-1 物理层的基本概念
      • 2-2 物理层下面的传输媒体
      • 2-3 传输方式
      • 2-4 编码与调制
      • 2-5 信道的极限容量
      • 3-1 概述
      • 3-2 封装成帧
      • 3-3 差错检测
      • 3-4 可靠传输
      • 3-5 点对点协议 PPP
      • 3-6 媒体接入控制的基本概念
      • 3-7 MAC 地址
      • 3-7 IP 地址
      • 3-7 ARP 协议
      • 3-8 集线器与交换机的区别
      • 3-9 以太网交换机自学习和转发帧的流程
      • 3-10 以太网交换机的生成树协议 STP
      • 3-11 虚拟局域网 VLAN
      • 4-1 网络层概述
      • 4-2 网络层提供的两种服务
      • 4-3 IPv4 地址
      • 4-4 IP 数据报的发送和转发过程
      • 4-5 静态路由配置及其可能产生的路由环路问题
      • 4-6 路由选择
      • 4-7 IPv4 数据报的首部格式
      • 4-8 网际控制报文协议 ICMP
      • 4-9 虚拟专用网 VPN 与网络地址转换 NAT
      • 5-1 运输层概述
      • 5-2 运输层端口号、复用与分用的概念
      • 5-3 UDP 和 TCP 的对比
      • 5-4 TCP 的流量控制
      • 5-5 TCP 的拥塞控制
      • 5.6 TCP 超时重传时间的选择
      • 5-7 TCP 可靠传输的实现
      • 5-8 TCP 的运输连接管理
      • 5-9 TCP 报文段的首部格式
      • 6-1 应用层概述
      • 6-2 客户—服务器方式和对等方式
      • 6-3 动态主机配置协议 DHCP
      • 6-4 域名系统 DNS
      • 6-5 文件传送协议 FTP
      • 6-6 电子邮件
      • 6-7 万维网 WWW
    • 计算机网络微课堂-实验手册

    • 从零开始学计算机网络

  • 数据库

  • 编程工具

  • 装机

  • 计算机基础
  • 计算机网络
  • 计算机网络微课堂
2023-11-16

5-4 TCP 的流量控制

# 540.5-4 TCP 的流量控制

本节课我们介绍 TCP 的流量控制:

  • 一般来说我们总是希望数据传输的更快一些
  • 但如果发送方把数据发送的过快,接收方就可能来不及接收,这就会造成数据的丢失
  • 所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收
  • 利用滑动窗口机制,可以很方便的在 TCP 连接上实现对发送方的流量控制

我们来举例说明,假设主机 A 和 B 是因特网上的两台主机,它们之间已经建立了 TCP 连接,A 给 B 发送数据,B 对 A 进行流量控制,这是主机 A 中带发送数据的字节序号,假设主机 A 发送的每个 TCP 报文段可携带 100 字节数据,因此图中每个小格子表示 100 个字节数据的序号,在主机 A 和 B 建立 TCP 连接时,B 告诉 A 我的接收窗口为 400,因此主机 A 将自己的发送窗口也设置为 400,这意味着主机 A 在未收到主机 B 发来的确认时,可将序号落入发送窗口中的全部数据发送出去。。

接下来我们举例说明主机 B 对 A 的流量控制,主机 A 将发送窗口内序号 1~100 的数据,封中成一个 TCP 报文段发送出去,发送窗口内还有 300 字节可以发送。

这里的 seq 是 TCP 报文段首部中的序号字段,取值一,表示 TCP 报文段数据载荷的第一个字节的序号是一。

这里的 DATA 表示这是 TCP 数据报文段,主机 A 将发送窗口内序号 101~200 的数据,封中成一个 TCP 报文段发送出去,发送窗口内还有 200 字节可以发送,主机 A 将发送窗口内,序号 201~300 的数据,封中成一个 TCP 报文段发送出去,但该报文段在传输过程中丢失了,主机 A 发送窗口内还有 100 字节可以发送。

主机 B 对主机 A 所发送的 201 号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为 300,也就是对主机 A 进行流量控制。这里的大写 ACK 是 TCP 报文段首部中的标志位,取值一,表示这是一个 TCP 确认报文段,小写 ack 是 TCP 报文段首部中的确认号字段,取值 201,表示序号 201 之前的数据已全部正确接收,现在希望收到序号 201 及其后续数据。

RWND 是 TCP 报文段首部中的窗口字段,取值 300,表示自己的接收窗口大小为 300。主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号,移出发送窗口。

​​

由于主机 B 在该累计确认中,将自己的接收窗口调整为了 300,因此主机 A 相应的将自己的发送窗口调整为 300。目前主机 A 发送窗口内的序号为 201~500,也就是主机 A 还可以发送这 300 字节,其中 201~300 号字节是已发送的数据,若重传计时器超时,他们会被重传。301 号到 400 号字节,以及 401 号到 500 号字节还未被发送,可被分别封中在一个 TCP 报文段中发送。主机 A 现在可将发送缓存中序号 1~200 的字节数据全部删除了,因为已经收到了主机 B 对他们的累计确认。

主机 A 将发送窗口内序号 301~400 个数据,封中成一个 TCP 报文段发送出去,发送窗口内还有 100 字节可以发送,主机 A 将发送窗口内序号 401~500 的数据,封中成一个 TCP 报文段发送出去,至此序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。

现在发送窗口内序号 201~300,这 100 个字节数据的重传计时器超时了,主机 A 将它们重新封中成一个 TCP 报文段发送出去,暂时不能发送其他数据。

主机 B 收到该重传的 TCP 报文段后,对主机 A 所发送的 501 号以前的数据进行累计确认,并在该累计确认中将窗口字段的值调整为 100。这是主机 B 对主机 A 进行的第二次流量控制。

​​

主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号,移出发送窗口。由于主机 B 在该累计确认中将自己的接收窗口调整为了 100,因此主机 A 相应的将自己的发送窗口调整为 100。

目前主机 A 发动窗口内的序号为 501~600,也就是主机 A 还可以发送这 100 字节,主机 A 现在可将发送缓存中序号 201~500 的字节数据全部删除了,因为已经收到了主机 B 对他们的累积确认,主机 A 将发送窗口内序号 501~600 的数据,封中成一个 TCP 报文段发送出去,至此序号落在发送窗口内的数据已经全部发送出去了,不能再发送新数据了。

主机 B 对主机 A 所发送的 601 号以前的数据进行累计确认,并在该领域确认中将窗口字段的值调整为 0。这是主机 B 对主机 A 进行的第三次流量控制。

​​

主机 A 收到该累计确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号,移出发送窗口。由于主机 B 在该累计确认中将自己的接收窗口调整为了 0,因此主机 A 相应的将自己的发送窗口调整为 0。

目前主机 A 不能再发送一般的 TCP 报文段了,主机 A 现在可将发送缓存中序号 501~600 的字节数据全部删除了,因为已经收到了主机 B 的累计确认,假设主机 B 向主机 A 发送了 0 窗口的报文段后不久,主机 B 的接收缓存又有了一些存储空间,于是主机 B 向主机 A 发送了接收窗口等于 300 的报文段,然而这个报文段在传输过程中丢失了,主机 A 一直等待主机 B 发送的非 0 窗口的通知,而主机 B 也一直等待主机 A 发送的数据,如果不采取措施,这种互相等待而形成的死锁局面将一直持续下去。

为了解决这个问题,TCP 为每一个连接设有一个持续计时器,只要 TCP 连接的一方,收到对方的 0 窗口通知,就要起到持续计时器。若持续计时器超时,就要发送一个 0 窗口探测报文,仅携带一字节的数据,而对方在确认这个探测报文段时,给出自己现在的接收窗口值。如果接收窗口仍然是 0,那么收到报文段的一方要重新启动持续计时器,如果接收窗口不是 0,那么死锁的局面就可以被打破了。

​​

在本例中,主机 A 收到零窗口通知时,就要启动一个持续计时器,当持续计时器超时,主机 A 立刻发送一个仅携带一字节数据的零窗口探测保温段,假设主机 B 此时的接收窗口又为 0 了,主机 B 就在确认零窗口探测报文段时,给出自己现在的接收窗口值为零。

主机 A 再次收到零窗口通知,就要再次启动一个持续计时器,当持续计时器超时,主机 A 立刻发送一个零窗口探测报文段,假设主机 B 此时的接收缓存又有了一些存储空间,于是将自己的接收窗口调整为了 300,主机 B 就在确认零窗口探测报文段时,给出自己现在的接收窗口值为 300,这样就打破了死锁的局面。

​​

同学们可能会有这样的疑问,主机 A 所发送的零窗口探测报文段到达主机 B 时,如果主机 B 此时的接收窗口仍然为 0,那么主机 B 根本就无法接受该报文段,又怎么会针对该报文段给主机 A 发回确认呢?实际上 TCP 规定即使接收窗口为 0,也必须接受零窗口探测报文段,确认报文段,以及携带有紧急数据的报文段。

请大家再来思考一下这个问题。如果零窗口探测报文段丢失了,会出现怎样的问题呢?还能否打破死锁的局面呢?回答是肯定的,因为零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口探测报文段会被重传。

接下来我们来做一个相关的练习题,这是计算机专业考研全国统考计算机网络部分 2010 年的题 39,由于该题涉及到了我们还未学习的拥塞控制的内容,因此我们需要先做一些说明,然后再请同学们来完成。

TCP 发送方的发送窗口,实际上是在自身的拥塞窗口和 TCP 接收方的接收窗口中取小者。而在我们本节课的举例中,为了简单起见,我们忽略了拥塞控制,也就是认为 TCP 发送方的发送窗口等于接收方的接收窗口。本题未给出 TCP 发送方的发送窗口的初始值,则我们取拥塞窗口值作为发送窗口值。

答案是选项 A。我们来一起画图分析一下,这是主机假中带发送数据的序号。根据题意可知,主机甲的发动窗口为 4000 字节,主机甲向主机乙连续发送两个最大段,共 2000 字节,也就是将发送窗口内,序号 0~1999 的字节数据发送出去,主机乙给主机甲发送针对第一个段的确认,并在该确认中给出自己当前的接收窗口大小为 2000 字节,主机甲收到该确认后,将发送窗口向前滑动,使已发送并收到确认的第一个段的序号移出发送窗口。由于主机乙在确认中给出的自己的接收窗口大小为 2000 字节,因此主机甲相应的将自己的发送窗口调整为 2000 字节,很显然主机甲还可以向主机乙发送 2000~2999 号字节数据,共 1000 个字节。

​​

本节课的内容小结如下:

​​

上次更新: 2025/6/3 09:31:54
5-3 UDP 和 TCP 的对比
5-5 TCP 的拥塞控制

← 5-3 UDP 和 TCP 的对比 5-5 TCP 的拥塞控制→

最近更新
01
语雀文档一键下载至本地教程
07-04
02
要成功,就不要低估环境对你的影响
07-03
03
血泪教训:电子设备要定期开机
07-02
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式