IP地址是分配给主机的逻辑地址,在因特网中表示唯一的主机。
任何子网中的主机至少都有一个在子网内部唯一的地址,这种地址都是在子网建立时一次性指定的,甚至可能是与网络硬件相关的,我们把这个地址叫做主机的物理地址或硬件地址。
物理地址和逻辑地址的区别可以从两个角度看:从网络互联的角度看,逻辑地址在整个因特网中有效,而物理地址只是在子网内部有效;从网络协议分层的角度看,逻辑地址由Internet层使用,而物理地址由子网访问子层(数据链路层)使用。由于有两种主机地址,因此需要一种映像关系把这两种地址对应起来。在Internet中是用地址解析协议(Address Resolution Protocol,ARP)来实现逻辑地址到物理地址映像的。
ARP工作于数据链路层。IP协议工作于网络层,意味着使用IP地址标示的网络地址只为工作于网络层及网络层以上的协议提供寻址的能力,即IP不能够向网络中工作的物理设备提供寻址的能力,ARP协议解决了这个问题。
在以太网中,网络设备是通过物理地址相互表示的,这个物理地址也就是48位的以太网地址。ARP协议就是用来将32位的IP地址解析为48位的以太网地址。ARP协议的格式如下表所示:
0~7位 | 8~15位 | 16~23位 | 24~31位 | ||||
硬件类型(硬件地址空间) | 协议类型(协议地址空间) | ||||||
硬件地址长度 | 协议长度 | 操作 | |||||
源硬件地址(0~31位) | |||||||
源硬件地址(31~47位) | 源IP地址(0~15位) | ||||||
源IP地址(0~15位) | 目标硬件地址(0~15位) | ||||||
目标硬件地址(16~47位) | |||||||
目标IP地址 |
(1)硬件类型字段指明了发送方想知道的硬件接口类型,以太网的值为1。
(2)协议类型字段指明了发送方提供的高层协议类型,IP为0x0806。
(3)硬件地址长度和协议长度指明了硬件地址和高层协议地址的长度,这两个字段主要是为了使ARP协议能够工作于不同类型的网络中。
(4)操作字段用来表示ARP报文操作类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4。
ARP工作时首先会发送一个ARP请求,其中包括自己的物理地址和IP地址,以及想要解析的目标IP地址。需要注意的是,虽然这个时候知道目标的IP地址,但是由于不知道目标的物理地址,所以数据报是无法直接发送给对方的,因此ARP请求采用广播方式发送。从这里也可以看出底层协议和高层协议的区别——越是底层的协议,能够获得的服务就越少,如果没有网络分层的设计,编程网络应用程序将变得异常复杂。
当ARP请求中所指明的目的主机收到ARP请求后,它会将自己的物理地址通过ARP响应回送给请求者,此时ARP请求者将会把这对物理地址和IP地址的映射关系放到自己的ARP缓存中,以避免重复地请求。
在TCP/IP环境中,虽然IP地址指明了数据包的目的地,但在网络层之下,还需要ARP对物理地址进行解析。也就是说,从网络层以上进行观察,数据包正确地发送到接收方,但如果在接收方的网络中发送伪造ARP数据包,那么就可以将自己的物理地址同任何一个IP地址建立起关联关系,从而可以截获到本不属于它的数据包,这就是ARP欺骗。
不过ARP欺骗也可以为人民服务,使用ARP欺骗技术可以实现防火墙的透明接入,即防火墙内部的主机和防火墙外部网络的路由器不需要做任何更改就可以在网络中部署防火墙。
RARP是ARP的逆过程。ARP将IP地址转化为物理地址,而RARP将物理地址转化为IP地址。
RARP的首部同ARP几乎完全一样,仅仅在操作字段,RARP请求为3,RARP响应为4.但相比之下,RARP的实现比ARP更为复杂。这是由于在网络中提供RARP服务的服务程序需要维护一个硬件地址到IP地址转化的数据库,而作为在内核中实现的TCP/IP程序不可能在内核中维护这样的一个数据库。因此,RARP一般使用一个用户进程实现,而不是放在内核中,同时RARP是一个数据链路层协议,因此它的实现依赖于特定的系统。在一个物理网络中,为了确保RARP客户端一定能够接收到RARP服务器的回应,经常会设置不止一台的RARP服务器。一般的RARP客户端以接收到的第一个RARP响应为准,不过多个工作在数据链路层的RARP服务器使以太网发生冲突的可能性大大增加。