tcp协议栈优化1-增加TCP初始拥塞窗口 ===》流氓的方式
生活随笔
收集整理的這篇文章主要介紹了
tcp协议栈优化1-增加TCP初始拥塞窗口 ===》流氓的方式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
看linux3.0 network代碼,發(fā)現(xiàn)TCP initcwd(初始擁塞窗口)默認已經(jīng)調(diào)為10,同時,TCP rcvwnd初始接收窗口也已調(diào)為10。
? ? ? ?tcp initcwd初始化函數(shù)---函數(shù)tcp_init_cwnd(),宏TCP_INIT_CWND
? ? ? ?tcp rcvwnd初始化函數(shù) ---函數(shù)tcp_select_initial_window(),宏TCP _DEFAULT_ I NIT_RCVWND
? ? ?(注:tcp允許發(fā)送包個數(shù)由 發(fā)送端擁塞窗口 和 接收端接收窗口 決 定, 接收 端通過tcp頭部window字段通知發(fā)送端接收窗口大小)
? ? ? ?linux為什么要調(diào)大tcp initcwnd,請參見http://lwn.net/Articles/427104/ 和 http://tools.ietf.org/html/draft-hkchu-tcpm-initcwnd-01;
? ? ?(注:wf和我在09年已經(jīng)進行了研究,并在線上業(yè)務(wù)中調(diào)大initcwnd,當(dāng)時覺得該參數(shù)適用場景不具普遍性;沒想到google能對其進行量化的研究,并推動IETF接受該調(diào)整,值得我們學(xué)習(xí))
? ? ? ? ?國內(nèi)外 互聯(lián)網(wǎng)公司(google/baidu/taobao等)已在合適業(yè)務(wù)中調(diào)大了TCP初始擁塞窗口,調(diào)大有2種方法:
? ? ? ?1. ip route方式, ip route?change default via <gateway> dev eth0?initcwnd?<iw>(記得2.6.32版本以上支持),該方式僅對通過該路由的TCP連接有效;
????2. sysctl參數(shù),自己在內(nèi)核中增加一個控制initcwnd的proc參數(shù),該方式對于所有tcp連接有效;(我們當(dāng)年采用了該方式)
? ? ?
? ? ? ? 適用場景 :短連接+發(fā)送數(shù)據(jù)量小(擁塞控制尚處于slowstart階段,傳輸就完 畢了)
? ? ? ? 效果 :我知道的幾個應(yīng)用效果為傳輸速度可以提高10%~20%;但有好處也有壞處,TCP重傳率會增加(初始擁塞窗口越大,重傳率越高)
? ? ? ? 代碼研究:
? ? ? ?我們將分析“tcp三次握手”過程中,客戶端和服務(wù)端 擁塞窗口(snd_cwnd)的變化 ;,。
? ? ? ? 客戶端:
? ? ? ? ? ? ? ? 創(chuàng)建soc ket - 函數(shù)tcp_v4_init_sock - snd_cwnd=2;
? ? ? ? ? ? ? ?發(fā)送syn - 函數(shù)tcp_v4_connect - snd_cwnd=2? 沒有變化;
? ? ? ? ? ? ? ?收到syn_ack發(fā)送ack - 函數(shù)tcp_rcv_synsent_state_process 調(diào)用 函數(shù)tcp_init_metrics 調(diào)用 snd_cwnd = tcp_init_cwnd(tp, dst);
? ? ? ? ? 服務(wù)端:
? ? ? ? ? ? ? ?linux tcp/ip協(xié)議棧中 服務(wù)端收到三次握手的最后一個ack,才會創(chuàng)建socket;
? ? ? ? ? ? ? ?收到ack - 函數(shù)tcp_create_openreq_child中創(chuàng)建socket,snd_cwnd=2 - 函數(shù)tcp_rcv_state_process,當(dāng)前socket狀態(tài)為TCP_SYN_RECV,調(diào)用 函數(shù)tcp_init_metrics 調(diào)用 snd_cwnd = tcp_init_cwnd(tp, dst);
? ? ? ?
? ?? ? ?注:函數(shù)tcp_init_metrics根據(jù)socket所在路由中設(shè)置的tcp參數(shù) 初始化 該socket;同時,該路由條目所在socket在關(guān)閉時,會通過函數(shù)tcp_update_metrics,更新路由中的tcp參數(shù)(sysctl_tcp_nometrics_save為是否更新的開關(guān));路由條目中所有的tcp參數(shù)在rtnetlink.h中定義,如RTAX_RTT/RTAX_REORDERING等。
? ? ? ?tcp initcwd初始化函數(shù)---函數(shù)tcp_init_cwnd(),宏TCP_INIT_CWND
? ? ? ?tcp rcvwnd初始化函數(shù) ---函數(shù)tcp_select_initial_window(),宏TCP _DEFAULT_ I NIT_RCVWND
? ? ?(注:tcp允許發(fā)送包個數(shù)由 發(fā)送端擁塞窗口 和 接收端接收窗口 決 定, 接收 端通過tcp頭部window字段通知發(fā)送端接收窗口大小)
? ? ? ?linux為什么要調(diào)大tcp initcwnd,請參見http://lwn.net/Articles/427104/ 和 http://tools.ietf.org/html/draft-hkchu-tcpm-initcwnd-01;
? ? ?(注:wf和我在09年已經(jīng)進行了研究,并在線上業(yè)務(wù)中調(diào)大initcwnd,當(dāng)時覺得該參數(shù)適用場景不具普遍性;沒想到google能對其進行量化的研究,并推動IETF接受該調(diào)整,值得我們學(xué)習(xí))
? ? ? ? ?國內(nèi)外 互聯(lián)網(wǎng)公司(google/baidu/taobao等)已在合適業(yè)務(wù)中調(diào)大了TCP初始擁塞窗口,調(diào)大有2種方法:
? ? ? ?1. ip route方式, ip route?change default via <gateway> dev eth0?initcwnd?<iw>(記得2.6.32版本以上支持),該方式僅對通過該路由的TCP連接有效;
????2. sysctl參數(shù),自己在內(nèi)核中增加一個控制initcwnd的proc參數(shù),該方式對于所有tcp連接有效;(我們當(dāng)年采用了該方式)
? ? ?
? ? ? ? 適用場景 :短連接+發(fā)送數(shù)據(jù)量小(擁塞控制尚處于slowstart階段,傳輸就完 畢了)
? ? ? ? 效果 :我知道的幾個應(yīng)用效果為傳輸速度可以提高10%~20%;但有好處也有壞處,TCP重傳率會增加(初始擁塞窗口越大,重傳率越高)
? ? ? ? 代碼研究:
? ? ? ?我們將分析“tcp三次握手”過程中,客戶端和服務(wù)端 擁塞窗口(snd_cwnd)的變化 ;,。
? ? ? ? 客戶端:
? ? ? ? ? ? ? ? 創(chuàng)建soc ket - 函數(shù)tcp_v4_init_sock - snd_cwnd=2;
? ? ? ? ? ? ? ?發(fā)送syn - 函數(shù)tcp_v4_connect - snd_cwnd=2? 沒有變化;
? ? ? ? ? ? ? ?收到syn_ack發(fā)送ack - 函數(shù)tcp_rcv_synsent_state_process 調(diào)用 函數(shù)tcp_init_metrics 調(diào)用 snd_cwnd = tcp_init_cwnd(tp, dst);
? ? ? ? ? 服務(wù)端:
? ? ? ? ? ? ? ?linux tcp/ip協(xié)議棧中 服務(wù)端收到三次握手的最后一個ack,才會創(chuàng)建socket;
? ? ? ? ? ? ? ?收到ack - 函數(shù)tcp_create_openreq_child中創(chuàng)建socket,snd_cwnd=2 - 函數(shù)tcp_rcv_state_process,當(dāng)前socket狀態(tài)為TCP_SYN_RECV,調(diào)用 函數(shù)tcp_init_metrics 調(diào)用 snd_cwnd = tcp_init_cwnd(tp, dst);
? ? ? ?
? ?? ? ?注:函數(shù)tcp_init_metrics根據(jù)socket所在路由中設(shè)置的tcp參數(shù) 初始化 該socket;同時,該路由條目所在socket在關(guān)閉時,會通過函數(shù)tcp_update_metrics,更新路由中的tcp參數(shù)(sysctl_tcp_nometrics_save為是否更新的開關(guān));路由條目中所有的tcp參數(shù)在rtnetlink.h中定義,如RTAX_RTT/RTAX_REORDERING等。
總結(jié)
以上是生活随笔為你收集整理的tcp协议栈优化1-增加TCP初始拥塞窗口 ===》流氓的方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷P3369 【模板】普通平衡树 红黑
- 下一篇: 不定时更新-JAVA干货博客