计算机网络学习笔记:TCP流控、拥塞控制

文章目录


前言

TCP协议中的流量和拥塞,是两个关键的控制指标,两者的侧重点也是不一样的:

  • 流量控制:侧重于控制点对点通信中发送方与接收方的流量,保证发送方的发送速率不高于接收方的接收速率,避免接收方的缓存溢出。
  • 拥塞控制:侧重于控制全局网络中的主机,路由器,按照拥塞控制算法,自行控制发送速率。防止过多的数据注入到网络中,使网络可以承受现有的负荷。

一、TCP流量控制

流量控制的目的,是为了避免发送方的发送速率高于接收方的接收速率,具体是接收方根据自己的接收能力,控制发送方的发送速率。

控制手段则是通过发送方的发送窗口swnd(s:send)和接收方的接收窗口rwnd(r:receive)

1.1、案例:三次流量控制

TCP流量控制的过程,假设我有A和B两台主机,A是发送方,B是接收方。那么在建立连接时,B应该通知A ,自己的接收窗口是多少,A相应地将自己的发送窗口也设置相同的大小:

A发送出第一个报文段,对应的是1-100:

A发送出第二个报文段,对应的是101-200:

发送第三个报文段,丢失:

主机B给主机A发送累计确认报文段,对seq为201之前的数据进行累计确认

在累计确认的同时,接收方通知发送方,自己的rwnd大小发生了变更,则发送方在将自己发送数据的滑动窗口向前滑动时,也要将自己的swnd同步变更,当前的rwnd和滑动窗口如图所示,这是第一次流量控制的体现

随后发送301~500的数据。

201到300的重传计时器超时了 ,主机A将其重新封装成一个TCP报文段进行发送,主机B发送一个确认报文段,同时调整自身的接收窗口为100:

这是第二次流量控制的体现

最后发送501~600的数据,并且接收方进行确认,并进行最后一次流量控制,将rwnd设置为0,表示不再接受数据,有可能是因为接收方的缓存区已满。

上述的过程,就是一次完整的流量控制。

1.2、持续计时器

接着上面的案例,假设最后一次流量控制之后,接收方B处理完成了数据,缓存区又有了空间,准备继续接收发送方A的数据,这时B需要再次对A进行流量控制,将自身的rwnd调整至300:

但是消息在发送的过程中丢失 了,那么就会出现A一直等待B的非零窗口通知 ,B一直等待A发送消息,造成通信死锁的情况。

为了解决这样的问题,TCP给每一个连接都设置了一个持续计时器 ,并且规定,即使接收窗口值为0,也必须接受零窗口探测报文段,确认报文段以及携带有紧急数据的报文段:


二、TCP拥塞控制

网络拥塞问题是指网络中传输的数据过多,超过了网络设备(如路由器、交换机)或链路的处理能力,导致网络性能下降的现象。就像高峰期的马路:

  • 如果车(数据包)太多,马路(网络)就会堵;
  • 堵车后,不仅原来开的慢,新车也进不来;
  • 严重时还可能发生车辆回退(丢包)、绕路(重传)甚至"交通瘫痪"(网络崩溃)。

如果不加以控制,导致的就是整个网络的崩溃,类似于微服务的雪崩

拥塞控制的基本方法,分为开环控制闭环控制

  • 开环控制侧重于从设计的角度避免出现拥塞的问题,前提是要提前知道进行控制的网络的参数和流量。
  • 闭环控制侧重于从运行时的角度避免拥塞的问题,即对于网络进行监控,及时接受反馈并且调整。

闭环控制,又可以分为显式控制算法隐式控制算法

  • 显式控制算法指的是,路由器向源点反馈网络的拥塞状态,即路由器拥塞,丢弃IP数据报,并且通知源站,通知同样需要利用网络通信,通知的行为,可能会造成网络更加拥堵。可以在路由器的转发分组中,保留一个字段,该字段的值表示网络的拥塞状态。
  • 隐式控制算法指的是,源站点自己对网络的指标进行观察,判断网络是否发生拥塞。TCP使用的就是隐式控制算法

2.1、拥塞控制的指标

对于发送方而言,指标有发送窗口swnd(s:send),拥塞窗口cwnd(c:crowded) ,对于接收方而言,指标有接收窗口rwnd(r:reveive)

只有序号落入swnd的数据,发送方才可以进行发送,swnd的取值,是cwnd和rwnd的最小值。

rwnd用于控制流量,cwnd用于控制拥塞

2.2、慢开始算法和拥塞避免算法

慢开始算法拥塞避免算法,通常配合使用,这里加入了一个ssthresh慢开始门限的指标

使用慢开始算法和拥塞避免算法组合时,首先运用的是慢开始算法将cwnd进行逐次指数累加 ,直到到达ssthresh的值:

然后改用拥塞避免算法每个轮次cwnd的值只能 + 1 ,而不像慢开始算法,可以指数增长,当发生了重传和报文段丢失的情况,说明网络中出现了拥塞 ,就需要调整拥塞窗口cwnd和ssthresh的值,然后重新执行慢开始算法

  1. ssthresh的值调整为发生拥塞时,拥塞窗口cwnd值的一半。
  2. cwnd的值重置为1。

最终的曲线如下:

2.3、快重传算法和快恢复算法

快重传算法快恢复算法是对于慢开始算法拥塞避免算法的改进。因为后者可能会存在一个问题,也就是如果路由器是因为请求出现了误码,才将其丢弃**(非网络出现拥塞)**,源站是无法判断这种情况的,会将cwnd的值重置为1重新开始,降低了效率。

快重传算法的目的是让发送方尽快知道TCP报文段的丢失,从而尽快地进行重新传输,就要求接收方在收到消息后,立刻进行ack。

如下图,如果TCP没有接收到3号报文段,就会在后续报文段到达时,**发送对未收到报文段的重复确认。**当发送方接收到3次重复确认后,就对丢失的报文进行立刻重传(接收方在接收到M4后,发现M3并没有接收到,于是重复确认M2,重复确认M2到达3次后,发送方立刻重传M2)

当发送方接收到3次重复确认后,同时也会执行快恢复算法 + 拥塞避免算法

  1. ssthresh的值调整为cwnd值的一半。
  2. cwnd的值调整为cwnd值的一半。

最终的曲线如下图:

2.4、练习

这道题的答案是C。拥塞窗口为16KB时发生了超时,那么此时的指标:

  • ssthresh:16/2 = 8
  • cwnd:1

然后重新使用慢开始算法

RTT cwnd
1 2
2 4
3 8(到达了ssthresh,转换为拥塞避免算法
4 8 + 1 = 9

这道题的答案是A。同样地,拥塞窗口为8KB时发生了超时,那么此时的指标:

  • ssthresh:8/2 = 4
  • cwnd:1

然后重新使用慢开始算法

RTT cwnd
1 2
2 4(到达了ssthresh,转换为拥塞避免算法
3 5
4 6
5 7
... ...
10 12

这一题比上一题多了一个考察点,发送窗口swnd 是 rwnd 和 cwnd 的较小值。 min(12,10)= 10。


这道题的答案选A:

三、TCP拥塞控制与网际层拥塞控制

运输层TCP拥塞控制相关的,是网际层路由器对于IP数据报的丢弃策略。由于路由器的缓存队列是标准的"先进先出"的结构,队列已满,则会丢弃最后的元素。

当多个发送行为触发尾部丢弃 时,这些发送方都会进入慢开始状态,称为全局同步 ,会导致同一时刻网络流量的骤降,以及之后的持续增高。

为了避免这样的问题,提出了主动队列管理 的概念,其核心思想在于避免出现路由器缓存队列已满的情况,当队列长度达到某个阈值时,就触发丢弃策略:

总结

相关推荐
njsgcs16 分钟前
gcn graphsage 视频笔记
笔记
weixin_4426434223 分钟前
IP Guard vs Ping32:2025 年企业防泄密系统深度横评
服务器·网络·安全·数据安全
虾球xz1 小时前
CppCon 2016 学习:GAME ENGINE USING C++11
大数据·开发语言·c++·学习
Jet45051 小时前
第100+42步 ChatGPT学习:R语言实现阈值调整
开发语言·学习·chatgpt·r语言
虾球xz1 小时前
CppCon 2016 学习:fixed_point Library
开发语言·c++·学习
HaiQinyanAN1 小时前
【学习笔记】nlohmannjson&&cjson
c++·笔记·学习·json
企鹅侠客2 小时前
长连接、短连接、WebSocket区别和使用场景
网络·websocket·网络协议
忘川w2 小时前
网络安全相关知识
笔记·网络安全
寄思~2 小时前
Python学习笔记:错误和异常处理
开发语言·笔记·python·学习
啊哈哈哈哈哈啊哈哈2 小时前
G2打卡——人脸图像生成
pytorch·学习·gan