运输层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--传输控 ...
随机推荐
- 原生Js页面滚动延迟加载图片
原理和过程1.页面滚动加载事件2.获取元素在页面里的top值 根据滚动条的位置 判断何时显示图片3.获取元素集合 加载过的图片从集合里删除 效果预览:http://jsfiddle.net/dtdxr ...
- UMl类图基本认识
1.基本认识 1) UML——Unified modeling language UML (统一建模语言), 是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果2) ...
- 032 Android Service
1.介绍 2.新建Service (1) (2)在Androidmanifest.xml文件中配置service <service android:name=".Myservice&q ...
- 【转帖】IP地址总数
http://blog.sina.com.cn/s/blog_ac1d70a40102xn8z.html 计算规则挺有意思的 私有IP地址段: A类:10.0.0.0到10.255.255.255 1 ...
- Linux基础-07-系统的初始化和服务
1. Linux系统引导的顺序 1) Linux系统引导的顺序: 其中,BIOS的工作是检查计算机的硬件设备,如CPU.内存和风扇速度等: MB ...
- CSS的三种基本框架
CSS的三类选择器 1.css-css的基本选择器(三种) 要对哪个标签里面的数据进行操作 (1)标签选择器 div { background-color:red; color:blue; } (2) ...
- Python socket 编程(1)
服务端的创建: import socket server = socket.socket() # 创建一个socke对象 server.bind(('192.168.101.5', 8001)) # ...
- docker 实践六:dockerfile 详解
本篇开始来学习关于 dockerfile 的知识. 注:环境为 CentOS7,docker 19.03. dockerfile 是⼀个⽂本格式的配置⽂件, ⽤户可以使⽤ dockerfile 来快速 ...
- go select 使得一个 goroutine 在多个通讯操作上等待。
select 语句使得一个 goroutine 在多个通讯操作上等待. select 会阻塞,直到条件分支中的某个可以继续执行,这时就会执行那个条件分支.当多个都准备好的时候,会随机选择一个. pac ...
- Shiro身份认证、盐加密
目的: Shiro认证 盐加密工具类 Shiro认证 1.导入pom依赖 <dependency> <groupId>org.apache.shiro</groupId& ...