InetAddress 提供 10 個 isXxx() 方法,用於判斷 IP 是否屬於特殊用途地址(回環、鏈路本地、站點本地、組播等)。本文逐一解析 IPv4/IPv6 範圍、適用場景,並提供一鍵檢測代碼。
| 方法 | 地址類型 | IPv4 範圍 | IPv6 範圍 | 典型用途 |
|---|---|---|---|---|
isAnyLocalAddress() | 通配符/任意本地 | 0.0.0.0 | :: (0:0:0:0:0:0:0:0) | ServerSocket 綁定所有介面 |
isLoopbackAddress() | 回環 | 127.0.0.0/8 | ::1 (0:0:0:0:0:0:0:1) | 本機自我通訊、測試 |
isLinkLocalAddress() | 鏈路本地 | 169.254.0.0/16 | FE80::/10 (FE80:: - FEBF::) | 自動配置、鄰居發現、單鏈路通訊 |
isSiteLocalAddress() | 站點本地 (已棄用) | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 | FEC0::/10 (FEC0:: - FEFF::) | 機構內部私有網路 (IPv6 已廢棄,改用 ULA FC00::/7) |
isMulticastAddress() | 組播/多播 | 224.0.0.0/4 (224-239) | FF00::/8 | 一對多傳輸 (視頻會議、流媒體) |
isMCGlobal() | 全球組播 | 224.0.1.0 - 238.255.255.255 (除 224.0.0.x, 239.x.x.x) | FF0E::/16 - FFEE::/16 (第2字節 0x0E-0xFE) | 跨互聯網組播 |
isMCLinkLocal() | 鏈路本地組播 | 224.0.0.0/24 | FF02::/16 (第2字節 0x02) | 單鏈路組播 (路由協議 OSPF, RIPv2) |
isMCNodeLocal() | 節點本地組播 | 無 | FF01::/16 (第2字節 0x01) | 進程間通訊,不出網卡 |
isMCOrgLocal() | 機構本地組播 | 239.192.0.0/14 (239.192-239.195) | FF08::/16 - FF88::/16 (第2字節 0x08-0x88) | 企業內部組播 |
isMCSiteLocal() | 站點本地組播 | 239.255.0.0/16 | FF05::/16 - FF85::/16 (第2字節 0x05-0x85) | 站點範圍組播 |
isSiteLocalAddress() 對應 IPv6 已廢棄的 Site-Local (FEC0::/10),現代應用應識別 ULA (Unique Local Address) FC00::/7,但 JDK 無直接方法,需自行檢查前 7 位。isMCNodeLocal() 對應範圍,該方法對 IPv4 永遠返回 false。FF + 0x0s (s=scope)。public class SpecialIpDetector {
public static void main(String[] args) throws Exception {
if (args.length == 0) return;
InetAddress addr = InetAddress.getByName(args[0]);
Method[] methods = InetAddress.class.getMethods();
for (Method m : methods) {
if (m.getName().matches("is.*") && m.getParameterCount() == 0) {
boolean result = (Boolean) m.invoke(addr);
if (result) System.out.println(m.getName() + " = true");
}
}
}
}
$ java SpecialIpDetector 224.0.0.1
isMCLinkLocal = true
isMulticastAddress = true
$ java SpecialIpDetector FF02::1
isMCLinkLocal = true
isMulticastAddress = true
$ java SpecialIpDetector 192.168.1.10
(無輸出 → 普通單播地址)
$ java SpecialIpDetector 127.0.0.1
isLoopbackAddress = true
isAnyLocalAddress = false
isAnyLocalAddress() → 綁定 0.0.0.0/:: 監聽所有介面。isLoopbackAddress() 作為外部訪問來源;識別 isLinkLocalAddress() 限制單鏈路傳播。isMCGlobal/LinkLocal/OrgLocal/SiteLocal 選擇組播組地址範圍。掌握這 10 個 isXxx() 方法,能讓你在綁定、路由、安全、組播等網路決策點上,基於 IP 語義而非硬編碼範圍做正確判斷,編寫更健壯、可移植的網路代碼。