import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class Util{
/**
* Finds a local, non-loopback, IPv4 address
*
* @return The first non-loopback IPv4 address found, or
* <code>null</code> if no such addresses found
* @throws SocketException
* If there was a problem querying the network
* interfaces
*/
public static InetAddress getLocalAddress() throws SocketException
{
Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
while( ifaces.hasMoreElements() )
{
NetworkInterface iface = ifaces.nextElement();
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while( addresses.hasMoreElements() )
{
InetAddress addr = addresses.nextElement();
if( addr instanceof Inet4Address && !addr.isLoopbackAddress() )
{
return addr;
}
}
}
return null;
}
}
一、相关loopback address基本概念
路由器上设备的Loopback地址是什么意思?
本地环回接口(或地址),亦称回送地址(loopback address)。
此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途:
1 作为一台路由器的管理地址
系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址,管理员会使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称一类的功能。
但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢?
原因如下:由于telnet 命令使用TCP 报文,会存在如下情况:路由器的某一个接口由于故障down 掉了,但是其他的接口却仍旧可以telnet ,也就是说,到达这台路由器的TCP 连接依旧存在。所以选择的telnet 地址必须是永远也不会down 掉的,而虚接口恰好满足此类要求。由于此类接口没有与对端互联互通的需求,所以为了节约地址资源,loopback 接口的地址通常指定为32 位掩码。
2 使用该接口地址作为动态路由协议OSPF 、BGP 的router id 动态路由协议OSPF 、BGP 在运行过程中需要为该协议指定一个Router id ,作为此路由器的唯一标识,并要求在整个自治系统内唯一。由于router id 是一个32 位的无符号整数,这一点与IP 地址十分相像。而且IP 地址是不会出现重复现象的,所以通常将路由器的router id 指定为与该设备上的某个接口的地址相同。由于loopback 接口的IP 地址通常被视为路由器的标识,所以也就成了router id 的最佳选择。
3、使用该接口地址作为BGP 建立TCP 连接的源地址
在BGP 协议中,两个运行BGP 的路由器之间建立邻居关系是通过TCP 建立连接完成的。
在配置邻居时通常指定loopback 接口为建立TCP 连接的源地址(通常只用于IBGP ,原因同2.1 ,都是为了增强TCP 连接的健壮性)
配置命令如下:
router id 61.235.66.1
interface loopback 0
ip address 61.235.66.1 255.255.255.255
router bgp 100
neighbor 61.235.66.7 remote-as 200
neighbor 61.235.66.7 update-source LoopBack0
4、在Windows系统中,采用127.0.0.1作为本地环回地址。
二、Java类中运用
-
public class InetAddress
- extends Object
- implements Serializable
此类表示互联网协议 (IP) 地址。
InetAddress 的实例包含 IP 地址,还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)。
boolean |
isLoopbackAddress() 检查 InetAddress 是否是回送地址的实用例行程序。 |
获得了InetAddress子类对象的引用就可以调用InetAddress的各种方法来获得InetAddress子类对象中的IP地址信息,比如,可以通过调用getCanonicalHostName()从域名服务中获得标准的主机名;getHostAddress()获得IP地址,getHostName()获得主机名,isLoopbackAddress()判断IP地址是否是一个loopback地址。
List1 是一段示范代码:
// InetAddressDemo.java |
当无命令行参数时,代码输出类似下面的结果:
Canonical Host Name = localhost
Host Address = 127.0.0.1
Host Name = localhost
Is Loopback Address = true