0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux内核网络拥塞控制算法的具体实现框架(一)

麦辣鸡腿堡 来源:技术简说 作者:董旭 2023-07-28 11:32 次阅读

谈起网络拥塞控制,大家可能很熟悉八股文中的“加法增大“、”乘法减小“、”慢开始“、“拥塞避免”、“快重传”、“快恢复”等概念。没错,这是一种经典网络拥塞控制算法的基础理论,但在实际的实现时不同的拥塞控制算法,有很大差别。本文从Linux内核源码中学习网络拥塞控制算法的具体实现框架。从当前网络拥塞控制算法的发展历程上看,网络拥塞控制算法的类型主要有以下四种:

基于丢包的拥塞控制算法,这类算法将丢包视为发生了网络拥塞。采取缓慢的探测方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减少,代表的算法有Tahoe、Reno、NewReno、BIC、Cubic等。

基于延时的拥塞控制算法,这类算法将延时增大视为发生了网络拥塞,延时增大时减少拥塞窗口,延时减少时增大拥塞窗口,代表的算法有Vegas、Westwood等。

基于链路容量的拥塞控制算法,代表算法是BBR,其采用了另类的方式,不再使用丢包、延时等信号去衡量拥塞是否发生,而是直接对网络建模来避免以及应对真实的网络拥塞。

基于学习的拥塞控制算法,这类算法也没有特定的拥塞信号,一般是基于训练数据、评价函数,通过机器学习生成网络拥塞控制策略模型,代表算法有Remy、PCC、Aurora、DRL-CC、Orca等。

由于每类拥塞控制算法的核心理念有很大差别,关于每种算法的实现与原理在后续的文章中进行呈现。

本次文章先对Linux内核中网络拥塞控制实现细节、大致框架,进行分析和大概学习。在进行正式的分析前先简单梳理一下常识与概念:

什么是网络拥塞:网络拥塞是指在网络中传输的数据量超过网络链路或节点的处理能力,导致网络延迟增加、丢包率升高和带宽利用率下降的现象。

窗口(Window):如下图的TCP协议头中占据16位,用于接收端告诉发送端还有多少缓冲区可以接收数据。

图片

滑动窗口、发送窗口:下图所示黑色方框代表发送窗口。滑动窗口只是一种形象的称呼,即发送窗口一直移动从而达到发送新的数据的目的,如下图当接收到接收端发来的ACK数据包后发送窗口向右移动。图中灰色的方框代表已经发送且确认的数据,红色代表已发送且刚刚确认的数据,正是因为刚刚确认了5byte的数据,才驱动发送窗口可以向右移动5个单位,使得序号52~56的数据(绿色方框,代表允许发送的待发送数据)可以发送,当37 ~51区间的数据(蓝色方框,代表发送但未确认的数据包)能够被确认时,发送窗口才能向右滑动。发送窗口前方的数据(黄色方框,不允许发送的待发送数据)只能等待发送窗窗口区间内才能发送。TCP的滑动窗口是动态的,我们可以想象成小学常见的一个数学题,一个水池,体积V,每小时进水量V1,出水量V2。当水池满了就不允许再注入了,如果有个液压系统控制水池大小,那么就可以控制水的注入速率和量。这样的水池就类似TCP的窗口。应用根据自身的处理能力变化,通过本端TCP接收窗口大小控制来对对对端的发送窗口流量限制。图片

拥塞窗口:上面介绍了发送窗口的概念,在TCP协议中有一个反映网络传输能力的变量,叫做拥塞窗口(congestion
window),记作cwnd。发送端实际的发送窗口大小实际是为 接收端通告窗口 rwnd 与 拥塞窗口 cwnd 较小的那个值。

W=min(cwnd,rwnd)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39850
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • 网络
    +关注

    关注

    14

    文章

    7251

    浏览量

    87444
收藏 人收藏

    评论

    相关推荐

    LINUX内核网络中的软中断KSOFTIRQD

    之前分享过Linux内核网络数据包的接收过程,当执行到网卡通过硬件中断(IRQ)通知CPU,告诉它有数据来了,CPU会根据中断表,调用已经注册的中断函数,这个中断函数会调到驱动程序(NIC
    发表于 12-15 11:44 1229次阅读

    TCP协议技术之拥塞控制算法

    拥塞控制是在网络层和传输层进行的功能。在网络层,拥塞控制可以通过路由
    的头像 发表于 02-03 17:06 1021次阅读
    TCP协议技术之<b class='flag-5'>拥塞</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>

    有没有Linux资料分享

    )Linux设备驱动开发详解:基于最新的Linux 4.0内核.part2.rar (20 MB )精通Linux内核网络.(以)罗森著.
    发表于 06-09 04:35

    Linux内核网络的TCP传输控制块相关资料分享

    1、Linux内核网络之传输层接收消息简析在传输层发送消息时,TCP发送出去消息后,会跟踪这些数据包,直到得到对方的确认为止。对于接收方来讲,当收到个报文段时,其会根据情况把这些数据包添加到接收
    发表于 06-21 16:53

    Linux内核网络网络层发送消息之IP分片简析

    1、Linux内核网络网络层发送消息之IP分片简析本文分析下ip的分片。行 IP 分片。IP分片通常发生在网络环境中,比如1个B环境中的MTU为500B,若的数据长度超过
    发表于 07-20 15:34

    基于卫星网络的TCP拥塞控制算法

    分析卫星网络的特点和现有慢启动算法的不足,提出一种使拥塞窗口平滑增长的慢启动算法。引入门限因子和粒度因子实现
    发表于 03-20 13:54 18次下载

    Linux中传输控制协议的拥塞控制分析

    TCP(transport control protocol)的性能在很大程度上取决于其所使用的拥塞控制算法。传统的TCP在实现多种拥塞
    发表于 06-17 07:43 21次下载

    高速网络中TCP拥塞控制算法的研究

    针对TCP 在高速网络中的缺陷,提出了改进的BIC TCP 拥塞控制算法。优化算法通过监控链路缓存的变化,调整探索可用带宽过程中的
    发表于 09-17 10:18 15次下载

    嵌入式LINUX内核网络栈(源代码)

    本文选择 LINUX-1.2.13 内核所包含的网络部分代码分析(注意网络部分代码与内核代码的演变是分离的,如
    发表于 05-12 10:39 57次下载
    嵌入式<b class='flag-5'>LINUX</b><b class='flag-5'>内核网络</b>栈(源代码)

    基于模糊控制和压缩感知的无线传感网络拥塞算法

    针对无线传感网络(WSN)的拥塞问题,提出了一种将模糊控制和压缩感知(cs)技术相结合来缓解无线传感网络拥塞
    发表于 01-03 09:59 0次下载
    基于模糊<b class='flag-5'>控制</b>和压缩感知的无线传感<b class='flag-5'>网络</b><b class='flag-5'>拥塞</b><b class='flag-5'>算法</b>

    防止网络拥塞现象的TCP拥塞控制算法

    ,近些年又出现了选择性应答(selectiveacknowledgement,SACK)算法,还有其他方面的大大小小的改进,成为网络研究的一个热点。 TCP的拥塞控制主要原理依赖于一个
    的头像 发表于 10-29 14:54 2186次阅读

    Linux内核配置的网络资料说明

    Linux不止在上网时候才会用到网络功能’一些程序在单机时候也会需要内核网络支持。 X server是个典型的例子。如果你是从一个老内核
    发表于 03-12 10:33 14次下载

    Linux内核网络拥塞控制算法实现框架(二)

    从上面的概念中可以得知,拥塞窗口可以间接反映网络的状况,进而去限制发送窗口的大小。拥塞窗口作为网络拥塞
    的头像 发表于 07-28 11:34 528次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核网络</b><b class='flag-5'>拥塞</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>的<b class='flag-5'>实现</b><b class='flag-5'>框架</b>(二)

    Linux内核网络拥塞控制算法实现框架(三)

    下面看一个特别重要的框架,也可以称为是拥塞控制引擎,如下结构体所示, tcp_congestion_ops描述了一套拥塞控制
    的头像 发表于 07-28 11:38 635次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核网络</b><b class='flag-5'>拥塞</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>的<b class='flag-5'>实现</b><b class='flag-5'>框架</b>(三)

    Linux内核如何使用结构体和函数指针?

    我将结合具体Linux内核驱动框架代码来展示Linux内核如何使用结构体和函数指针。
    的头像 发表于 09-06 14:17 569次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>如何使用结构体和函数指针?