计算机网络实验(二)

计算机网络实验目录

  • 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流程:

  1. 初始化arp协议,将arp协议加入协议栈
  2. 广播一个announcement请求,相当于告诉网络我要用这个IP地址(192.168.163.103)
  3. 希望向192.168.163.10发送ip数据包,需要对应的mac地址
  4. 查询IP为192.168.163.10的host的mac地址,arp缓存中不存在,于是将待发送的数据包存入buff里面,等待reply
  5. 广播arp request
  6. 收到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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值