<-- 返回首页

Kernel 中的 BIC TCP 拥塞控制算法 (未完成)

在介绍具体算法之前,先了解一下 Linux 内核中调用具体拥塞控制算法的执行流程。

内核在每收到一个ack后,调用tcp_ack(),此函数位于net/ipv4/tcp_input.c, tcp_ack会调用 bictcp_acked 更新cnt和delayed_ack 消除delay包的影响, 然后调用 bictcp_cong_avoid 进行拥塞避免。

内核实现了拥塞控制模块的框架,使得开发者只需专注与具体的拥塞控制算法,然后将它注册到框架中即可。

首先看结构体inet_connection_sock,它包含了很多有关链接的信息,其中这两个成员与TCP拥塞控制有关。

struct inet_connection_sock {
	const struct tcp_congestion_ops *icsk_ca_ops;
	u32                       icsk_ca_priv[16];
}

icsk_ca_ops 包含了大量的处理拥塞控制算法的函数指针,icsk_ca_priv[16] 的作用是放置拥塞控制模块需要的变量。

有了这样的一个框架之后, 再来看 BICTCP 拥塞控制算法是如何被加入进去的。net/ipv4/tcp_bic.c

static void bictcp_init(struct sock *sk)
{
    struct bictcp *ca = inet_csk_ca(sk);//取得 sk 结构中的 icsk_ca_priv

    bictcp_reset(ca); //设定各个参数的初始值,并放在 icsk_ca_priv 中
    ca->loss_cwnd = 0;
}

inet_csk_ca 的实现参考inet_connection_sock.h文件。

static inline struct inet_connection_sock *inet_csk(const struct sock *sk)
{
    return (struct inet_connection_sock *)sk;
}
static inline void *inet_csk_ca(const struct sock *sk)
{
    return (void *)inet_csk(sk)->icsk_ca_priv;
}

经过以上操作,Linux 拥塞控制框架中注册完bictcp算法后,所需要的参数通过icsk_ca_priv获取。

后话: TCP 的拥塞控制似乎是一个热门的话题,最近在内核的邮件列表中又有人提出了新的拥塞控制算法。

参考链接


<-- 返回首页