网络排查案例课
杨胜辉
eBay 资深运维专家,流量系统负责人
22781 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 39 讲
实战三:不用抓包就能做的网络排查篇 (2讲)
网络排查案例课
15
15
1.0x
00:00/00:00
登录|注册

11 | 拥塞:TCP是如何探测到拥塞的?

通过Wireshark分析确认
专线限速设置失误
Linux 3.0内核起提升到10个MSS
每条连接独立维护
当RW>CW时,速度由CW决定
当RW<CW时,速度由RW决定
BBR算法
sysctl net.ipv4.tcp_congestion_control命令
ip route change命令
Expert Information
TCP Stream Graphs
I/O Graph
遇到拥塞后CW减半,然后线性增长
Reno算法引入
收到3次重复确认后触发
AIMD策略:和性增长乘性降低
CW线性增长
终止条件:遇到拥塞或CW达到ssthresh
CW以翻倍方式增长
抓包分析中观察到的拥塞现象
工作中遇到的拥塞问题
传输文件速度慢
初始拥塞窗口 (ICW)
拥塞窗口 (CW)
传输速度上限
改变TCP拥塞控制算法
修改初始拥塞窗口 (ICW)
Wireshark
快速恢复 (Fast Recovery)
快速重传 (Fast Retransmission)
拥塞避免 (Congestion Avoidance)
慢启动 (Slow Start)
初始拥塞窗口 (ICW)
最大报文段大小 (MSS)
慢启动阈值 (ssthresh)
拥塞窗口 (CW)
在途字节数
发送窗口 (SW)
接收窗口 (RW)
往返时间 (RTT)
思考题
案例分析
拥塞控制影响因素
拥塞控制实验
拥塞控制相关工具
拥塞控制机制
核心概念
TCP拥塞控制

该思维导图由 AI 生成,仅供参考

你好,我是胜辉。
前面两节课,我们通过真实的案例,一起学习了 TCP 传输方面的知识,比如其中的核心概念:往返时间、接收窗口和发送窗口、在途字节数,还有推导出来的核心公式。
当然,在实际场景里,我们可以直接利用 Wireshark 的 I/O Graph 查看速度趋势图,这样最方便,并且有不同时段的速度,方便我们对整体状况做全面的评估。
不过,不知道你有没有发现,TCP 传输的起始阶段,速度都是从低到高升上来的,很少有一上来就直接以最终速度运行的情形。其实,这个行为跟 TCP 拥塞控制有着密切的关系。所以这节课,我会带你了解什么是拥塞窗口、TCP 是如何检测和避开拥塞的。这样呢,以后你处理 TCP 拥塞相关的问题时候,就能有的放矢,做到有针对性的分析了。
好,让我们来看一个具体的案例吧。

案例

在公有云服务的时候,我们有个银行的客户,他们有一次需要跨机房拷贝一个大文件,也就是用 SCP 命令,把文件从公有云机房拷贝到他们的自建机房。但是客户发现速度比较慢,让我们看一下原因。
架构上说,客户自己的机房在上海,公有云上的资源则在北京。地理位置相差很远,而且机房所属的性质也完全不同,那两者如何通信呢?走公网的话不太安全,而且速度和质量没有保障。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

TCP拥塞控制是网络传输中至关重要的机制。本文通过案例分析和专业术语解释,深入介绍了TCP拥塞控制的关键阶段和概念。文章首先强调了拥塞控制的重要性,指出其是通信两端自行实现的功能。详细介绍了拥塞控制的四个重要阶段:慢启动、拥塞避免、快速重传和快速恢复,并对慢启动阈值、拥塞窗口等概念进行了详细解释。通过案例分析展示了利用Wireshark工具观察TCP传输过程中的行为,并强调了拥塞控制的实现是通信两端的责任。此外,还介绍了拥塞算法相关的知识点,如间隔确认、拥塞窗口、拥塞避免、快速重传和快速恢复等。文章还提到了实验中修改初始拥塞窗口和改变TCP拥塞控制算法的方法。总体而言,本文内容深入浅出,适合读者快速了解TCP拥塞控制的关键概念和实际应用。 文章通过案例分析和专业术语解释,深入介绍了TCP拥塞控制的关键阶段和概念。强调了拥塞控制的重要性,详细介绍了慢启动、拥塞避免、快速重传和快速恢复等阶段,以及相关概念和工具的使用方法。同时,还提到了实验中修改初始拥塞窗口和改变TCP拥塞控制算法的方法。整体而言,本文内容深入浅出,适合读者快速了解TCP拥塞控制的关键概念和实际应用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络排查案例课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • Chao
    慢启动阈值 (ssthresh)的初始值是如何确定的,当慢启动过程中没有进入重传状态,如何进入拥堵避免?

    作者回复: 好问题:) 我们可以参考比较新的RFC5681(写于2009年),它的建议(这里不是样的规定)是: The initial value of ssthresh SHOULD be set arbitrarily high (e.g., to the size of the largest possible advertised window), but ssthresh MUST be reduced in response to congestion. 意思是初始慢启动阈值可以大胆一点设置为一个很大的值。当遇到拥塞的时候(超时或者3个DupAck),慢启动阈值会减为当前这个拥塞点的拥塞窗口的一半,这个时候的慢启动阈值,就是适配了实际情况的值,而不是最初那个大胆设置出来的值。 所以,首次慢启动后一般不会主动进入拥塞避免,而是等出现拥塞才获取到第一个实际可用的慢启动阈值。 你可以理解为: 1. TCP传输开始后进入慢启动,因为初始值很高,一般不进入拥塞避免 2. 如果达到了对方的接收窗,就维持在这个速度,然后 2.1如果遇到3次DupAck,那么 2.1.1 如果是TCP Tahoe这种老算法,再次进入慢启动然后拥塞避免 2.1.2 如果是其他算法,进入快速恢复 2.2如果拥塞是超时,则进入慢启动然后拥塞避免

    2022-02-14
    2
    9
  • 那时刻
    请问老师两个问题 1. 拥塞避免,直到探测到拥塞,然后拥塞窗口就要往下降。请问如何探测拥塞呢?依据接收方的接收窗口与in flight数据大小吗?是不是还有其它方法? 2. 快速恢复,如果遇到超时,也一样要回到慢启动阶段,重新开始。请问这个超时时间是多少呢?可改配置吗?

    作者回复: 您好: 1. 探测到拥塞,一般是两个条件,一是超时,一是收到3个DupAck。两者都表示传输出现了问题。你提到的“接收方的接收窗口与in flight数据大小”,如果在途数据等于对方的接收窗口,传输会是匀速进行了,也不属于拥塞,但无法继续增大拥塞窗口和发送窗口。你可以参考第9讲的案例。 2. 超时是动态计算的,因为每个场景下的RTT都不相同(而且同个连接的RTT本身也会动态变化),因此计算出来的RTO也不相同。不过RTO一般有个最小值,Linux的RTO最小值是200ms。

    2022-02-14
    3
    5
  • 好吃不贵
    请教老师一个问题哈,可以服务端,客户端用不同算法吗?比如server用BBR,client用CUBIC? 多谢哈

    作者回复: 可以啊,本来就是双方各自用自己的拥塞控制算法的。你可以想象一下,一个服务端要跟那么多客户端通信,这些客户端也没有“说好了用同一种拥塞控制”,对不对:)

    2022-03-21
    2
    4
  • 江山如画
    老师,有个小问题,在慢启动的时候,每收到一个 ack 报文,拥塞窗口就加 1 个mss,不太清楚为什么拥塞窗口这个阶段是翻倍增长。 图上看慢启动阶段,第一次发送了1个报文,第二次发送了2个报文,第三次发送了4个报文,是因为慢启动阶段,每次都发出上一轮的2倍的报文数目,达到翻倍增长的目的么?

    作者回复: 这确实是一个应该关注的知识点。慢启动阶段的“拥塞窗口翻倍”是一种表现,但不是规定。规定是“每收到一个ack,拥塞窗口就增加一个MSS”。比如: 初始拥塞窗口为10MSS;假如每次都有足量的数据要发送,那么: 第一次往返:发出10个MSS, 收到10个Ack,此时拥塞窗口增长为10+10也就是20个MSS 第二次往返:发出20个MSS,收到20个Ack,此时拥塞窗口增长为20+20也就是40个MSS 上面这种就是“翻倍”,但注意,RFC不是说一定要在一个RTT里面翻倍,而是因为一个RTT里经常收到跟发送量同等数量的Ack,所以效果上是翻倍的。

    2022-02-14
    11
    4
  • webmin
    流量图上观察到“平顶山”就一个最明显的流量达限的情况,一但出口流量达到上限就容易引发相互踩踏的情况,传不出去,使用的人就更着急,就会点击更多次,或者多窗多设备重试,引发更多的拥塞。

    作者回复: 嗯所以TCP就设计了拥塞避免这种机制,为了让网络使用尽可能的公平。生活中也是,不排队随便挤的话反而慢,排队来反而快。TCP拥塞控制也是类似,有了规矩,不随意争抢,大家的机会就会比较均等:)

    2022-02-14
    2
  • 蜉蝣
    老师,对于 io graphs 而言,我还是不明白什么时候需要选择 SAM period 的值,选择多少更合适

    作者回复: 您好,这个问题倒不复杂,SMA period选项也没几个,你可以都试一下,看看出来的图是否比较“细腻”。一般来说,SMA period数值越小,出来的图的粒度越细腻;数值越大,粒度越粗,越会损失一些细节。 相对来说,建议选择小一些的SMA period值。

    2022-08-29归属地:上海
    1
  • 李二木
    TCP 拥塞控制主要有四个重要阶段: - 慢启动 慢启动是指 TCP 传输的开始阶段是从一个相对低的速度开始的。在这个阶段,每次 TCP 收到一个确认了数据的 ACK,拥塞窗口就增加一个 MSS。如果到达慢启动阈值塞窗口的增长速度立刻就放缓了,变成了每过一个 RTT,拥塞窗口就只增长一个 MS - 拥塞避免 传输过了慢启动阈值(ssthresh)之后,进入拥塞避免阶段。这个阶段的特征是“和性增长乘性降低”( Addictive increase/mutiplicative decrease),简单理解就是增长很慢。 每一个 RTT里,拥塞窗口只增长一个 MSS,这个阶段的拥塞窗口的增长是线性的。如果探测到拥塞,拥塞窗口就要往下降。这个下降是直接减半的,所以叫乘性降低 - 快速重传 TCP 每发送一个报文,就启动一个超时计时器。如果在限定时间内没收到这个报文的确认,那么发送方就会认为,这个报文已经在网络上丢失了,于是需要重传这个报文,这种形式叫做超时重传,而快速重传是一旦发送方收到 3 次重复确认(加上第一次确认就一共是 4 次),就不用等超时计时器了,直接重传这个报文 - 快速恢复 跟之前的“慢启动 -> 拥塞避免 -> 慢启动 -> 拥塞避免”这种做法不同,在遇到拥塞点之后,通过快速重传,就不再进入慢启动,而是从这个减半的拥塞窗口开始,保持跟拥塞避免一样的线性增长,直到遇到下一个拥塞点。

    作者回复: 很好的笔记和打卡,加油:)

    2022-02-18
    1
  • 上杉夏香
    三刷笔记: * 为什么TCP要有拥塞机制? 是让每条TCP连接拥有敬畏之心。展开来说,每条TCP连接都需要拥塞控制,如果每条TCP连接都放飞自我、敞开了的发送数据,网络带宽肯定经受不住,最后的结局就是谁都无法发送数据。 那好,我们约定好,TCP建立一套探测网络线路是否快要达到上限的机制。若探测到,那我们就自动减缓速度。如此一来,不仅让网络整体可用,也能确保自己的传输速度和稳定性。这就是TCP的拥塞控制。 * 拥塞机制是什么样的? 每条TCP连接设立发送数据速度的红线,探测到红线,就立马减缓速度。 探测到红线的标志是发生丢包。 * 是什么让拥塞机制变得复杂的呢? 一句话回答:网络是动态变化的。 之前达到红线的发送速度此时已经不怎么丢包之类的,所以拥塞机制中的红线是不断变化的,而每条TCP连接都是需要不断探测的。 * 一脉相承之更好的利用现代网络 什么叫做更好的利用现代网络呢?其实没什么可玄乎的,就是现代的网络传播速度比以前好太多了。所以TCP也进化了,具体表现在哪里? 我们可以这么来理解和记忆,决定发送端发送速度的因素有两个:1、对方的接收窗口;2、自己的拥塞窗口 1、接受窗口 TCP协议本身有一个2字节的Window字段,表示能够接收的数据大小,最大为2^32-1=65535字节。为了更好的利用现代网络,有了TCP Option的Window Scale,得了,一下子就把接受窗口的上限拉高了太多 2、拥塞窗口 一般来说,发送阶段分为慢启动、拥塞避免、快速重传、快速恢复等阶段。其中慢启动阶段,由Linux最初的版本决定,初始拥塞窗口2-4MSS。那么为了更好的利用现代网络,初始拥塞窗口一下子调整为10MSS。 发送能力的提高一目了然,也就有了更快的慢启动! * 什么是拥塞点,或者说什么叫做碰到了拥塞点? 其实就是丢包。丢包就代表碰到了拥塞点! * 什么是快速重传? 为了优化超时重传机制中每次都得等特定时间才能确定某个包丢失。快速重传的本质是接收方告知发送方,某个包应该是丢失了,你不用等倒计时了,直接发给我吧~ * 快速恢复 一句话总结: 普通的拥塞策略:慢启动->拥塞避免->碰到拥塞点->慢启动->拥塞避免->碰到拥塞点,碰到拥塞点之后,从头开始。 如果拥塞点之后,是通过快速重传发送丢失的包,那就不必重新从慢启动开始。而是直接将拥塞窗口设置为拥塞点的一半,直接进入拥塞避免阶段。
    2022-11-14归属地:北京
    5
  • 原则
    老师,有几个问题: 1. 这里到了慢启动阈值应该不是增长一个 MSS 吧,而是当前 MSS +1,和慢启动过程有点混淆了。 2. 间隔确认不是 RFC 中定义的吧 3. 快速恢复怎么感觉不太快,如果使用慢启动的方式翻倍增长是不是更快。
    2023-06-05归属地:广东
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部