天天看點

測試MTU的兩種方案以及遇到的問題分析通過Converter測試MTU通過CANoe測試MTU

車載以太網測試中,有一條是測試DUT裝置的MTU大小,下面我們來看下如何測試,以及測試中遇到的問題分析

假設需求文檔裡規定:DUT的以太網網卡的MTU是1500

我們先看方案,然後分析為什麼這樣做

通過Converter測試MTU

硬體環境

測試MTU的兩種方案以及遇到的問題分析通過Converter測試MTU通過CANoe測試MTU

pc和dut作為通信雙方,converter作為連接配接pc和dut的轉接闆

測試步驟

首先給pc的本地網卡配置一個ip位址,網段和dut在同一個網段内

然後在pc上打開一個wireshark,同時監視pc的本地網卡

最後在pc上打開cmd視窗,輸入指令

ping 192.168.1.20 -l 1473  
           

在wireshark上檢視抓取的包

分析

ping 192.168.1.20我們知道,後面的"-l 1473"呢?

它表示給192.168.1.20的主機發icmp request封包,且這個封包的icmp payload大小為1473位元組

這條icmp request封包的icmp payload為1473,icmp header為8,ip header為20,那麼這條封包的二層data為1473+8+20 = 1501

通常pc的網卡MTU為1500,那麼這條封包想要發出去,必須要在網絡層分片後發出,分成兩條封包,第一條封包的二層data為ip header (20) + ip payload(1480)為1500,第二條封包的二層data為ip header(20) + ip payload(1)為21

現在我們看下在wireshark上抓取的icmp request

測試MTU的兩種方案以及遇到的問題分析通過Converter測試MTU通過CANoe測試MTU

有兩條封包:

第一條封包的長度是1514,它其實把二層頭部的14個位元組(這裡不包括FCS校驗和)也加上去了,14+1500=1514

第二條封包的長度是35,它也把二層頭部的14個位元組加上去(這裡不包括FCS校驗和),14+21=35

這兩條封包到達dut後,dut的網卡MTU如果為1500,則這兩條封包都可以收到,收到後會在協定棧内部先組裝成一條完整的icmp封包,拿到icmp payload資料為1473

然後把這1473個位元組的資料當做icmp response的payload,發回給pc

這條icmp response封包的二層data為ip header(20) + icmp header(8) + icmp payload(1473) = 1501

如果dut的MTU為1500,就隻能分片發出去,同樣也是分成兩條封包

第一條封包的長度是1514,它其實把二層頭部的14個位元組也加上去了(這裡不包括FCS校驗和),14+1500=1514

第二條封包的長度按道理來說應該是35,它把二層頭部的14個位元組加上去(這裡不包括FCS校驗和),14+21=35

但實際上我們發現

測試MTU的兩種方案以及遇到的問題分析通過Converter測試MTU通過CANoe測試MTU

第二條封包的長度是60,為什麼?

以太網幀的data最小長度必須為46,以保證一條以太網幀的幀長至少為64(這裡把FCS的4個位元組算進來了)

是以icmp response分片後的第二條以太網幀雖然隻有35個位元組,但是為了保證幀長至少64(包括FCS的4個位元組),填充了大量的0x00個位元組

測試MTU的兩種方案以及遇到的問題分析通過Converter測試MTU通過CANoe測試MTU

是以就在wireshark上看到第二個幀長為60(沒有算FCS的4個位元組)

等一等,那為什麼pc在發icmp request時分片的第二個幀的長度為35呢?

我猜測可能是pc系統的協定棧沒有這個最小幀長的規定

我在wireshark上分析icmp response的第二條幀時還發現,當我把icmp協定層展開後發現

測試MTU的兩種方案以及遇到的問題分析通過Converter測試MTU通過CANoe測試MTU

明明幀長隻有60,為什麼會顯示icmp data有1473?

這裡其實是wireshark為了友善使用者而自動把完整的icmp response封包内容顯示了出來而已,是以千萬不能通過這種方式分析封包長度

現在你應該明白如何測試MTU了吧

進一步分析

上面的方式其實是利用dut封包從網卡發出時如果幀data大于MTU需要分片的特點

而dut如何生成的這條封包?

則是由pc給dut發了一條icmp request,使得dut自動回複了同樣長度的icmp response

如果pc的MTU小于1500,比如說1400,我不能發送一條幀data小于1500的icmp request,由于小于dut的MTU是1500,這樣的icmp request可以收到并回複,且沒有分片,根本無法确定dut的MTU大小

如果是一條幀data大于1500的icmp request呢?由于pc的MTU是1400,會分成兩個分片包發出去,而dut由于MTU是1500,可以很順利地接收到,接收後再發一條幀長大于1500的icmp response,dut的MTU是1500,又要分成幀data為1500和剩餘大小的兩個分片包發出去,但是,由于pc的MTU隻有1400,第一個分片包無法被pc擷取,也就無法确定dut的MTU大小了

如果pc的MTU大于1500呢?更加不行了,大于1500的icmp request都不能通過dut的網卡,更不要談回複icmp response了

是以利用dut的封包從網卡發出時需要受到MTU限制而分片的特點來測試dut的MTU大小,pc的MTU必須和dut的MTU相等

既然我們可以利用MTU對于發出的封包長度有限制的特點,是否也能利用MTU對接收到的封包長度也有限制這個特點,去測試MTU呢?

也是可以的

我們隻要把pc的MTU設的足夠大(比dut大),然後我們從幀長較小的icmp request發起,收到icmp response後,繼續把icmp request幀長加1,發出去,這樣當出現某一條icmp request沒有回複icmp response時,說明是被dut的MTU限制了,我們通過計算這條icmp request的幀data來計算dut的MTU大小

這也是我們接下來要講的另一種方案

通過CANoe測試MTU

更多内容,請關注汽車網絡診斷通信

繼續閱讀