文章目錄
- 1. ARP狀態機
- 1.1 ARP狀態類型
- 1.2 狀態轉換圖
- 2. 超時時間與參數
- 2.1 主要超時參數
- 2.1.1 基礎時間參數
- 2.1.2 探測相關參數
- 2.1.3 垃圾回收參數
- 3. 主機發送ARP報文的時機
- 3.1 發送數據包時發現ARP緩存中沒有目標IP的MAC地址
- 3.2 ARP條目進入STALE狀態后需要發送數據
- 3.3 定期維護ARP緩存
- 3.4 處理ARP沖突
- 3.5 響應ARP請求
- 4. 狀態轉換詳解
- 4.1 REACHABLE狀態
- 4.2 STALE狀態
- 4.3 DELAY狀態
- 4.4 PROBE狀態
- 4.5 INCOMPLETE狀態
- 5. 垃圾回收機制
- 5.1 觸發條件
- 5.2 清理策略
- 6. 參數調優建議
- 6.1 高可用性網絡
- 6.2 動態網絡環境
- 6.3 大規模網絡
- 7. 監控和調試
- 7.1 查看ARP表
- 7.2 ip neigh命令詳細使用方法
- 7.2.1 基本語法
- 7.2.2 查看操作
- 7.2.3 添加和修改操作
- 7.2.4 刪除操作
- 7.2.5 常用參數說明
- 7.3 查看統計信息
- 7.4 實時監控
- 8. 常見問題和解決方案
- 8.1 ARP表項頻繁變化
- 8.2 ARP請求失敗
- 8.3 ARP表溢出
1. ARP狀態機
Linux內核中ARP表項具有多種狀態,這些狀態會根據網絡通信情況和時間進行轉換。ARP狀態主要包括:
1.1 ARP狀態類型
- NUD_INCOMPLETE: 地址解析中,正在解析硬件地址但尚未收到回復
- NUD_REACHABLE: 可達狀態,已確認鄰居可達
- NUD_STALE: 陳舊狀態,之前可達但已超過可達時間
- NUD_DELAY: 延遲狀態,臨時狀態,在進入PROBE前等待上層確認
- NUD_PROBE: 探測狀態,正在主動探測鄰居是否仍然可達
- NUD_FAILED: 失敗狀態,多次嘗試后仍無法解析或確認鄰居
- NUD_NOARP: 無需ARP狀態,如本地回環地址或點對點鏈路
- NUD_PERMANENT: 永久狀態,靜態ARP條目,不會超時
1.2 狀態轉換圖
2. 超時時間與參數
2.1 主要超時參數
Linux ARP老化機制涉及多個可配置參數,這些參數控制著ARP條目的狀態轉換和超時行為。
2.1.1 基礎時間參數
-
base_reachable_time_ms: 基礎可達時間(毫秒)
- 默認值:30000ms(30秒)
- 作用:ARP條目保持REACHABLE狀態的時間
- 路徑:
/proc/sys/net/ipv4/neigh/*/base_reachable_time_ms
-
gc_stale_time: 垃圾回收陳舊時間(秒)
- 默認值:60秒
- 作用:ARP條目在未被使用后變為STALE狀態的時間
- 路徑:
/proc/sys/net/ipv4/neigh/*/gc_stale_time
-
retrans_time_ms: 重傳時間(毫秒)
- 默認值:1000ms(1秒)
- 作用:ARP請求重傳的間隔時間
- 路徑:
/proc/sys/net/ipv4/neigh/*/retrans_time_ms
2.1.2 探測相關參數
-
ucast_solicit: 單播探測次數
- 默認值:3次
- 作用:在PROBE狀態下發送單播ARP請求的次數
- 路徑:
/proc/sys/net/ipv4/neigh/*/ucast_solicit
-
mcast_solicit: 組播探測次數
- 默認值:3次
- 作用:在INCOMPLETE狀態下發送組播ARP請求的次數
- 路徑:
/proc/sys/net/ipv4/neigh/*/mcast_solicit
-
anycast_delay: 任播延遲(毫秒)
- 默認值:1000ms(1秒)
- 作用:任播地址的延遲探測時間
- 路徑:
/proc/sys/net/ipv4/neigh/*/anycast_delay
-
proxy_delay: 代理ARP延遲(毫秒)
- 默認值:800ms
- 作用:代理ARP回復前的延遲時間
- 路徑:
/proc/sys/net/ipv4/neigh/*/proxy_delay
2.1.3 垃圾回收參數
-
gc_thresh1: 垃圾回收閾值1
- 默認值:128
- 作用:ARP表項數量低于此值時不會進行垃圾回收
-
gc_thresh2: 垃圾回收閾值2
- 默認值:512
- 作用:ARP表項數量超過此值時開始進行垃圾回收
-
gc_thresh3: 垃圾回收閾值3
- 默認值:1024
- 作用:ARP表項數量上限,超過時強制清理
這些參數的路徑通常在:
/proc/sys/net/ipv4/neigh/*/
(*代表具體網絡接口如eth0,default代表默認值)/proc/sys/net/ipv6/neigh/*/
(IPv6鄰居發現參數)
3. 主機發送ARP報文的時機
主機在以下幾種情況下會發送ARP報文:
3.1 發送數據包時發現ARP緩存中沒有目標IP的MAC地址
當主機需要向同一局域網內的另一個IP地址發送數據包時,如果ARP緩存中沒有該IP對應的MAC地址,主機將發送ARP請求報文來解析目標MAC地址。
過程如下:
- 檢查ARP緩存表中是否存在目標IP的條目
- 如果不存在或狀態為FAILED,則創建INCOMPLETE狀態的條目
- 發送ARP請求廣播報文
- 等待ARP響應,收到響應后更新ARP緩存并進入REACHABLE狀態
3.2 ARP條目進入STALE狀態后需要發送數據
當ARP條目處于STALE狀態且主機需要向該目標發送數據時,會觸發ARP解析過程:
- ARP條目從STALE狀態進入DELAY狀態
- 在DELAY狀態等待短暫時間,期望上層協議提供確認
- 如果未收到確認,則進入PROBE狀態
- 發送單播ARP請求探測目標是否仍然可達
- 收到響應后返回REACHABLE狀態
3.3 定期維護ARP緩存
系統會定期檢查ARP表項的狀態,并在必要時發送ARP請求來驗證鄰居的可達性:
- 當條目接近或超過base_reachable_time_ms設置的時間時
- 系統可能會主動發送ARP請求來確認鄰居仍然可達
- 這有助于在網絡拓撲發生變化時及時更新ARP表
3.4 處理ARP沖突
當主機檢測到IP地址沖突時,可能會發送ARP報文來解決沖突:
- 收到ARP請求或響應中包含與自己IP相同的地址
- 主動發送ARP請求或響應聲明自己的IP和MAC地址
- 這種機制有助于檢測和解決IP地址沖突
3.5 響應ARP請求
當主機收到針對自己IP地址的ARP請求時,會發送ARP響應報文:
- 接收ARP請求廣播報文
- 檢查請求的IP地址是否為自己配置的IP地址
- 如果匹配,則發送包含自己MAC地址的ARP響應報文
- 更新自己的ARP緩存表(如果需要)
4. 狀態轉換詳解
4.1 REACHABLE狀態
當系統成功發送或接收到目標主機的數據包時,ARP條目進入REACHABLE狀態。在此狀態下,系統認為鄰居是可達的,無需進行額外的ARP請求。
- 超時時間:由
base_reachable_time_ms
參數決定 - 狀態轉換:
- 超時后進入STALE狀態
- 收到更新的ARP回復時保持在REACHABLE狀態
4.2 STALE狀態
當ARP條目在REACHABLE狀態超時后,會進入STALE狀態。在此狀態下,ARP條目仍然可用,但系統不確定鄰居是否仍然可達。
- 超時時間:由
gc_stale_time
參數決定 - 狀態轉換:
- 當有數據包需要發送給該鄰居時,進入DELAY狀態
- 如果長時間未使用,會被垃圾回收機制清理
4.3 DELAY狀態
當有數據包需要發送給處于STALE狀態的鄰居時,ARP條目會先進入DELAY狀態。
- 超時時間:通常為幾秒鐘(由內核實現決定)
- 狀態轉換:
- 超時后進入PROBE狀態
- 如果在延遲期間收到上層確認,可能返回REACHABLE狀態
4.4 PROBE狀態
在PROBE狀態下,系統會主動探測鄰居是否仍然可達。
- 探測次數:由
ucast_solicit
參數決定 - 探測間隔:由
retrans_time_ms
參數決定 - 狀態轉換:
- 收到ARP回復則進入REACHABLE狀態
- 探測次數用盡仍未收到回復則進入FAILED狀態
4.5 INCOMPLETE狀態
當系統需要解析一個新的IP地址對應的MAC地址時,ARP條目處于INCOMPLETE狀態。
- 探測次數:由
mcast_solicit
參數決定 - 探測間隔:由
retrans_time_ms
參數決定 - 狀態轉換:
- 收到ARP回復則進入REACHABLE狀態
- 探測次數用盡仍未收到回復則進入FAILED狀態
5. 垃圾回收機制
Linux內核通過垃圾回收機制定期清理無用的ARP條目,以防止ARP表無限增長。
5.1 觸發條件
- ARP表項數量超過
gc_thresh2
- 系統定時檢查(通常每30秒)
- ARP表項數量超過
gc_thresh3
時強制清理
5.2 清理策略
- 優先清理FAILED狀態的條目
- 清理長時間處于STALE狀態的條目
- 根據最近使用時間清理條目
6. 參數調優建議
6.1 高可用性網絡
對于要求高可用性的網絡環境:
# 增加可達時間,減少ARP請求頻率
net.ipv4.neigh.default.base_reachable_time_ms = 60000
# 延長陳舊時間
net.ipv4.neigh.default.gc_stale_time = 120
6.2 動態網絡環境
對于設備頻繁接入/斷開的網絡環境:
# 縮短可達時間,快速發現設備狀態變化
net.ipv4.neigh.default.base_reachable_time_ms = 15000
# 縮短陳舊時間
net.ipv4.neigh.default.gc_stale_time = 30
6.3 大規模網絡
對于大規模網絡環境,需要調整ARP表大小:
# 增加ARP表項上限
net.ipv4.neigh.default.gc_thresh1 = 256
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh3 = 2048
7. 監控和調試
7.1 查看ARP表
# 查看所有ARP條目
ip neighbour show# 查看特定接口的ARP條目
ip neighbour show dev eth0# 查看特定狀態的ARP條目
ip neighbour show nud reachable
7.2 ip neigh命令詳細使用方法
[ip neigh](file:///home/avatr/work/github/kg/fragment/c/test-socket-tcp/tcp_client.c#L54-L54)命令是Linux系統中用于管理鄰居表(ARP表)的強大工具,提供了豐富的選項來查看、添加、刪除和修改ARP條目。
7.2.1 基本語法
ip neighbour { add | del | change | replace | show } { IP地址 } [參數]
7.2.2 查看操作
# 顯示所有鄰居條目
ip neighbour show# 顯示特定接口的鄰居條目
ip neighbour show dev eth0# 顯示特定狀態的鄰居條目
ip neighbour show nud reachable
ip neighbour show nud stale
ip neighbour show nud failed# 顯示特定IP地址的鄰居條目
ip neighbour show 192.168.1.100# 顯示代理ARP條目
ip neighbour show proxy# 實時監控鄰居表變化
ip neighbour monitor
7.2.3 添加和修改操作
# 添加靜態ARP條目
ip neighbour add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0# 添加永久ARP條目
ip neighbour add 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent# 添加代理ARP條目
ip neighbour add proxy 192.168.1.100 dev eth0# 修改現有ARP條目
ip neighbour change 192.168.1.100 lladdr 00:11:22:33:44:56 dev eth0# 替換ARP條目(如果不存在則添加)
ip neighbour replace 192.168.1.100 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
7.2.4 刪除操作
# 刪除特定IP的ARP條目
ip neighbour del 192.168.1.100 dev eth0# 刪除代理ARP條目
ip neighbour del proxy 192.168.1.100 dev eth0# 清空指定接口的所有ARP條目
ip neighbour flush dev eth0# 清空特定狀態的ARP條目
ip neighbour flush nud stale
ip neighbour flush nud failed# 清空所有ARP條目(有時并不清除permanent條目)
ip neighbour flush all# 清空PERMANENT狀態的ARP條目
ip neighbour flush nud permanent
7.2.5 常用參數說明
- lladdr: 指定鄰居的鏈路層地址(MAC地址)
- dev: 指定網絡接口
- nud: 指定鄰居狀態(reachable、stale、delay、probe、failed、noarp、permanent、all)
- proxy: 指定代理ARP條目
7.3 查看統計信息
# 查看ARP相關統計信息
cat /proc/net/netstat | grep -A 1 "Neigh"# 查看更詳細的鄰居子系統統計
cat /proc/net/neigh/eth0/
7.4 實時監控
# 實時監控ARP表變化
watch -n 1 'ip neighbour show'
8. 常見問題和解決方案
8.1 ARP表項頻繁變化
問題:網絡中ARP表項頻繁在REACHABLE和STALE狀態間切換。
解決方案:
- 增加
base_reachable_time_ms
值 - 檢查網絡中是否存在重復IP地址
8.2 ARP請求失敗
問題:ARP請求發送后無響應,條目進入FAILED狀態。
解決方案:
- 檢查網絡連通性
- 增加
mcast_solicit
和ucast_solicit
值 - 檢查防火墻是否阻止了ARP請求
8.3 ARP表溢出
問題:ARP表項數量超過限制,新條目無法添加。
解決方案:
- 增加
gc_thresh3
值 - 檢查網絡中是否存在ARP掃描等異常行為
- 考慮網絡架構優化,減少需要維護的鄰居數量