我在兩臺運行Linux的PC(通過發送以太網幀)之間生成一個流量,其目標是捕獲一些錯誤幀。問題是何時Phy層檢測到幀上的錯誤(如果CRC或FCS無效)幀被丟棄,我無法在我的程序中接收到它。如何接收錯誤的以太網幀並禁用CRC/FCS計算?
是否有任何方式接收錯誤的幀(例如禁用物理層中的液滴並接收指示該幀錯誤的指示符),以及如何查詢NIC卡的統計信息(丟棄次數...等等)。
我在兩臺運行Linux的PC(通過發送以太網幀)之間生成一個流量,其目標是捕獲一些錯誤幀。問題是何時Phy層檢測到幀上的錯誤(如果CRC或FCS無效)幀被丟棄,我無法在我的程序中接收到它。如何接收錯誤的以太網幀並禁用CRC/FCS計算?
是否有任何方式接收錯誤的幀(例如禁用物理層中的液滴並接收指示該幀錯誤的指示符),以及如何查詢NIC卡的統計信息(丟棄次數...等等)。
你可以使用socket()
打電話給raw socket
。例如下面的調用打開一個raw TCP socket
:
int fd = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
你可以改變你需要的任何協議,但可以肯定的是,你收到的每個數據包。
上面的代碼只會讓您捕獲好的數據包,因爲損壞的數據包甚至不會將其發送到操作系統,並且首先丟棄在交換機上,或者丟棄在連接到PC的線路卡驅動程序中。同一主題的更多討論,可以在這裏找到在Wireshark wiki page
我想你會發現這是行不通的。在接收處理期間,MAC丟棄壞幀。設備驅動程序需要配置爲告訴設備接受壞幀。 –
是的,同意你的意見。我編輯了答案。標準網卡驅動程序會自動在驅動程序級別丟棄損壞的數據包,並且不會將其轉發到操作系統,這也是有道理的。但有什麼辦法可以配置標準線路卡驅動程序甚至將損壞的數據包轉發到OS? –
不,沒有標準的方法來做到這一點。你需要仔細閱讀驅動程序的源代碼,看看驅動程序是否碰巧有一個選項來配置它,可能要讀取芯片的數據表並自己實現如果芯片支持它。 – nos
你沒有指定的操作系統,但我至少可以爲Linux說話:
它可以在你的內核,網卡和驅動程序,以及ethtool的版本。
我們需要告訴驅動程序/硬件做兩件它通常不會做的事情: 1)將FCS字段傳遞給網絡堆棧。 (通常,這被傳遞之前截斷) 2)不丟棄數據包壞FCS域,而不是將它們傳遞了原樣
有兩個的ethtool選項來實現每一項:
ethtool -K eth0 rx-fcs on #1 above: give us the FCS field
ethtool -K eth0 rx-all on #2 above: even receive bad packets
有了這些,我可以使用wireshark或tcpdump來查看FCS字段,即使它們不正確。 (在我的情況下,我有一些網絡設備,用一個準確的時間戳即時替換校驗和 - 這會導致數據包出現「不良」,並且我使用上述恢復)
並非所有卡都會執行這個!他們可能會將上述ethtool選項「固定」掉或不對其做出迴應。
在1G的速度下,我看到e1000卡工作良好。在10G的時候,我還沒有找到一個可以完成這個任務的網卡,並且必須依賴更復雜的數據採集卡。
同樣,我不知道最低內核/ ethtool版本要求是什麼,但我記得要升級CentOS服務器才能使其工作。
我也知道,r8169和e1000驅動程序/卡可以做到這一點,但不能說任何其他組合。
另請注意,您將無法在發送它們的計算機上捕獲傳出的FCS值,因爲它們在進程中添加得相當晚(可能已卸載到卡本身),因此pcap無法看到。
在Linux 3.10.11內核上,使用ethtool 3。10:
$ ethtool -k eth0
Features for eth0:
rx-checksumming: on
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp6-segmentation: on
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off [fixed]
receive-hashing: on
highdma: on [fixed]
rx-vlan-filter: on [fixed]
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
fcoe-mtu: off [fixed]
tx-nocache-copy: on
loopback: off [fixed]
rx-fcs: off
rx-all: off
tx-vlan-stag-hw-insert: off [fixed]
rx-vlan-stag-hw-parse: off [fixed]
rx-vlan-stag-filter: off [fixed]
然後:
$ sudo ethtool -K eth0 rx-fcs on rx-all on
給我:
$ ethtool -k eth0
Features for eth0:
rx-checksumming: on
tx-checksumming: on
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: on
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp6-segmentation: on
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off [fixed]
receive-hashing: on
highdma: on [fixed]
rx-vlan-filter: on [fixed]
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: off [fixed]
tx-gre-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
fcoe-mtu: off [fixed]
tx-nocache-copy: on
loopback: off [fixed]
rx-fcs: on
rx-all: on
tx-vlan-stag-hw-insert: off [fixed]
rx-vlan-stag-hw-parse: off [fixed]
rx-vlan-stag-filter: off [fixed]
我正在使用Ubuntu 12.04 我試圖使用ethtool工具,但我沒有rx-fcs和rx-all參數。這是我輸入man ethtool時的參數 ethtool -K | --offload devname [rx on | off] [tx on | off] [sg on | off] [tso on | off] [ off] [rxhash on | off] and -K - 已關閉|打開] [關閉] [關閉] [關閉] [關閉]卸載更改指定網絡設備的卸載參數。 – A2maridz
@ A2maridz,好吧,我不知道內核/ NIC/ethtool組合的工作原理。我已經用我可以訪問的一個已知良好的組合更新了答案。 ubuntu發佈什麼版本的ethtool? 我相信他們會將選項置於-K之下,因爲您正在有效地配置卡是否執行FCS檢查和截斷(即,卸載它)。 –
這將依賴於平臺。假設驅動程序支持,您需要進行某種設備驅動程序ioctl()調用。 –
是的,我正在尋找一種方式,該設備不丟棄壞幀(交付他們,並通知我,他們是壞的) – A2maridz