核心中擁塞視窗初始值對http效能的影響分析

2021-08-30 18:21:40 字數 2285 閱讀 8576

這個是google的人提出的概念,那就是對tcp的擁塞視窗的初始值進行增大可以顯著的提高http的效能,這個主要是針對tcp的slow start(我前面的blog有介紹)的.

*****:

ppt:

先來看什麼叫做擁塞視窗:

擁塞視窗也就是tcp的傳送端所估計的如果沒有包的丟失(發生擁塞)時的視窗的大小,他主要是用於tcp的擁塞控制演算法,以及傳送滑動視窗。

當前核心預設實現是擁塞視窗預設為2個段(也就是兩個mss的大小),也就是slow start開始的初始視窗大小只是2個段,這裡google 的*****通過一些資料來正明最合適的大小為10(也就是15k),不過這裡我認為這裡的初始段的大小還是應該根據自己**的平均頁面大小來進行設定。

當前的的http,大部分都是短鏈結,因此很多情況下slow start還沒有結束(進入擁塞避免狀態),可是連線已經斷開了,並且根據google的*****,網頁的平均大小是300多k,而每次都是slow start,這個時候其實slow start會導致效能的下降,所以說這種情況下,我們其實可以加速slow start,而在核心中我們就可以通過設定initcwnd來進行控制。由於擁塞視窗的擴大,slow start將不會起作用,因為就算傳送的資料報沒有ack,可是由於我們的擁塞視窗本身就比較大,因此還是能夠傳送比較多的資料而不需要等待ack到來之後來增大擁塞視窗.

更具體的就要去看我上面給出的ppt和*****了。

接下來我們來看原始碼如何實現的。

首先要知道initcwnd必須通過iproute來設定,而且版本必須大於等於 2.6.34。

通過ip route的原始碼我們能夠看到它是通過netlink 與核心進行通訊,從而達到修改這個值,而對應的陣列位置就是rtax_initcwnd。

這裡ip route的原始碼就不詳細分析了,主要我們來看核心的**。

我們要知道dst_entry這個結構,這個結構我們不詳細的分析,他有乙個很重要的域我們這裡會用到,就是metrics,這個域是乙個陣列,主要是儲存了很多和對端通訊時所需要的數值,比如initcwnd,比如max_mtu等等。這裡我們只需要關注initcwnd.

下面就是它所儲存的數值型別:

enum ;

可以看到我們如果需要取得某個值的話,只需要從陣列裡面取得對應位置的數值就可以了。

下面就是讀取方法:

dst_entry

static inline u32

dst_metric(const struct dst_entry *dst, int metric)

擁塞視窗的初始化是在當tcp連線建立之後進行的,我們來看相關**,這裡是當狀態處於tcp_syn_recv,然後接收到ack之後,進行初始化擁塞視窗。

if (th->ack)

然後就是最重要的乙個函式,初始化snd_cwnd,這個函式主要就是呼叫dst_metric得到對應的initcwnd的值(如果dst存在),然後選擇snd_cwnd_clamp與cwnd的最小值,這裡snd_cwnd_clamp表示snd_cwnd的最大值,因此我們設定的值不能大於這個值。

__u32 tcp_init_cwnd(struct tcp_sock *tp, struct dst_entry *dst)

//返回兩個之間的相對較小的值。

return min_t(__u32, cwnd, tp->snd_cwnd_clamp);

}

一開始我們就知道ip route initcwnd設定的就是 rtax_initcwnd對應的值,因此這裡就改變了擁塞視窗的值。

ok,然後我們來看擁塞視窗變大後,核心傳送資料段時如何被影響。

核心4層傳送資料是通過tcp_write_xmit函式進行的,我們來看這個的**片斷,這個函式的詳細分析我前面的blog 有分析,有需要的可以看我前面的blog。

下面就是我們最關心的**片斷。

while ((skb = tcp_send_head(sk)))

通過上面的**我們可以看到如果cwnd也就是擁塞預設視窗變大之後,則我們每次可以多傳送一些資料段。

這裡要注意的是就算initcwnd增大,slow start也是不可避免的,只不過現在擁塞視窗變大導致傳送的時候能夠多傳送資料段。而也只有當傳送的都ack之後擁塞視窗才會變大,而有可能等不到全部的ack,連線已經斷開。

在2.6.33之後還多出來了乙個rtax_initrwnd,這個值主要是針對預設的接收視窗進行設定。

TCP擁塞控制慢開始演算法擁塞視窗的初始值

問題 擁塞控制慢開始演算法擁塞視窗的初始值是多少?根據rfc文件 iw,the initial value of cwnd,must be set using the following guidelines as an upper bound.if smss 2190 bytes iw 2 sms...

TCP通訊核心引數調優 擁塞視窗

tcp是乙個端到端 peer to peer 的傳輸層協議,處於應用層和網路層之間。在資料傳輸之前,由tcp模組在執行於不同主機上的兩個應用程式之間建立直接連線,通常稱為虛擬連線,其後的tcp報文在此連線的基礎上進行傳輸。tcp協議在ip協議提供的服務基礎上,提供面向連線的 可靠的 全雙工的資料流傳...

滑動視窗與擁塞視窗

滑動視窗協議是傳輸層進行流控的一種措施,接收方通過通告傳送方自己的視窗大小,從而控制傳送方的傳送速度,從而達到防止傳送方傳送速度過快而導致自己被淹沒的目的。對ack的再認識,ack通常被理解為收到資料後給出的乙個確認。事實上該確認是指接收端已經收到確認楨以前的所有的楨。舉個例子,假如接收端收到 1 ...