TCP/IP协议之ARP协议
以太网采用MAC地址来识别局域网内的每个网卡(主机)。但是,在网络层中需要的是一个网络地址(IP地址)来实现网络互连。IP地址有32位组成,MAC由48位组成,那么数据链路层地址(MAC)与IP地址之间是通过ARP协议(地址解析协议)实现的。地址解析(ARP)协议的作用是实现MAC地址与IP地址之间的转换,ARP的过程实际上就是MAC地址和IP地址交叉引用的过程,这些交叉引用存储在ARP缓存表中,这是TCP/IP栈中的一种数据结构。网络中的每个工作站都有其ARP缓存表。
struct etharp_hdr {
PACK_STRUCT_FIELD(struct eth_hdr ethhdr); // 14字节的以太网首部
PACK_STRUCT_FIELD(u16_t hwtype); // 2字节硬件类型
PACK_STRUCT_FIELD(u16_t proto); // 2 字节协议类型
PACK_STRUCT_FIELD(u16_t_h wlen_protolen); //硬件地址长度,协议长度
PACK_STRUCT_FIELD(u16_t opcode); // 2字节操作op
PACK_STRUCT_FIELD(struct eth_addr shwaddr); // 6字节发送端MAC地址
PACK_STRUCT_FIELD(struct ip_addr2 sipaddr); // 4字节发送端IP地址
PACK_STRUCT_FIELD(struct eth_addr dhwaddr); // 6字节接收端MAC地址
PACK_STRUCT_FIELD(struct ip_addr2 dipaddr); // 4字节接收端IP地址
}PACK_STRUCT_STRUCT;
2、ARP请求分组或应答分组
以太网首部总共有14字节数据,ARP请求报文总共有28字节。所以一个ARP请求分组或应答分组总共有46字节数据。
而以太网数据包的最小数据为60字节。所以,要对其进行填充。这里有一些重复信息
(1)在以太网的数据帧报头中和ARP请求数据帧中都有发送端的MAC物理地址。
(2)在发送ARP请求时,以太网帧头中的目的MAC物理地址为FF-FF-FF-FF-FF-FF,而在ARP帧中的目的MAC处此时为空。
(3)对一个ARP请求来说,除ARP中目的端MAC硬件地址外的所有其他的字段都有填充值。当系统收到一份目的端为本地的ARP请求报文后,它就把硬件地址填进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,最后发送出去。
三、工作原理
(1)同一局域网内的两个主机间通讯
1)当主机A向本局域网上的某个主机B发送IP数据报时,就先在自己的ARP缓冲表中查看有无主机B的IP地址。
2)如果有,就可以查出其对应的硬件MAC地址,再将此硬件MAC地址写入MAC帧,然后通过以太网将数据包发送到目的主机中。
3)如果查不到主机B的IP地址对应的MAC表项。可能是主机B才入网,也可能是主机A刚刚加电。其高速缓冲表还是空的。在这种情况下,主机A就自动运行ARP。
A.ARP进程在本局域网上广播一个ARP请求分组。ARP请求分组的主要内容是表明:我的IP地址是192.168.0.2,我的硬件MAC地址是00-00-C0-15-AD-18.我想知道IP地址为192.168.0.4的主机的硬件MAC地址。
B.在本局域网上的所有主机上运行的ARP都收到此ARP请求分组。
C.主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分组,并写入自己的硬件MAC地址。其余的所有主机都不理睬这个ARP请求分组。ARP响应分组的主要内容是表明:“我的IP地址是192.168.0.4,我的硬件地址是08-00-2B-00-EE-AA”,请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
D.主机A收到主机B的ARP响应分组后,就在其ARP高速缓冲表中写入主机B的IP地址到硬件MAC地址的映射。
######################################################################
事例说明:用ping说明ARP工作的原理
假设我们的计算机IP地址是192.168.1.1,要执行这个命令:ping192.168.1.2。该命令会通过ICMP协议发送ICMP(以太网控制报文协议)数据包,该过程需要经过下面的步骤:
1) 应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);
2)内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
3)如果存在该IP-MAC对应关系,那么跳到步骤7 );如果不存在该IP-MAC对应关系,那么接续下面的步骤;
4 )内核进行ARP广播,目的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;
5 )当192.168.1.2主机接收到该ARP请求后,就发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;
6 )本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;
7 )内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;
######################################################################(2)不同局域网内的两个主机间通讯
两个局域网之间的通讯需要用到IP协议,默认网关用于将本地网络主机与其它网络连接。
1)源主机与目的主机之间所发送数据包的IP头中包含源主机与目的主机的IP地址
2)TCP/IP协议栈的IP层计算源主机的网络地址,及IP地址与子网掩码相与,得到一个网络地址,即主机的网络地址;
3)确定目标地址是否在本网络中,即将网络接口的子网掩码与目的IP地址相与,同样得到一个网络地址;
4)比较上述2个地址是否相同。如果相同,则使用MAC地址通过局域网发送数据包给目的主机;如果不同,表明目的主机和源主机不在同一个网络内,源主机需要找到一个可以转发信息的设备,该设备即为默认网关,或为连接在局域网中的路由器。
默认网关可以使一个路由器,他通过一个接口与网络相连。主机发送信息给默认网关。因为默认网关同样是本网络内的一个主机,在发送信息前,源主机需要在以太网下使用ARP协议,得到默认网关的物理地址(路由器的MAC)。