DIY TCP/IP ARP模块0

上一篇:DIY TCP/IP Payload Buffer模块1
7. ARP模块的实现
本章介绍DIY TCP/IP ARP模块的实现,回顾第一章可行性分析中的描述,DIY TCP/IP 上层模块包括ICMP,IP,TCP和UDP协议帧的接收和发送,都依赖于ARP先建立虚拟IP地址和运行DIY TCP/IP 主机的MAC地址的映射。便于验证,DIY TCP/IP各个模块都是先实现接收,ARP模块的实现也不例外。本章目标是对接收到的ARP Request数据帧进行回复,如果在发送ARP Request的主机上,通过ARP命令查看能够找到虚拟IP和运行DIY TCP/IP主机的MAC地址的映射,则说明ARP模块对ARP Request的处理是正确的。能够处理ARP Request之后,DIY TCP/IP就可以在此基础上实现ICMP,IP和TCP模块了。
测试方法:运行DIY TCP/IP的主机,记为A。与A处与同一局域网的另一台主机,记为B。在主机B上,ping局域网中不存在的IP地址。ping 之前先通过”arp -d”命令清除B上的ARP映射表,确保主机B在发送ping (ICMP Request)数据帧时,会先发出ARP Reqeust数据帧。ARP Request是广播帧,A主机的网卡能够收到该ARP Request,并将该ARP Request交给Linux kernel中的ARP层处理,但是 ARP request请求的IP地址是局域网中不存在的IP地址,所以A主机上Ubuntu的Linux kernel的TCP/IP协议栈不会应答。DIY TCP/IP的ARP模块完成对不存在的IP地址的ARP Request的应答,建立虚拟IP与主机A MAC地址的映射。相当于为主机A虚拟一个局域网中不存在的IP地址。如果读者再尝试ping 主机A的网络接口的真实IP地址,就可以在B主机的ARP映射表找到两个IP地址与主机A的MAC地址对应,一个IP是主机A的网络接口的真实IP,另一个IP是不存在的DIY TCP/IP 的IP。
7.1 ARP Request和ARP Reply的帧结构
先来看一下正常的ARP Request和ARP Reply是如何发出的,本节继续使用,本章开头测试方法中定义的主机A和主机B。主机B是windows操作系统,打开windows的命令行界面cmd,通过arp –a 查看arp映射表,如果主机A的IP地址和MAC地址的映射条目已经存在,则通过arp –d xxx.xxx.xxx.xxx删除该条目,然后在命令行中输入ping 主机A的IP地址,通过wireshark抓包,结果如下:
DIY TCP/IP ARP模块0
上图是主机A上wireshark的抓包结果:第1列是帧序号,第2列是时间戳,第3列是源IP地址,第4列是目标地址。无IP地址的情况在wireshark软件中显示MAC地址,有IP地址的情况显示IP地址,第5列是协议字段,第6列是帧长度,第7列是wireshark对数据帧有效载荷的部分内容的字符解释。主机B上删除了arp表中的内容后,ping主机A,主机B首先发出的是广播帧ARP Request,然后主机A回应单播帧ARP Reply。有的朋友会发现跟在ARP Reply后面的ICMP数据帧,该数据帧是主机B发出的ICMP Echo数据帧,这部分内容在实现DIY TCP/IP的ICMP 模块时引入。
ARP Request
DIY TCP/IP ARP模块0
上图是ARP Request数据帧在wireshark中的解析,以太网头部后面是ARP Request数据帧的内容。可以看出ARP与IP同处于以太网之协议上,属于同一层协议。以太网的目的地址为广播地址,源地址为主机B的MAC地址,协议类型为0x0806,ARP Request的帧结构如下表:
有关ARP协议的详细内容,感兴趣的朋友可以参考RFC6747。本节的目的不在于介绍ARP协议的详细内容,而是弄清楚怎样解析ARP Request以及怎样回复正确的ARP Reply,然后写代码实现。
DIY TCP/IP ARP模块0
0x0806可以解析出,以太网头部后面的有效载荷为ARP帧。通过ARP数据帧的operation code可以解析出ARP帧的类型为ARP Request,发送ARP Request的主机B不知道Target IP对应的MAC地址,所以Target MAC为全0,Sender MAC和IP为主机B的MAC地址和IP地址。
ARP Reply
DIY TCP/IP ARP模块0
ARP Reply的帧结构与ARP Request帧结构一致,不同之处是发送ARP Reply的主机已经知道的对方的MAC地址,所以ARP Reply为单播帧,以太网头部类型字段为0x0806,ARP 的operation code为0x02,Sender和Target的MAC和IP地址均为有效值。
下一篇:DIY TCP/IP ARP模块1