0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux內(nèi)核網(wǎng)絡(luò)擁塞控制算法的實(shí)現(xiàn)框架(三)

麥辣雞腿堡 ? 來(lái)源:技術(shù)簡(jiǎn)說(shuō) ? 作者:董旭 ? 2023-07-28 11:38 ? 次閱讀

下面看一個(gè)特別重要的框架,也可以稱(chēng)為是擁塞控制引擎,如下結(jié)構(gòu)體所示, tcp_congestion_ops描述了一套擁塞控制算法所需要支持的操作 。這個(gè)框架定義了一些鉤子函數(shù),Linux內(nèi)核中不同的擁塞控制算法根據(jù)算法思想實(shí)現(xiàn)以下鉤子函數(shù),然后進(jìn)行注冊(cè)即可完成擁塞控制算法的設(shè)計(jì)。

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;
};

用戶(hù)可以通過(guò)自定義以上鉤子函數(shù)實(shí)現(xiàn)定制擁塞控制算法,并進(jìn)行注冊(cè)。以下截取cubic擁塞控制算法對(duì)接口的實(shí)現(xiàn)、注冊(cè)****的代碼片段。 可以注意到cubic只實(shí)現(xiàn)了擁塞控制引擎tcp_congestion_ops的部分鉤子函數(shù),因?yàn)橛幸恍┿^子函數(shù)是必須實(shí)現(xiàn),有一些是根據(jù)算法選擇實(shí)現(xiàn)的。

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用戶(hù)態(tài)可以 通過(guò)參數(shù)查看當(dāng)前使用的擁塞控制算法、當(dāng)前可支持的擁塞控制算法 。如下表所示是兩個(gè)參數(shù)以及含義。

參數(shù)含義
net.ipv4.tcp_congestion_control當(dāng)前運(yùn)行的擁塞控制算法
net.ipv4.tcp_available_congestion_control當(dāng)前可支持的擁塞控制算法

具體如下圖所示,通過(guò)參數(shù)看到當(dāng)前可支持的擁塞控制算法以及當(dāng)前使用的擁塞控制算法。可以看到當(dāng)前可支持的擁塞控制算法中包含bbr算法, bbr算法在內(nèi)核版本4.9開(kāi)始支持的。

圖片

如果留意的話,在本文開(kāi)始時(shí)提到了很多傳統(tǒng)的擁塞控制算法,那么在上面的命令中沒(méi)有看到,其實(shí)有眾多擁塞控制算法在Linux中沒(méi)有進(jìn)行安裝,如下命令 查看Linux系統(tǒng)中所有已實(shí)現(xiàn)的擁塞控制算法模塊

圖片

如果想安裝特定的擁塞控制算法可以通過(guò)modprobe命令對(duì)指定的擁塞控制算法進(jìn)行安裝,如下所示安裝了Vegas擁塞控制算法,此時(shí)再查看當(dāng)前系統(tǒng)中可以使用的擁塞控制算法,多了一個(gè)Vegas算法。

圖片

除了可以動(dòng)態(tài)查看當(dāng)前Linux系統(tǒng)可用的擁塞控制算法、當(dāng)前使用的擁塞控制算法外還可以動(dòng)態(tài)切換擁塞控制算法。如下所示將默認(rèn)的cubic擁塞控制算法切換為bbr擁塞控制算法。

圖片

切換后驗(yàn)證如下,當(dāng)前運(yùn)行的擁塞控制算法由之前的cubic擁塞控制算法切換到了bbr擁塞控制算法。

圖片

圖片

至此本文關(guān)于Linux內(nèi)核網(wǎng)絡(luò)中擁塞控制的大概框架、原理介紹到這,文中有表達(dá)有誤或者不準(zhǔn)確的地方歡迎指正。關(guān)于具體的每個(gè)擁塞控制算法的實(shí)現(xiàn),將在后續(xù)文章中呈現(xiàn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1360

    瀏覽量

    40185
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208720
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7485

    瀏覽量

    88541
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TCP協(xié)議技術(shù)之擁塞控制算法

    擁塞控制是在網(wǎng)絡(luò)層和傳輸層進(jìn)行的功能。在網(wǎng)絡(luò)層,擁塞控制可以通過(guò)路由
    的頭像 發(fā)表于 02-03 17:06 ?1899次閱讀
    TCP協(xié)議技術(shù)之<b class='flag-5'>擁塞</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>

    Linux內(nèi)核網(wǎng)絡(luò)的TCP傳輸控制塊相關(guān)資料分享

    1、Linux內(nèi)核網(wǎng)絡(luò)之傳輸層接收消息簡(jiǎn)析在傳輸層發(fā)送消息時(shí),TCP發(fā)送出去消息后,會(huì)跟蹤這些數(shù)據(jù)包,直到得到對(duì)方的確認(rèn)為止。對(duì)于接收方來(lái)講,當(dāng)收到一個(gè)報(bào)文段時(shí),其會(huì)根據(jù)情況把這些數(shù)據(jù)包添加到接收
    發(fā)表于 06-21 16:53

    Linux內(nèi)核網(wǎng)絡(luò)網(wǎng)絡(luò)層發(fā)送消息之IP分片簡(jiǎn)析

    1、Linux內(nèi)核網(wǎng)絡(luò)網(wǎng)絡(luò)層發(fā)送消息之IP分片簡(jiǎn)析本文分析下ip的分片。行 IP 分片。IP分片通常發(fā)生在網(wǎng)絡(luò)環(huán)境中,比如1個(gè)B環(huán)境中的MTU為500B,若的數(shù)據(jù)長(zhǎng)度超過(guò)
    發(fā)表于 07-20 15:34

    基于衛(wèi)星網(wǎng)絡(luò)的TCP擁塞控制算法

    分析衛(wèi)星網(wǎng)絡(luò)的特點(diǎn)和現(xiàn)有慢啟動(dòng)算法的不足,提出一種使擁塞窗口平滑增長(zhǎng)的慢啟動(dòng)算法。引入門(mén)限因子和粒度因子實(shí)現(xiàn)
    發(fā)表于 03-20 13:54 ?18次下載

    Linux中傳輸控制協(xié)議的擁塞控制分析

    TCP(transport control protocol)的性能在很大程度上取決于其所使用的擁塞控制算法。傳統(tǒng)的TCP在實(shí)現(xiàn)多種擁塞
    發(fā)表于 06-17 07:43 ?21次下載

    高速網(wǎng)絡(luò)中TCP擁塞控制算法的研究

    針對(duì)TCP 在高速網(wǎng)絡(luò)中的缺陷,提出了改進(jìn)的BIC TCP 擁塞控制算法。優(yōu)化算法通過(guò)監(jiān)控鏈路緩存的變化,調(diào)整探索可用帶寬過(guò)程中的
    發(fā)表于 09-17 10:18 ?15次下載

    嵌入式LINUX內(nèi)核網(wǎng)絡(luò)棧(源代碼)

    本文選擇 LINUX-1.2.13 內(nèi)核所包含的網(wǎng)絡(luò)部分代碼分析(注意網(wǎng)絡(luò)部分代碼與內(nèi)核代碼的演變是分離的,如
    發(fā)表于 05-12 10:39 ?57次下載
    嵌入式<b class='flag-5'>LINUX</b><b class='flag-5'>內(nèi)核網(wǎng)絡(luò)</b>棧(源代碼)

    基于模糊控制和壓縮感知的無(wú)線傳感網(wǎng)絡(luò)擁塞算法

    針對(duì)無(wú)線傳感網(wǎng)絡(luò)(WSN)的擁塞問(wèn)題,提出了一種將模糊控制和壓縮感知(cs)技術(shù)相結(jié)合來(lái)緩解無(wú)線傳感網(wǎng)絡(luò)擁塞
    發(fā)表于 01-03 09:59 ?0次下載
    基于模糊<b class='flag-5'>控制</b>和壓縮感知的無(wú)線傳感<b class='flag-5'>網(wǎng)絡(luò)</b><b class='flag-5'>擁塞</b><b class='flag-5'>算法</b>

    具有預(yù)測(cè)與自我調(diào)節(jié)能力的擁塞控制算法

    隨著網(wǎng)絡(luò)技術(shù)的日益發(fā)展,計(jì)算機(jī)網(wǎng)絡(luò)擁塞問(wèn)題已極大地影響了用戶(hù)的使用體驗(yàn)與數(shù)據(jù)傳遞。單一地提高硬件設(shè)備的投入并不能持續(xù)地防止網(wǎng)絡(luò)擁塞。因此
    發(fā)表于 01-18 16:18 ?0次下載
    具有預(yù)測(cè)與自我調(diào)節(jié)能力的<b class='flag-5'>擁塞</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>

    防止網(wǎng)絡(luò)擁塞現(xiàn)象的TCP擁塞控制算法

    ,近些年又出現(xiàn)了選擇性應(yīng)答(selectiveacknowledgement,SACK)算法,還有其他方面的大大小小的改進(jìn),成為網(wǎng)絡(luò)研究的一個(gè)熱點(diǎn)。 TCP的擁塞控制主要原理依賴(lài)于一個(gè)
    的頭像 發(fā)表于 10-29 14:54 ?2416次閱讀

    如何使用Linux內(nèi)核實(shí)現(xiàn)USB驅(qū)動(dòng)程序框架

    Linux內(nèi)核提供了完整的USB驅(qū)動(dòng)程序框架。USB總線采用樹(shù)形結(jié)構(gòu),在一條總線上只能有唯一的主機(jī)設(shè)備。 Linux內(nèi)核從主機(jī)和設(shè)備兩個(gè)角度
    發(fā)表于 11-06 17:59 ?20次下載
    如何使用<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核實(shí)現(xiàn)</b>USB驅(qū)動(dòng)程序<b class='flag-5'>框架</b>

    如何用eBPF寫(xiě)TCP擁塞控制算法?

    是兩個(gè)痛點(diǎn): 內(nèi)核越來(lái)越策略化。 內(nèi)核接口不穩(wěn)定。 分別簡(jiǎn)單說(shuō)一下。 所謂內(nèi)核策略化就是說(shuō)越來(lái)越多的?靈巧的算法?,?小tricks?等靈活多變的代碼進(jìn)入
    的頭像 發(fā)表于 12-26 09:44 ?1642次閱讀

    Linux內(nèi)核配置的網(wǎng)絡(luò)資料說(shuō)明

    Linux不止在上網(wǎng)時(shí)候才會(huì)用到網(wǎng)絡(luò)功能’一些程序在單機(jī)時(shí)候也會(huì)需要內(nèi)核網(wǎng)絡(luò)支持。 X server是個(gè)典型的例子。如果你是從一個(gè)老內(nèi)核
    發(fā)表于 03-12 10:33 ?14次下載

    Linux內(nèi)核網(wǎng)絡(luò)擁塞控制算法的具體實(shí)現(xiàn)框架(一)

    控制算法,有很大差別。本文從Linux內(nèi)核源碼中學(xué)習(xí)網(wǎng)絡(luò)擁塞
    的頭像 發(fā)表于 07-28 11:32 ?683次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核網(wǎng)絡(luò)</b><b class='flag-5'>擁塞</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>的具體<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>框架</b>(一)

    Linux內(nèi)核網(wǎng)絡(luò)擁塞控制算法實(shí)現(xiàn)框架(二)

    從上面的概念中可以得知,擁塞窗口可以間接反映網(wǎng)絡(luò)的狀況,進(jìn)而去限制發(fā)送窗口的大小。擁塞窗口作為網(wǎng)絡(luò)擁塞
    的頭像 發(fā)表于 07-28 11:34 ?775次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核網(wǎng)絡(luò)</b><b class='flag-5'>擁塞</b><b class='flag-5'>控制</b><b class='flag-5'>算法</b>的<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>框架</b>(二)