计算机网络实验目录
- eth协议实现
- ARP协议实现
- RIP路由配置和协议分析
- IP协议实现
- ICMP协议实现
- UDP协议实现
- NAT组网
- 邮件客户端的设计与实现
前言
HITSZ 2022春计算机网络实验完成记录+复习总结
实验网址
基础知识
一、ARP解析协议
`ARP协议以目标IP地址为线索,用来定位下一个应该接收数据包的网络设备对应的MAC地址。如果目标主机不在同一个链路上,可以通过ARP查找下一跳网关的MAC地址。
二、工作机制
同一网段的ARP解析
如下图所示,主机A需要发报文给主机B,如果在缓存中找不到相应的记录,就必须先解析主机B的硬件地址。主机A首先在网段内通过广播发出ARP请求报文,由于广播的包可以被同一个链路上所有的主机或路由器接收,因此ARP的请求包也就会被这同一个链路上所有的主机和路由器进行解析。主机B收到后,判断报文的目的IP是本主机的IP地址,便将本主机的硬件地址写入应答报文,发送给主机A,主机A收到后将其存入缓存中,则解析成功,然后才将报文发往主机B。
不同网段ARP解析
如下图所示,主机A要发报文给主机C,首先主机A分析目的地址不在同一个网段,需要将报文先发给其默认网关,再由默认网关转发。如果没有找到默认网关的硬件地址,便发送ARP请求报文,请求默认网关的硬件地址,默认网关收到之后,将自己的硬件地址写入应答报文,发送给主机A。然后,主机A到主机C的报文首先被送到默认网关。默认网关再根据报文的目的IP地址进行转发,以此类推,直至报文送到主机C中。主机C到主机A的报文以相反的顺序发送。
三、ARP请求报文格式
ARP是一个独立的三层协议,所以ARP报文在向数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再对应的数据链路层(如以太网协议)进行封装ARP报文分为ARP请求和应答报文两种,报文格式如下图所示。
其中,每个字段的含义如下表所示:
- 硬件类型:表示ARP报文可以在那种类型的网络上传输,为1表示为以太网地址
- 上层协议类型:表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800
- MAC地址长度:标识MAC地址长度,字节为单位
- IP地址长度:标识IP地址长度,字节为单位
- 操作类型:指定本次ARP报文类型,1标识ARP请求报文,2标识ARP应答报文
- 源MAC地址
- 源IP地址
- 目的MAC地址:标识接收方设备的硬件地址,在请求报文中字段的值全为0,即00-00-00-00-00-00,标识不知道MAC地址
四、ARP表
无论是主机,还是交换机或路由器都会有一个用来缓存同一网段设备IP地址和MAC地址的ARP映射表,用于数据帧的转发。设备通过ARP解析到目的MAC之后,将会在自己的ARP映射表中增加IP地址到MAC地址的映射表,以用于后续到同一目的地数据帧的转发。ARP表项分为动态ARP表项和静态ARP表项。
动态ARP表
动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,也可以被静态ARP表项所覆盖。当到达老化时间或接口关闭时会删除相应的动态ARP表项。
静态ARP表
不超时删除条目
实验
需要实现的函数:
- arp_req:发送Announcement和arp请求报文的函数
- arp_out:查找ARP表发送IP数据包,如果没有找到需要广播arp请求
- arp_in:收到数据包的处理,有可能收到回复arp请求的数据包,也可能收到arp请求
- arp_resp:发送arp响应
实验test流程:
- 初始化arp协议,将arp协议加入协议栈
- 广播一个announcement请求,相当于告诉网络我要用这个IP地址(192.168.163.103)
- 希望向192.168.163.10发送ip数据包,需要对应的mac地址
- 查询IP为192.168.163.10的host的mac地址,arp缓存中不存在,于是将待发送的数据包存入buff里面,等待reply
- 广播arp request
- 收到reply后,将 < i p , M a c > <ip, Mac> <ip,Mac>存入arp缓存表中,同时发现buff中有等待发送到192.168.163.10的数据包,于是调用ethernet_out发送数据
注意事项:A向B request时,A为sender,B为target;B向A reply时,B为sender,A为target;同时还需要注意,再知道mac地址后,调用ethernet_out发送时使用的上层协议就不再是ARP而是IP了
static const arp_pkt_t arp_init_pkt = {
.hw_type16 = swap16(ARP_HW_ETHER),
.pro_type16 = swap16(NET_PROTOCOL_IP),
.hw_len = NET_MAC_LEN,
.pro_len = NET_IP_LEN