我們一直講了許多種網路擁塞演算法,這些一直都是理論上的演算法,到底在實際中視窗的調整是怎麼樣的呢?對於一個串連來說,如何知道當前的擁塞視窗值是多少呢?
在Linux下,使用核心模組tcpprobe,可以得到TCP串連的參數,但是麻煩的是,該模組需要核心kprobes的支援,如果不怕麻煩的話,當然可以嘗試下。我們希望的是能夠不需要通過這麼複雜的機制,就能夠得到核心中TCP串連的參數。在翻遍了proc目錄和核心的一些代碼後,終於找到了我想要的方法:getsockopt()函數調用。
該選項是Linux平台所專屬的,所以在很多書籍,包括《Unix網路編程》這種聖經級的書和Linux的man getsockopt手冊中,都沒有提到這個選項。
在核心的函數tcp_getsockopt的代碼中,可以看到這個選項TCP_INFO,返回了幾乎所有的參數,同時還有其他的許多參數可以得到一些其他的資訊。具體每個參數的含義可以參考核心中的注釋。
Code
1void read_cwnd(int tcp_socket)
2{
3 struct tcp_info info;
4 int length = sizeof(struct tcp_info);
5
6 if ( getsockopt( tcp_socket, SOL_TCP, TCP_INFO, (void *)&info, (socklen_t *)&length ) == 0 ) {
7 printf("%u %u %u %u %u %u %u %u %u %u %u %u\n",
8 info.tcpi_snd_cwnd,
9 info.tcpi_snd_ssthresh,
10 info.tcpi_rcv_ssthresh,
11 info.tcpi_rtt,
12 info.tcpi_rttvar,
13 info.tcpi_unacked,
14 info.tcpi_sacked,
15 info.tcpi_lost,
16 info.tcpi_retrans,
17 info.tcpi_fackets,
18 info.tcpi_ca_state,
19 info.tcpi_reordering
20 );
21 }
22}
有了這個選項後,我們就不再停留在各種擁塞演算法的理論層面上,就可以從實際中看到TCP的各種演算法的優劣,比較有趣的內容就產生了。