2016-04-04 22 views
0

TCP重傳如何? 哪個公式由多少個數據包重新發送決定? 我明白它設置在立方tcp的某個地方,但在哪裏?TCP重發:多少包將被重發?

對它在Linux中的工作原理感興趣。我使用Debian 8,只是看轉儲。我建立了一個使用netcat連接到27000端口的連接。我通常在服務器上做iptables,讓所有數據包在端口27000上發送併發送一個數據包(並查看包被重新發送了多少次)。

+0

這是一個非常* *寬的問題(見我的答案)。 **您可能希望更具體。**您的問題可能被標記爲「太寬泛」或無關主題(因爲不直接與編程有關),並且被擱置。 – jbm

回答

0

這是一個非常寬泛的問題。

不,這不是基本也不一定是CUBIC。

重傳首先在TCP「基礎」RFC 793(1981)第3.7節「數據通信」中的「重傳超時」段落中指定。

從那時起,有很多(真的是許多 [*])增強。一個非常引人注目的是「慢啓動」,最後由RFC 5681指定,但是根源可以追溯到1997 RFC 2001,「TCP慢啓動,擁塞避免,快速重傳和快速恢復算法」。

在這個領域沒有「一刀切」,總是存在折衷。加上「智能」算法將會有更多的佔位面積(軟件+ CPU使用),所以它們可能會或可能不會被使用,或者甚至根據應用程序(甚至可能是嵌入式設備)而變得可用。因爲這些東西在實現中是(即在主機之間交換的數據中沒有看到),所以您無法確切地知道哪個主機使用哪個。例如,您會看到段中的TCP窗口大小和縮放比例,但您不知道它是由哪種算法管理的。

至於Linux,它應該是默認自3.2以來的PRR。之前是CUBIC,之前是BIC。

雖然,默認並不意味着它是唯一可用的。在我的Debian股票4.4.0內核,它的CUBIC:

[email protected]:~$ cat /proc/sys/net/ipv4/tcp_congestion_control 
cubic 

雖然裏諾可得:

[email protected]:~$ cat /proc/sys/net/ipv4/tcp_allowed_congestion_control 
cubic reno 

...而且有在可用一打「TCP:先進的擁塞控制」部分的內核配置。

*: https://en.wikipedia.org/wiki/TCP_congestion-avoidance_algorithm

+0

我也使用Debian(只是我使用netcat和查看轉儲)。這是一個很難回答的問題,我現在明白了什麼是rto,但是我還沒有找到總的rto(或者總的重傳數據包)。我不明白爲什麼選項/ proc/sys/net/ipv4/tcp_retries2。我會繼續觀看RFC。 –

+0

所以當然你已經閱讀過https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt,也許還有(122頁長的)RFC 1122.這本身就是一個_huge_主題,Linux網絡實現是一大堆代碼。 2條建議:1請記住,在網絡中Linux並不是「獨立」的:我已經在嵌入式Linux上工作了15年,主要是在網絡中間件上,並且更多的時候我發現自己正在與其他TCP/IP實現交談,從Windows CE到專有的航空電子堆棧到什麼不是。所以你從Linux學到的東西不會轉化爲「現實世界」。 – jbm

+0

(...和第二條建議)2 /可能有一些比較簡單的TCP/IP擁塞處理實現來研究,看看eCos,RTEMS,FreeRTOS等等。但是如果你想專注於CUBIC,也許可以用Linux實現。至於我自己,如果'/ proc/sys/net/ipv4/tcp_retries2'以任何方式與CUBIC相關,我甚至不知道(也沒有必要知道)。例如:僅用於測試,我切換到了Reno,它仍然在那裏,具有相同的'15'值。 – jbm