2010-10-04 170 views
4

在Linux中,如何設置TCP連接上允許的最大段大小?我需要將它設置爲我沒有寫入的應用程序(所以我不能使用setsockopt來做到這一點)。我需要在網絡堆棧中設置這個高於mtu。如何在Linux上設置最大TCP最大段大小?

我有兩個流共享同一個網絡連接。一個定期發送小包,這需要絕對最小的延遲。另一方發送大量數據 - 我正在使用SCP來模擬該鏈接。

我已經設置交通控制(TC),得到最低延時的流量高優先級。但是我遇到的問題是,從SCP傳出的TCP數據包最終大小達64K字節。是的,這些被分解成基於mtu的更小的數據包,但是這不幸在發生在數據包的優先次序後發生。因此,我的低延遲數據包滯留在高達64K字節的SCP流量後面。

This article表明,在Windows中可以設置這個值。

有什麼在Linux上我可以設置?我已經嘗試過ip route和iptables,但是這些在網絡堆棧中應用得太低。我需要在tc之前限制TCP數據包大小,因此它可以適當地優先考慮高優先級數據包。

+0

我發現很難相信包在TCP隊列中結束了64k,tc不能在TCP層上工作,它關心數據包,而不是TCP段 – nos 2010-10-04 18:18:48

+0

我必須同意。從我的閱讀中,TCP段應該在tc之前分解。但是,這不是我所看到的(無論是在延遲還是在tcpdump中)。當一個大的TCP段出去時,它會延遲高優先級的通道,直到發送大段的所有(最多64K字節)爲止。 – Eric 2010-10-18 21:40:05

回答

2

的上限播發TCP MSS的是第一跳路由的MTU。如果你看到64k段,這往往表明第一跳路由MTU過大 - 你使用環回或測試什麼?

+0

沒有。第一跳MTU是1500.我在tcpdump輸出(發送端)看到大數據包。如果我也在接收端運行一個tcpdump,我會看到大數據包被分成許多1500字節的數據包。 – Eric 2010-10-18 21:37:31

0

你肯定是誤診了這個問題;正如其他人指出的那樣,tc沒有看到TCP數據包,它看到了IP數據包,並且在那時它們已經處於大塊區域。

您可能只是遇到了bufferbloat:您在一個完全獨立的設備(可能是DSL調制解調器或電纜調制解調器)中將您的出站隊列超載。唯一的解決方法是告訴tc將出站帶寬限制爲小於調制解調器的帶寬,例如。使用TBF。

5

是否使用TCP分段卸載到NIC? (您可以使用「ethtool -k $ your_network_device」來查看卸載設置。)據我所知,這是唯一的方法,您將看到設備MTU爲1500的64k tcp數據包。並不是說這回答了這個問題,但這可能有助於避免誤診。

相關問題