本文主要总结 internet地址相关知识,及相关的 java 类 ;
0)ip地址是什么
- 连接到internet的设备称为节点,计算机节点称为主机(host),每个节点至少由一个唯一的数(或数字串)来表示以便通讯,这个数就是ip地址 ;
1)ipv4地址
- ipv4地址表示:4个无符号字节,点号分隔,每个字节从0~255,最高字节在前;如152.19.134.132;
- 内部网ip, 以10. 172.16. 172.31. 和 192.168. 开头的ip地址都未分配到internet,可以在内部网使用;(127.0.0.1是回环地址,即指向本地机器节点)
2)ipv6地址
- ipv6地址:16个字节, 冒号分隔的8个区块,每个区块是4个16进制数字;如 FEDC:BA98:9871:3210:ABCD:BA98:9876:ABCE, 可以简化0;
- ipv4地址的个数为 40亿多一点(2^32=4G),无法做到每台计算机一个地址,所以为了增加ip地址个数,引入了ipv6地址 ;
3)域名
- 因为ip地址全是数字,不方便记忆,所以引入了域名;以百度而言;其ip地址是 110.242.68.3,但这串数字不好记忆,所以引入了域名 www.baidu.com;
4)域名服务器-DNS SERVER
- 路由器在进行路由前,需要把域名解析为ip地址, 这个功能是由 域名服务器完成的;
【1】InetAddress ip地址类 【1.1】InetAddress类说明
【1.2】InetAddress ip地址测试用例此类表示 Internet 协议 (IP) 地址。
IP 地址是 IP 使用的 32 位或 128 位无符号数,IP 是构建 UDP 和 TCP 等协议的低级协议。
一个 InetAddress 的实例由一个 IP 地址和它对应的主机名组成(取决于它是否用主机名构造 或 它是否已经进行了主机名反向解析)。
// 获取ip地址 @Test public void f1() throws Exception { // 根据域名获取ip地址 InetAddress address = InetAddress.getByName("www.oreilly.com"); System.out.println(address); // www.oreilly.com/23.57.133.173 // 根据ip地址字符串获取ip地址对象 address = InetAddress.getByName("23.57.133.173"); System.out.println(address); // /23.57.133.173 System.out.println(address.getHostName()); // a23-57-133-173.deploy.static.akamaitechnologies.com // 获取一个主机域名的所有ip地址 InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com"); Arrays.stream(addresses).forEach(System.out::println); // www.baidu.com/110.242.68.4 // www.baidu.com/110.242.68.3 } // 查找本地机器地址 @Test public void f2() throws Exception { InetAddress address = InetAddress.getLocalHost(); System.out.println(address); // DESKTOP-E4IASRJ/192.168.163.1 } // 查找本地机器的ip地址 @Test public void f4_4() throws Exception { InetAddress address = InetAddress.getLocalHost(); String hostAddress = address.getHostAddress(); System.out.println(hostAddress); // 192.168.163.1 }
【1.3】ip地址类型 【1.3.1】单播
- 单个接口的标识符。 发送到单播地址的数据包将传送到由该地址标识的接口。
- 未指定地址——也称为任何本地或通配符地址。 它绝不能分配给任何节点。 它表示没有地址。 它的一个例子是作为 bind 的目标,它允许服务器接受任何接口上的客户端连接,以防服务器主机有多个接口。未指定的地址不得用作 IP 数据包的目的地址。
- 环回地址(127.0.0.1)——这是分配给环回接口的地址。 发送到此 IP 地址的任何内容都会循环并成为本地主机上的 IP 输入。 该地址通常在测试客户端时使用。
一组接口的标识符(通常属于不同的节点,即多台主机)。 发送到多播地址的数据包将传送到该地址标识的所有接口。
【1.4】ipv4和ipv6地址
1)如何判断一个地址是ipv4 还是ipv6 ?
// ip地址类型, ipv4 or ipv6 ? @Test public void f4_5() throws UnknownHostException { InetAddress address = InetAddress.getByName("www.oreilly.com"); byte[] addressByteArr = address.getAddress(); if (addressByteArr.length == 4) System.out.println("ipv4"); // ipv4 if (addressByteArr.length == 6) System.out.println("ipv6"); }
补充,java使用了 Inet4Address, Inet6Address 分别表示 ipv4和ipv6 地址;
【2】NetWorkInterface类-网络接口类
0)api说明
此类表示由名称和分配给此接口的 IP 地址列表组成的网络接口。 用于标识加入组播组的本地接口。 接口通常以诸如“le0”之类的名称命名;
补充,如何理解网络接口? 狭隘理解就是一个物理上的网线插拔口, 广义上可以是虚拟网络接口,比如 vmnet8;
1)NetWorkInterface类实例表示一个本地ip地址,或者一个物理接口,或一个虚拟接口;
2)该类提供了枚举所有本地地址的方法,其返回值类型是 InetAddress ;
【2.1】NetworkInterface 类获取所有网络接口// NetworkInterface 类获取所有网络接口 @Test public void f4_8() throws SocketException { Enumerationinterfaces = NetworkInterface.getNetworkInterfaces(); while(interfaces.hasMoreElements()) { NetworkInterface myinterface = interfaces.nextElement(); System.out.println(myinterface); } }
打印结果如下:可以看到, NetworkInterfaces 获取的网络接口有有限网卡,无线网卡,以及虚拟网卡接口;
name:lo (Software Loopback Interface 1) name:net0 (Microsoft 6to4 Adapter) name:eth0 (VMware Virtual Ethernet Adapter for VMnet1) name:net1 (WAN Miniport (SSTP)) name:net2 (Microsoft IP-HTTPS Platform Adapter) name:eth1 (WAN Miniport (IPv6)) name:eth2 (WAN Miniport (IP)) name:ppp0 (WAN Miniport (PPPOE)) name:wlan0 (Intel(R) Dual Band Wireless-AC 8265) name:eth3 (Bluetooth Device (Personal Area Network)) name:net3 (WAN Miniport (L2TP)) name:wlan1 (Microsoft Wi-Fi Direct Virtual Adapter #2) name:net4 (WAN Miniport (PPTP)) name:eth4 (Intel(R) Ethernet Connection (5) I219-V) name:wlan2 (Intel(R) Dual Band Wireless-AC 8265-WFP Native MAC Layer LightWeight Filter-0000) name:net5 (Microsoft Teredo Tunneling Adapter) name:eth5 (VMware Virtual Ethernet Adapter for VMnet8) name:eth6 (WAN Miniport (Network Monitor)) name:net6 (WAN Miniport (IKEv2)) name:wlan3 (Microsoft Wi-Fi Direct Virtual Adapter) name:eth7 (Microsoft Kernel Debug Network Adapter) name:eth8 (Sangfor SSL VPN CS Support System VNIC) name:wlan4 (Intel(R) Dual Band Wireless-AC 8265-Virtual WiFi Filter Driver-0000) name:wlan5 (Intel(R) Dual Band Wireless-AC 8265-Native WiFi Filter Driver-0000) name:eth9 (Intel(R) Ethernet Connection (5) I219-V-WFP Native MAC Layer LightWeight Filter-0000) name:eth10 (Intel(R) Ethernet Connection (5) I219-V-QoS Packet Scheduler-0000) name:eth11 (Intel(R) Ethernet Connection (5) I219-V-WFP 802.3 MAC Layer LightWeight Filter-0000) name:wlan6 (Intel(R) Dual Band Wireless-AC 8265-QoS Packet Scheduler-0000) name:wlan7 (Intel(R) Dual Band Wireless-AC 8265-WFP 802.3 MAC Layer LightWeight Filter-0000) name:wlan8 (Microsoft Wi-Fi Direct Virtual Adapter-WFP Native MAC Layer LightWeight Filter-0000) name:wlan9 (Microsoft Wi-Fi Direct Virtual Adapter-Native WiFi Filter Driver-0000) name:wlan10 (Microsoft Wi-Fi Direct Virtual Adapter-QoS Packet Scheduler-0000) name:eth12 (WAN Miniport (IP)-WFP Native MAC Layer LightWeight Filter-0000) name:eth13 (WAN Miniport (IP)-QoS Packet Scheduler-0000) name:eth14 (WAN Miniport (IPv6)-WFP Native MAC Layer LightWeight Filter-0000) name:eth15 (WAN Miniport (IPv6)-QoS Packet Scheduler-0000) name:eth16 (WAN Miniport (Network Monitor)-WFP Native MAC Layer LightWeight Filter-0000) name:eth17 (WAN Miniport (Network Monitor)-QoS Packet Scheduler-0000) name:wlan11 (Microsoft Wi-Fi Direct Virtual Adapter-WFP 802.3 MAC Layer LightWeight Filter-0000) name:wlan12 (Microsoft Wi-Fi Direct Virtual Adapter #2-WFP Native MAC Layer LightWeight Filter-0000) name:wlan13 (Microsoft Wi-Fi Direct Virtual Adapter #2-Native WiFi Filter Driver-0000) name:wlan14 (Microsoft Wi-Fi Direct Virtual Adapter #2-QoS Packet Scheduler-0000) name:wlan15 (Microsoft Wi-Fi Direct Virtual Adapter #2-WFP 802.3 MAC Layer LightWeight Filter-0000) Process finished with exit code 0【2.2】NetworkInterface 类获取单个网络接口
// NetworkInterface 类获取单个网络接口 @Test public void f4_8_1() throws SocketException { NetworkInterface anInterface = NetworkInterface.getByName("eth0"); System.out.println(anInterface); // name:eth0 (VMware Virtual Ethernet Adapter for VMnet1) // 获取分配给该接口的ip地址 System.out.println("==== 分配给接口的所有ip地址"); anInterface.getInterfaceAddresses().forEach(x->System.out.println(x.getAddress().getHostAddress())); }
运行结果:
name:eth0 (VMware Virtual Ethernet Adapter for VMnet1)
==== 分配给接口的所有ip地址
192.168.28.1
fe80:0:0:0:c1dd:f581:1222:fd2a%eth0 (ipv6地址)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)