Linux

在 Linux 機器上臨時禁用/啟用 PMTU 發現的正確方法是什麼?

  • March 1, 2016

我有一些 pcap 包含大於標準乙太網 MTU 大小 1500B 的數據包。我對此進行了搜尋,發現參考文獻指向 Jumbo Frames。我現在明白,由於我在支持發送巨型幀(高達 9k)的 GBE 網路上,我的 Debian 衍生產品上的 TCP/IP 堆棧將自動調整自身並使用如此巨大的幀大小(PMTU 發現)。這真是太棒了!

但是,我想對該功能的自動啟用進行一些控制。具體來說,我想確保當我擷取 pcap 時,它被暫時禁用,因此所有擷取的數據包都低於 1500B。我需要確保這一點,因為基於 tcpreplay 的 pcap 重播框架在看到巨型幀時失敗了。Tcpreplay 有一個增強請求,支持分段 IP 數據包 > MTU以啟用發送巨型幀。但這是一張低優先級的票,可能需要一些時間才能得到解決。

我閱讀了有關手動調整 PMTU 發現行為的方法,發現 /proc 文件系統下的“ip_no_pmtu_disc”sysctl 變數可能很方便。我在我的客戶端和伺服器系統上都啟用了它(儘管我認為在其中任何一個上啟用它就足夠了)並擷取了一些 pcap。但是他們仍然有大於 1500B 的數據包。我的網路介面上的預設 MTU 已經設置為 1500B,並且由於 PMTU 發現被禁用,我認為一切正常。但是,我缺少一些東西。我將不勝感激任何參考/指針。

注意:我沒有重新啟動系統,因為我所做的 /proc 調整不會持續存在。每次我需要重放 pcaps 時,我也無法重新啟動系統。

您所看到的不是巨型幀的跡象。在您嗅探數據之後,您的 NIC 可能會將數據分割成更小的數據包。您是否在 VM 上進行測試?Linux 不會為傳出數據包使用比在介面上配置的 MTU 更大的 MTU。如果您的 MTU 為 1500,那麼這是最大值。

聽起來你可能打開了 TSO 和 GSO。通常 MSS 由 MTU - 標頭確定,並且它也通告到連接的兩側,這允許將兩者中的最低者用於連接建立但是,如果您啟用了 tso 和 gso,linux 將忽略 mtu/mss 和發送大塊的數據,這些數據會變得支離破碎。

引用自:https://serverfault.com/questions/504420