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

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

3天内不再提示

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

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

下面看一个特别重要的框架,也可以称为是拥塞控制引擎,如下结构体所示, tcp_congestion_ops描述了一套拥塞控制算法所需要支持的操作 。这个框架定义了一些钩子函数,Linux内核中不同的拥塞控制算法根据算法思想实现以下钩子函数,然后进行注册即可完成拥塞控制算法的设计。

struct tcp_congestion_ops {
 struct list_head list;
 u32 key;
 u32 flags;

 /* initialize private data (optional) */
 void (*init)(struct sock *sk);
 /* cleanup private data  (optional) */
 void (*release)(struct sock *sk);

 /* return slow start threshold (required) */
 u32 (*ssthresh)(struct sock *sk);
 /* do new cwnd calculation (required) */
 void (*cong_avoid)(struct sock *sk, u32 ack, u32 acked);
 /* call before changing ca_state (optional) */
 void (*set_state)(struct sock *sk, u8 new_state);
 /* call when cwnd event occurs (optional) */
 void (*cwnd_event)(struct sock *sk, enum tcp_ca_event ev);
 /* call when ack arrives (optional) */
 void (*in_ack_event)(struct sock *sk, u32 flags);
 /* new value of cwnd after loss (required) */
 u32  (*undo_cwnd)(struct sock *sk);
 /* hook for packet ack accounting (optional) */
 void (*pkts_acked)(struct sock *sk, const struct ack_sample *sample);
 /* suggest number of segments for each skb to transmit (optional) */
 u32 (*tso_segs_goal)(struct sock *sk);
 /* returns the multiplier used in tcp_sndbuf_expand (optional) */
 u32 (*sndbuf_expand)(struct sock *sk);
 /* call when packets are delivered to update cwnd and pacing rate,
  * after all the ca_state processing. (optional)
  */
 void (*cong_control)(struct sock *sk, const struct rate_sample *rs);
 /* get info for inet_diag (optional) */
 size_t (*get_info)(struct sock *sk, u32 ext, int *attr,
      union tcp_cc_info *info);

 char   name[TCP_CA_NAME_MAX];
 struct module  *owner;
};

用户可以通过自定义以上钩子函数实现定制拥塞控制算法,并进行注册。以下截取cubic拥塞控制算法对接口的实现、注册****的代码片段。 可以注意到cubic只实现了拥塞控制引擎tcp_congestion_ops的部分钩子函数,因为有一些钩子函数是必须实现,有一些是根据算法选择实现的。

static struct tcp_congestion_ops cubictcp __read_mostly = {
 .init  = bictcp_init,
 .ssthresh = bictcp_recalc_ssthresh,
 .cong_avoid = bictcp_cong_avoid,
 .set_state = bictcp_state,
 .undo_cwnd = tcp_reno_undo_cwnd,
 .cwnd_event = bictcp_cwnd_event,
 .pkts_acked     = bictcp_acked,
 .owner  = THIS_MODULE,
 .name  = "cubic",
};

static int __init cubictcp_register(void)
{
 BUILD_BUG_ON(sizeof(struct bictcp) > ICSK_CA_PRIV_SIZE);
 beta_scale = 8*(BICTCP_BETA_SCALE+beta) / 3
  / (BICTCP_BETA_SCALE - beta);

 cube_rtt_scale = (bic_scale * 10); /* 1024*c/rtt */

 cube_factor = 1ull < < (10+3*BICTCP_HZ); /* 2^40 */

 /* divide by bic_scale and by constant Srtt (100ms) */
 do_div(cube_factor, bic_scale * 10);

 return tcp_register_congestion_control(&cubictcp);
}

static void __exit cubictcp_unregister(void)
{
 tcp_unregister_congestion_control(&cubictcp);
}

module_init(cubictcp_register);
module_exit(cubictcp_unregister);

在Linux用户态可以 通过参数查看当前使用的拥塞控制算法、当前可支持的拥塞控制算法 。如下表所示是两个参数以及含义。

参数含义
net.ipv4.tcp_congestion_control当前运行的拥塞控制算法
net.ipv4.tcp_available_congestion_control当前可支持的拥塞控制算法

具体如下图所示,通过参数看到当前可支持的拥塞控制算法以及当前使用的拥塞控制算法。可以看到当前可支持的拥塞控制算法中包含bbr算法, bbr算法在内核版本4.9开始支持的

图片

如果留意的话,在本文开始时提到了很多传统的拥塞控制算法,那么在上面的命令中没有看到,其实有众多拥塞控制算法在Linux中没有进行安装,如下命令 查看Linux系统中所有已实现的拥塞控制算法模块

图片

如果想安装特定的拥塞控制算法可以通过modprobe命令对指定的拥塞控制算法进行安装,如下所示安装了Vegas拥塞控制算法,此时再查看当前系统中可以使用的拥塞控制算法,多了一个Vegas算法。

图片

除了可以动态查看当前Linux系统可用的拥塞控制算法、当前使用的拥塞控制算法外还可以动态切换拥塞控制算法。如下所示将默认的cubic拥塞控制算法切换为bbr拥塞控制算法。

图片

切换后验证如下,当前运行的拥塞控制算法由之前的cubic拥塞控制算法切换到了bbr拥塞控制算法。

图片

图片

至此本文关于Linux内核网络中拥塞控制的大概框架、原理介绍到这,文中有表达有误或者不准确的地方欢迎指正。关于具体的每个拥塞控制算法的实现,将在后续文章中呈现。

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

    关注

    3

    文章

    1309

    浏览量

    39850
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • 网络
    +关注

    关注

    14

    文章

    7251

    浏览量

    87445
收藏 人收藏

    评论

    相关推荐

    LINUX内核网络中的软中断KSOFTIRQD

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

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

    拥塞控制是在网络层和传输层进行的功能。在网络层,拥塞控制可以通过路由
    的头像 发表于 02-03 17:06 1022次阅读
    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 2187次阅读

    如何使用Linux内核实现USB驱动程序框架

    Linux内核提供了完整的USB驱动程序框架。USB总线采用树形结构,在一条总线上只能有唯一的主机设备。 Linux内核从主机和设备两个角度
    发表于 11-06 17:59 19次下载
    如何使用<b class='flag-5'>Linux</b><b class='flag-5'>内核实现</b>USB驱动程序<b class='flag-5'>框架</b>

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

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

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

    控制算法,有很大差别。本文从Linux内核源码中学习网络拥塞
    的头像 发表于 07-28 11:32 439次阅读
    <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内核网络拥塞控制算法实现框架(二)

    从上面的概念中可以得知,拥塞窗口可以间接反映网络的状况,进而去限制发送窗口的大小。拥塞窗口作为网络拥塞
    的头像 发表于 07-28 11:34 529次阅读
    <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>(二)