網路擁塞控制(八) 外傳之如何測量TCP的擁塞視窗

來源:互聯網
上載者:User

我們一直講了許多種網路擁塞演算法,這些一直都是理論上的演算法,到底在實際中視窗的調整是怎麼樣的呢?對於一個串連來說,如何知道當前的擁塞視窗值是多少呢?

在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的各種演算法的優劣,比較有趣的內容就產生了。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.