2011-07-22 42 views
4

我正在做一些在Linux中進行路徑MTU發現的實驗。就我從RFC 1191中瞭解到的情況來看,如果路由器收到一個DF零非零的數據包,並且該數據包不能在沒有分段的情況下發送給下一個主機,則路由器應丟棄數據包並將ICMP消息發送到初始發件人。路徑MTU發現 - ICMP響應在哪裏?

我已經創建了幾個虛擬機在我的電腦上,並通過以下方式聯繫他們:

VM1 (192.168.100.2) 

R1 (192.168.100.1, 
    192.168.150.1) 

R2 (192.168.150.2, 
    192.168.200.1) 

VM2 (192.168.200.2) 

的Rx - 被虛擬機安裝了Linux,他們有一個靜態路由兩個網絡接口。從V1開始Ping V2,反之亦然。

traceroute from 192.168.100.2 to 192.168.200.2 (192.168.200.2) 
1 192.168.100.1 (192.168.100.1) 0.437 ms 0.310 ms 0.312 ms 
2 192.168.150.2 (192.168.150.2) 2.351 ms 2.156 ms 1.989 ms 
3 192.168.200.2 (192.168.200.2) 43.649 ms 43.418 ms 43.244 ms 

tracepath 192.168.200.2 
1: ubuntu-VirtualBox.local        0.211ms pmtu 1500 
1: 192.168.100.1           0.543ms 
1: 192.168.100.1           0.546ms 
2: 192.168.150.2           0.971ms 
3: 192.168.150.2           1.143ms pmtu 750 
3: 192.168.200.2           1.059ms reached 

段100.x和150.x有MTU 1500段200.x有MTU 750

我試圖發送UDP報文的DF啓用。事實是,如果數據包的大小大於750(我接收到send()調用的EMSGSIZE錯誤),VM1根本不發送數據包。

但是,我期望這種行爲的數據包大小超過1500.我期望VM1發送數據包的大小在750和1500到R1,和R1(或R2)丟棄這樣的數據包並返回ICMP數據包發送給VM1。但是這並沒有發生。

有兩個問題:

1)爲什麼?

2)是否可以根據RFC 1191設置我的虛擬網絡接收ICMP數據包?

謝謝。

回答

6

它有可能VM1緩存了PMTU信息。默認情況下,這些緩存條目的超時時間爲10分鐘。您可以通過寫入/ proc/sys/net/ipv4/route/mtu_expires(秒)來更改超時。

爲您的實驗,嘗試發送了1500個字節的數據包之前清空緩存(刪除PMTU緩存):

echo "0" > /proc/sys/net/ipv4/route/flush 

您會收到一個ICMP需要分段消息,該消息將再次填充這個目的地的PMTU條目!因此,您需要在重試實驗前繼續刷新此緩存。

+0

是的,你說得對。它工作:)謝謝。 – Rom098