TCP/IP协议族的数据链路层基础(2)——ARP协议

ARP协议( Address Resolution Protocol
    ARP协议是一个介于数据链路层和网络层之间的协议,它建立了主机IP地址和MAC地址的映射关系。ARP协议是一种用以解析地址的协议,根据通信双方的IP地址就可以反查出对应的MAC地址。
  • 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
  • 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符(即MAC地址不匹配),则直接丢弃
  • 因此在通讯前必须先知道目的主机的MAC地址





ARP数据报格式

  • 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现过一次,对于链路层是以太网的情况是多余的,但如果数据链路层是其他类型的网络则有可能是必要的
  • 硬件类型是指物理地址的类型,1表示MAC地址
  • 协议类型指要转换的地址类型,0x0800为IP地址
  • 硬件地址长度对于MAC地址为6
  • 协议地址长度对于IP(v4)地址为4
  • op字段为1表示ARP请求,为2表示ARP应答,为3表示RARP请求,为4表示RARP应答
  • 最后4个字段指定通信双方的以太网地址和IP地址。发送端填充除目的端以太网地址以外的其余三个字段,以构建ARP请求并进行发送。接收端发现该请求的目的IP地址是自己,就把自己的以太网地址填进去,然后交换两个目的端地址和发送端地址,以构建ARP应答并进行返回(op字段需要设置为2)

    上面的ARP请求/应答报文的长度为28字节。如果再加上以太网头部的14字节和尾部的4字节,则一个携带ARP请求/应答报文的以太网帧长度为46字节。不过有的实现要求以太网帧数据部分至少为46字节(这里加上头尾才46字节),那么ARP请求/应答将填充一些字节,这种情况下,一个携带ARP请求/应答的报文的以太网帧长度为64字节(46+18)。

ARP协议工作流程
  • 源主机发出ARP请求,询问IP地址为192.168.0.1的主机的硬件地址是多少,并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)
  • 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP响应数据包给源主机,将自己的硬件地址告诉源主机
  • 每台主机维护一个ARP缓存表,可以用arp -a查看。 缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发送ARP请求来获得目的主机的硬件地址
         
  • 可以通过arp -d和arp -s分别来删除和添加表项
           

这里我们使用tcpdump抓包工具来看下ARP的通信过程
  • 首先我有两台虚拟机,一台的IP地址是192.168.224.136,上面已经启动echo服务,我们称它为主机A,另一台的IP地址是192.168.224.138,我们称它为主机B
  • 我们要做的是在主机A上开启tcpdump抓包,执行下面的命令
sudo tcpdump -i ens33 -ent '(dst 192.168.224.136 and src 192.168.224.138) or (dst 192.168.224.138 and src 192.168.224.136)'
    • tcpdump抓取的数据包本质上是以太网帧,可以通过该命令的众多选项来控制帧的过滤(比如用dst和src指定目的IP和源IP)和显示(用-e显示以太网头部信息)
  • 接下来在主机B上启用telnet远程登录服务,来登录主机A上的echo服务,执行下面的命令
telnet 192.168.224.136 echo

  • 执行这一句命令之后,按下ctrl+]并回车,进入到telnet>这个命令行,在输入quit并回车,退出远程登录(因为ARP通信在TCP连接建立之前就已经完成,我们不关心后续内容)
  • 下面是我们抓包抓到的关键内容

  • 第一个数据包中,源端的物理地址00:0c:29:08:04:78是主机B的物理地址,目的端的物理地址是ff:ff:ff:ff:ff:ff,这是以太网的广播地址,用来表示整个局域网。当目的端是这样的时候,整个局域网当中的所有机器都会收到这样一条帧,帧的类型是ARP(0x0806),表示帧进入目的主机以后要分用给ARP协议。该以太网帧的长度是60个字节(实际上是64个字节,因为tcpdump未统计以太网尾部4个字节的CRC校验字段),其中数据部分长度为46字节。“Request”表示这是一个ARP请求,“who-has 192.168.224.136”则表示主机B要查询主机A的物理地址。
  • 第二个数据包中,源端的物理地址00:0c:29:b8:0e:8b是主机A的物理地址,目的端的物理地址是00:0c:29:08:04:78是主机B的物理地址。“Replay”表示这是一个ARP应答,“192.138.224.136 is-at ”00:0c:29:b8:0e:8b则表示主机A告诉了主机B的物理地址。
       
用图来清晰地看一下
 

    

    
    注意:路由器会接收到以太网帧1的内容,但是不会收到以太网帧2的内容

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值