本文参考自《Java高级程序设计》清华大学出版社,侵删
网络协议结构:层次式
好处:
1.各层功能相互独立,可降低耦合,提供接口互相调用。
2.扩展相对灵活,需要修改协议功能时,只需修改指定层服务即可,层与层之间不互相影响。
3.易于实现和维护。
4.协议制定独立灵活。
OSI模型(7层):物理层、数据链路层、网络层、运输层、会话层、表示层、应用层。
因协议过于复杂、运行效率低、指定周期长等缺点,未得到广泛应用。
TCP/IP模型(4层)(网络协议标准):网络接口层、网际层、运输层、应用层。
网络接口层:OSI模型中的物理层和数据链路层。
是TCP/IP与各种LAN或WAN的接口。
在发送端将上册的IP数据报封装成帧后,发送到网络上;
数据帧通过网络到达接收端时,该节点的网络接口层对数据帧拆封,并检查帧中包含的MAC地址,
如果该地址是本机的MAC地址或者广播地址,则上传到网络层,否则丢弃该帧。
主要协议:Ethernet 802.3 , Token Ring 802.5 , X. 25 , Frame relay , HDLC , PPP , ATM
网际层:
实现互联网络环境下的端到端数据分组传输(采用无连接交换方式完成)。
提供基于无连接的数据传输、路由选择、拥塞控制、地址映射等功能。
主要协议:IP(提供数据分组传输,路由选择等功能)、ARP、RARP(ARP、RARP提供逻辑地址与物理地址映射功能)、ICMP(提供网络控制和差错处理功能)
运输层:
为应用进程之间提供端到端的逻辑通信。
还对收到的保温进行差错检测。
主要协议:面向连接的TCP和面向无连接的UDP(不可靠)
应用层:
直接为用户的应用进程提供服务。
主要协议:HTTP , SMTP(电子邮件传输协议), FTP(文件传输协议)
IP地址:IPv4 和 IPv6 两种。
IPv4:
32位二进制表示,通常表示成4组,每组8位形式。
点分十进制,如:127.0.0.1
IPv6:
128位二进制表示,大大增加了地址的数量。
Java对这两种IP地址都进行了封装,实现类分别是:
Inet4Address , Inet6Address ,他们都继承了类 InetAddress
InetAddress的实例对象包含以数字形式保存的IP地址,还可能包含主机名。
提供了将主机名解析为IP地址和反向解析的方法。
对域名进行解析时使用本地机器配置或网络命名服务(如 域名系统(DNS))和网络信息服务(NIS)来实现。
为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址时,就不需要重复发送DNS请求。
对于主机名解析不成功的结果,会缓存10s来提高性能。
因为InetAddress的构造方法不是公有的,只能通过InetAddress提供的静态方法获取InetAddress对象:
static InetAddress[] getAllByName (String host)
static InetAddress getByAddress(byte[] addr)
static InetAddress getByAddress(String host, byte[] addr)
static InetAddress getByName (String host) 最常用 传入目标主机名,获取IP地址
static InetAddress getLocalHost() 返回本地的IP地址
import java.net.InetAddress;
public class NetTest {
public static void main(String[] args) throws Exception {
InetAddress address = InetAddress.getByName("www.sina.com.cn");
System.out.println("========获取新浪的IP地址========");
System.out.println(address.toString());
InetAddress[] addresses = InetAddress.getAllByName("www.sina.com.cn");
System.out.println("======获取新浪的IP地址列表=======");
for(InetAddress add : addresses){
System.out.println(add.toString());
}
}
}
输出结果:
========获取新浪的IP地址========
www.sina.com.cn/27.221.16.254
======获取新浪的IP地址列表=======
www.sina.com.cn/27.221.16.254
www.sina.com.cn/115.238.190.240
www.sina.com.cn/140.249.5.49
import java.net.InetAddress;
public class NetTest {
public static void main(String[] args) throws Exception{
InetAddress address = InetAddress.getLocalHost();
System.out.println(address.toString());
}
}
输出结果:
DESKTOP-EQK2KED/169.254.116.158
获取InetAddress对象后,就可以使用其定义的方法:
String getHostAddress() 获取本地IP地址字符串
String getHostName() 获取本地计算机的名称
Boolean isMulticastAddress() 判断是否是多播地址
Boolean isReachable(int timeout) 判断在指定的时间内是否可达
多播是一种允许一个或者多个发送者发送单一数据包到多个接收者的网络技术。
多播地址是一个48位的标示符,命名了一组应该在这个网络中应用接收到一个分组的站点。多播使用一种虚拟组地址的概念进行工作, 数据包的目的地址不是一个而是一组, 形成多播组地址, 因此, 为多播通信保留了大量多播地址空间。