1. 程式人生 > >ping故障的除錯筆記:arp快取

ping故障的除錯筆記:arp快取

現象

簡化後的網路拓補結構如圖,主機和裝置分別位於不同的子網中。


現象如下:裝置在其網路配置不變的情況下,每當重啟之後,需要經過幾十秒(甚至幾分鐘)的時間,才可以ping通主機。

除錯

在裝置端ping主機,同時使用tcpdump抓包進行除錯:

tcpdump -i eth0 icmp –e
-i eth0:指定網路介面
icmp:只抓取ICMP協議資料包,即ping命令所用協議
-e:打印出資料鏈路層頭部資訊
在主機端抓包,可以抓取到ICMP請求包和回覆包;而在裝置端抓包,也能抓取到ICMP請求包和回覆包,由於打印出了資料鏈路層的頭部資訊,其輸出大概如下
17:20:31.124385 38:22:d6:e5:ea:86 (oui Unknown) > 00:0c:29:5c:e0:c6 (oui Unknown), ethertype IPv4 (0x0800), length 98: 10.82.19.208 > 10.82.16.57: ICMP echo request, id 22540, seq 128, length 64

分析

在觀察和分析tcpdump輸出時,可以知道:源MAC地址並非主機,而是裝置的閘道器,也即路由器2。這是由於IP資料包在經過路由器轉發後,資料鏈路層的源MAC地址被修改為路由器MAC所致。

在持續觀察的過程中,發現在ping通的那一刻,ICMP回覆包的目的MAC發生了變化。對比裝置的MAC地址,發現變化前的目的MAC地址是一個陌生的MAC地址,而變化後的目的MAC地址就是裝置目前的MAC地址。

這也就是之前ping不通的原因:

  • tcpdump預設開啟了網絡卡的混雜模式,雖然接收到一個ICMP回覆包,但是其目的MAC地址不匹配,導致協議棧丟棄了此包。

ICMP回覆包是由主機產生,其路由過程和

ICMP請求包相同。其MAC地址是由路由器2修改為裝置MAC地址的。那麼可以推斷出,這是由於路由器2arp快取表映射了錯誤的裝置MAC地址導致。

經過多次觀察,可以發現,這個錯誤的MAC地址,其實是裝置在重啟前的MAC地址,也即裝置重啟之後的新MAC地址並未更新到路由器2中。

而之所以經過一段時間之後,又可以ping通,則自然是路由器2的arp快取表已經更新了。可能的原因有:

  • 裝置在這段時間發生了其他網路通訊,使得路由器2可以自動學習到裝置的新MAC地址
  • 路由器2的快取表老化失效,並通過其他途徑得到新的MAC地址

解決

理論上,Linux系統在網路初始化之後,將自動傳送免費ARPgratuitous arp

),從目前的情況來看,應該是由於某種原因出現故障,此問題後續跟進。

那麼,解決方式有兩種:

1. 固定裝置的MAC地址;

2. 裝置啟動後,利用自動執行的指令碼或者應用程式,傳送免費ARPgratuitous arp),這樣路由器2就會更新其arp快取表了。

相關推薦

ping故障除錯筆記arp快取

現象 簡化後的網路拓補結構如圖,主機和裝置分別位於不同的子網中。 現象如下:裝置在其網路配置不變的情況下,每當重啟之後,需要經過幾十秒(甚至幾分鐘)的時間,才可以ping通主機。 除錯 在裝置端ping主機,同時使用tcpdump抓包進行除錯: tcpdump -i

Qt5.9.4+OpenGL除錯筆記QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

最近專案開發需要用到qml,因為qml需要依賴OpenGL庫,所以重新配置相關環境。 一、開發環境 1.核心版本 [email protected]:~# uname -a Linux marsboard 4.1.15 #1 SMP PREEMPT Mon D

[RK3399][Android7.1] 除錯筆記 --- USBdevice descriptor read/64, error -32

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 現象: 由於rk3399四個usb口不能滿足數量需求,對其中的usb3.0(非OTG口)進行外接Hub(用的是GL850)做擴充套件。 插上U盤後出現如下error: [

[RK3399][Android7.1] 除錯筆記 --- USBno configuration chosen from 1 choice

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 背景: 由於rk3399四個usb口不能滿足數量需求,對其中的usb3.0(非OTG口)進行外接Hub做擴充套件成3個USB2.0+1一個USB3.0。 原理圖如下: 現象

TCP-IP詳解卷1協議 學習筆記(4) ARP

參考:TCP-IP詳解卷1:協議 ARP(地址解析協議)和RARP(逆地址解析協議) ARP為IP地址到對應的硬體地址之間提供動態對映,這個過程是自動完成的,一般應用程式使用者或者系統管理員不必關心。 RARP是被那些沒有磁碟驅動器的系統使用(一般是無盤工作站或X終端),需

【開發工具】[Jlink]STM32 MDK Jlink 除錯筆記

1.錯誤資訊如下: JLink info: ----------- DLL: V4.08b, compiled Jun 30 2009 19:10:31 Firmware: J-Link ARM V8 compiled Dec  1 2009 11:42:48 Hardwa

ldd3學習筆記除錯技術

void *start(struct seq_file *sfile, loff_t *pos); void *next(struct seq_file *sfile, void *v, loff_t *pos); //next 函式應當移動 iterator 到下一個位置 void stop(stru

TQIMAX6q除錯筆記lvds屏的移植

一、移植概述 Linux version:Linux Embedsky 4.1.15 #1 SMP PREEMPT Mon Sep 18 17:54:29 CST 2017 armv7l GNU/Linux 本次移植了兩塊LVDS螢幕,分別是12寸 單路 LVDS和13寸

JavaScript筆記錯誤處理與除錯

1、瀏覽器報告的錯誤 IE IE 是唯一一個在瀏覽器的介面窗體(chrome)中顯示 JavaScript 錯誤資訊的瀏覽器。在發生 JavaScript 錯誤時,瀏覽器左下角會出現一個黃色的圖示,圖示旁邊則顯示著”Error on page”(頁面中有錯誤

[Tools] [cmake] 除錯筆記 --- 如何徹底清除cmake產生的快取

背景: cmake並沒有提供類似於 cmake clean 這樣的方式來讓我們清除產生的快取,但是它編譯的快取(*.cmake, Makefile,CmakeCache.txt, CMakeFi

Docker學習筆記故障排除

坑一[email protected]:~$ docker search centos Warning: failed to get default registry endpoint from daemon (Got permission denied while

[RK3288][Android6.0] 除錯筆記 --- 快取檔案引起的serialno值相同

Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 現象: 第三方應用需要根據serialno來產生license, 但是遇到不同板子有相同serialno值的問題。 原因: serialno對應的檔案被快取在了

【學習筆記】在Chrom中除錯TypeScript時禁止快取

在除錯時,開啟瀏覽器重新整理,依然是舊的資料,這給除錯帶來麻煩。 可以按以下方法做,禁用瀏覽器的快取。 禁用快取的步驟如下: 先按F12,再按F1, 勾選 Disable cache (whi

《深入理解 Java 虛擬機器》讀書筆記虛擬機器效能監控與故障處理工具

正文 一、JDK 的命令列工具 JDK 的 bin 目錄下提供了一些用於監視虛擬機器和故障處理的命令列工具。 名稱 主要作用 jps JVM Process Status Tool,顯示正在執行的虛擬機器程序 jstat JVM Statistics Monitoring Tool,收集虛擬

筆記I/O流-字符集

表示 ava deb 建立 gin integer 示例 字節 標準化 Java 庫的 java.nio 包用 Charset 類統一了對字符集的轉換,支付姐建立了兩個字節Unicode碼元序列與使用本地字符編碼方式的字節序列之間的映

筆記I/O流-對象序列化

err extends 自己 point clas xtend his size cto Java 語言支持一種稱為對象序列化(Object Serialization)的非常通用的機制,可以將任何對象寫入到流中,並在之後將其讀回,首先需要支持對象

筆記mysql 下載與安裝

blog utf8 字符 data strong def services -1 個人 1.下載: 官網下載是需要註冊的,或者你已經有了Oracle的賬號. 可以直接百度 mysql 進入官網;或者直接下面的鏈接; 附上鏈接:dev.mysql.com/downloa

張高興的 Windows 10 IoT 開發筆記使用 ULN2003A 控制步進電機

uln2003 zhang windows iot ges 開發 ima dem win   GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/ULN2003A   張高興的 Wind

筆記I/O流-內存映射文件

pos 開始 col java mod 傳播 寫入 i/o .get 內存映射文件時利用虛擬內存實現來將一個文件或者文件的一部分映射到內存中,然後整個文件就可以當作數組一樣的訪問,這個比傳統的文件操作要快得多,Java 使用內存映射文件首先需要從文件中獲取一個cha

Linux學習筆記存儲管理

linux 磁盤管理 Linux系統中所有的硬件設備都是通過文件的方式來表現和使用的,我們將這些文件稱為設備文件,在Linux下的/dev目錄中有大量的設備文件,根據設備文件的不同,又分為字符設備文件和塊設備文件。字符設備文件的存取是以字符流的方式來進行的,一次傳送一個字符。常見的有打印