运输层7——TCP的流量控制和拥塞控制
写在前面:本文章是针对《计算机网络第七版》的学习笔记
1. TCP的流量控制
所谓流量控制,就是让发送方的发送速率不要太快,要让接收方来得及接收。
利用滑动窗口实现流量控制

设A向B发送数据,在建立连接时,B告诉A它的接收窗口大小是rwnd = 400,发送方的发送窗口的大小不能超过接收方的接收窗口的大小。设每一个报文段的大小是100字节,初始时序号为1。
B进行了3个流量控制。第一次将窗口大小降为300,第二次降为100,第三次降为0。降为0时,发送方A将停止发送直到B发送新的窗口值为止。B向A发送的三个报文段的ACK=1,只有在ACK=1时确认字段才有效。
但是如果B一直没有发送新的窗口值,这种死锁情况会一直持续。为了解决这个问题,TCP为每一个连接设有一个持续计时器。只要发送方收到窗口为0的确认报文就开启,若持续计时器设置的时间到了,就发送一个零窗口的探测报文段(仅仅一个字节),而对方在接收到了这个报文段后就确认并发送新的窗口值,如果窗口值仍为0,则重置持续计时器,继续计时。
2. TCP的拥塞控制
为什么出现拥塞?
- 网络中的带宽资源、交换节点的缓存以及处理机等资源有限,当对资源的需求大于可用的资源时,则会出现拥塞。
拥塞控制与流量控制的区别?
拥塞控制与流量控制关系密切。拥塞控制就是防止过多的数据注入到网络,这样使网络中的链路或路由器不至于过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程。
而流量控制往往是点对点的控制,是端到端的问题(接收到控制发送端)。流量控制就是抑制发送端发送数据的速率,以便接收端来得及接收。
拥塞控制的方法
TCP进行拥塞控制的方法主要有四种:慢开始、拥塞避免、快重传、快恢复。我们先假定:
数据是单方面传输的,对方只传送确认报文;
接收方总是有足够大的缓存空间,因而发送窗口的大小由网络的拥塞程度确定。
我们讨论的是基于窗口的拥塞控制。首先,发送方维持一个叫做拥塞窗口cwnd的状态变量。发送方让自己的发送窗口等于拥塞窗口。
判断网络出现拥塞的依据:是否出现了超时。
慢开始算法: 当主机开始发送数据时,由小到大的增大窗口值。初始窗口值设为不超过2-4个SMSS(最大报文段)的数值。慢开始规定,每收到一个对新的报文段的确认后:
拥塞窗口cwnd每次增加的量 = min(N,SMSS)
其中N是原先未被确认的,但是刚刚收到的确认报文段所确认的字节数。

一开始设置cwnd = 1,发送第一个报文段M1,接收方收到后确认M1;
收到M1的确认后,cwnd设置为2,并发送M2,M3,接收方确认M2,M3;
收到M2,M3的确认后,cwnd设置为4,并发送M4,M5,M5,M7;
......
在TCP的实际运行中,发送方只要收到一个对新报文段的确认,其拥塞窗口cwnd就立即加1,并可以立即发送新的报文段,而不需要等这个轮次中所有的确认都收到后再发送新的报文段。
为了防止拥塞窗口cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。慢开始门限ssthresh的用法:
当cwnd<ssthresh时,使用上述的慢开始算法;
当cwnd>ssthresh时,停止使用慢开始算法而改用拥塞避免算法;
当cwnd=ssthresh时,既可以使用慢开始算法,也可以使用拥塞避免算法。
拥塞避免算法 :让cwnd缓慢的增大(线性),即每次经过一个RDD时间就把发送方的拥塞窗口加1。因此,拥塞避免阶段就有“加法增大”的特点。

如图:
初始时,将cwnd设为1,慢开始门限值设为ssthresh = 16,一开始先采用慢开始算法进行指数增长,直到cwnd=16;
当cwnd=16时,采用拥塞避免算法,cwnd开始线性增长;
当cwnd=24时,网络出现的超时,判断为拥塞情况。于是将ssthresh设为当前cwnd的一半,也就是12,同时设置cwnd为1,重新开始慢开始算法;
当cwnd=12时,开始执行拥塞避免算法;
假设在cwnd=16时,出现了一个新的情况,就是发送方一连收到三个对同一个报文段的重复确认。这是因为:个别报文会在网络中丢失,但是网络并未发生拥塞,如果发送方迟迟收不到确认,就会产生超时,就会误认为网络发生了拥塞,错误的导致发送方启动慢开始,降低了传输效率。

快重传算法: 采用快重传算法可以让发送方尽早知道发生了个别报文段的丢失。快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是立即发送确认,即使收到失序的报文段也发送对已收到报文段的重复确认。如上图,M1和M2都收到了确认,但是M3丢失了,因此在发送M4,M5,M6时接收方要重复发送对M2的确认。当发送方收到3个连续的M2确认后,就知道M3丢失了,因此立即重传M3,这时就不会出现超时。快重传算法使网络吞吐量增大20%。
发送方知道只是丢失了个别报文段,因此不重启慢开始算法,而是使用快恢复算法。
快恢复算法: 发送方将门限值ssthresh设为cwnd的一半,并将cnwd设为门限值,开始执行拥塞避免算法。快恢复算法具有“乘法减小”特点。
当然也有的快恢复算法是把cwnd再增大一些(+3),因为受到3个重复的确认,表明有三个分组离开了网络,这三个分组不占用网络的资源而是存储在接收方的缓存中,因此cwnd可以扩大3。
另外,发送窗口的大小不能大于接收窗口的大小。
运输层7——TCP的流量控制和拥塞控制的更多相关文章
- TCP的流量控制与拥塞控制小结
概述 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认.其中TCP的流量控制与拥塞控制是 ...
- TCP 的三次握手和四次挥手,TCP 的流量控制和拥塞控制
70.TCP协议的三次握手与四次挥手70.1.TCP报文结构 1.源端口号:表示发送端端口号,字段长为16位. 2.目标端口号:表示接收端口号,字段长为16位. 3.序列号:表示发送数据的位置 ...
- TCP的流量控制和拥塞控制
1.TCP的流量控制 一般说来,我们总是希望数据传输的更快一些.但如果发送方吧数据发送的过快,接收方就可能来不及接收,就会造成数据的丢失.所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来的及 ...
- TCP/IP详解学习笔记(15)-- TCP的流量控制和拥塞控制
TCP的流量控制 1.概述 所谓的流量控制就是让发送方的发送速率不要太快,让接收方来得及接受.利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制.TCP的窗口单位是字节,不是报 ...
- 【计算机网络】TCP的流量控制和拥塞控制
TCP的流量控制 1. 利用滑动窗口实现流量控制 如果发送方把数据发送得过快,接收方可能会来不及接收,这就会造成数据的丢失.所谓流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收. 利用滑动 ...
- NetWork——TCP的流量控制和拥塞控制
,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大. 这里为什么替换掉了慢开始算法呢,这是因为收到重复的ACK不仅仅告诉我们一个分组丢失了,由于接收方只有在收到另一个报文段时才会产生重复的ACK,所 ...
- 快速了解TCP的流量控制与拥塞控制
有关TCP你不能不知道的三次握手和四次挥手问题,点我跳转 流量控制 1. 滑动窗口 数据的传送过程中很可能出现接收方来不及接收的情况,这时就需要对发送方进行控制以免数据丢失.利用滑动窗口机制可以很方便 ...
- 运输层5——TCP报文段的首部格式
写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控制协议TCP概述 运输层4--TCP可靠运输的工作原理 ...
- 运输层8——TCP运输连接管理
目录 1. TCP的连接建立 2. TCP的连接释放 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控 ...
随机推荐
- 【GStreamer开发】GStreamer播放教程04——既看式流
目的 在<GStreamer基础教程--流>里面我们展示了如何在较差的网络条件下使用缓冲这个机制来提升用户体验.本教程在<GStreamer基础教程--流>的基础上在扩展了一下 ...
- C++ 理解函数对象与lambda表达式
参考<21天学通C++>第21与第22章节,对函数对象进行介绍,同时通过lambda表达式这一匿名函数对象的简洁方式加深对函数对象的理解.本篇博文的主要内容是: (1) 函数对象的概念: ...
- 安卓app和苹果app共用一个二维码
应项目要求,现在安卓app和苹果app共用一个二维码,对外提供下载: <html> <head> <meta http-equiv="Content-Type& ...
- tracert详解
1tracert作用 是用于探索源地址到目标地址当中所经过的路线.而每到达一个点,就会向源地址返回一个信号.例如A要访问D,那么当中经过B,再经过C.当经过B时,会向A返回一个信号,当经过C时,再向A ...
- dockerui 安装
meiya@meiya:~$ docker pull abh1nav/dockerui Using default tag: latest latest: Pulling from abh1nav/d ...
- spring结合shiro的学习总结
pom文件加入 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-c ...
- Java中的IO流之输入流|乐字节
亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入 ...
- PHP强制在微信中打开
if (!Func::isWx()) { exit('请在微信客户端打开链接'); } // 判断是否是微信 public static function isWx() { if ( strpos($ ...
- scrapy工具创建爬虫工程
1.scrapy创建爬虫工程:scrapy startproject scrape_project_name >scrapy startproject books_scrapeNew Scrap ...
- Python25之字典1
一.字典的意义 字典不同于前述的序列类型,他是一种映射类型,它的引入就是为了简化定义索引值和元素值存在的特定关系的定义和访问问题 二,字典定义 字典变量名 = {key1 : value1, key2 ...