zoukankan      html  css  js  c++  java
  • 【网络协议】ARP地址解析协议

    地址解析协议ARP

    在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。所谓地址解析(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。

    对于TCP/IP网络,地址解析协议ARP提供了一种在IPv4地址和各种网络技术使用的硬件地址之间的映射。这里的ARP仅用于IPv4,IPv6使用邻居发现协议,被合并入ICMPv6中。

    ARP是一个通用协议,被设计为支持多种地址之间的映射。但是,实际中ARP总是被用于32位IPv4地址和48位MAC地址之间的映射。

    参考自维基百科

    一个例子介绍ARP运行过程

    仅在到达同一子网的主机,ARP才能工作。这里,主机A (IP地址192.168.38.10 MAC地址 00-AA-00-62-D2-02)使用Web浏览器访问位于同一子网中的服务器(IP地址192.168.38.11 MAC地址00-BB-00-62-C2-02)使用直接交付的过程。

    运行结果图2

    IPv4直接交付基本步骤

    1. 应用程序要求TCP协议建立一条到192.168.38.11的连接。

    2. 向192.168.38.11发送一个IPv4数据报,TCP尝试向远程主机发送一个连接请求。

    3. 位于同一子网,则数据报交付不经过任何路由器。

    4. 在将数据报封装进以太网帧之前需要将32位的IPv4目的主机转换为48位的以太网地址。

      主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到就知道目标MAC地址(00-BB-00-62-C2-02),直接把目标MAC地址写入帧里面发送就可。

      否则,就需要ARP。


      ARP工作在正常模式下,仅适用于广播网络,链路层能将一个消息交付到它所链接的所有设备。

      在非广播网络中,可能需要更复杂的映射协议[RFC 2332]。

    5. 在一个共享的链路层网段上,ARP向所有主机发送一个ARP请求的以太网帧(目标MAC地址是“FF.FF.FF.FF.FF.FF”),即进行链路层广播

      ARP请求包含的内容包括发送请求主机的MAC地址和IP地址,并寻找答案:“如果你的IPv4地址为192.168.38.11,请向我回应你的MAC地址”。

    6. 同一广播域中的所有系统都可接收该ARP请求,收到以太网帧的系统可能包括并不运行IPv4或IPv6协议的系统,但不包括位于不同VLAN中的系统。

      如果某个系统所使用的IPv4地址是ARP请求中指定的地址,该系统将向发送请求的主机以单播方式响应一个ARP应答。其余主机不响应这个请求。

      同时,接收ARP请求的主机学习IPv4到MAC地址的映射,并记录在内存中供以后使用

    7. ARP应答被原始请求的发送方接收,现在就可以发送引起这次ARP请求/应答交换过程的数据报了。

      将数据报封装在以太网帧中,以ARP交换学习到的以太网地址作为目的地址,将帧发送给目的主机。这是直接交付,所以不需要使用路由器。并且也会将这次映射更新在ARP缓存,以便下次查表就行。


    ARP用于运行IPv4的多接入链路层网络,每个主机都有自己的首选硬件地址。
    在点对点链路中不使用ARP,实际上在点对点网络中也不使用MAC地址,因为在此类网络中分别已经获取了对端的IP地址。

    另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为委托ARP或ARP代理(ARP Proxy)

    ARP缓存

    ARP能够高效运行是因为ARP维护着每个主机个路由器上的ARP缓存(或表)。该缓存使用地址解析为每个接口维护从网络层地址到硬件地址的最新映射。当一个映射条目被创建时,其正常到期时间是条目创建开始后的20分钟。

    在Linux或Windows中可使用arp命令(百度百科)查看arp缓存。

    ARP帧格式

    了解了ARP运行的基本过程,下面继续深入了解ARP帧的具体格式。

    运行结果图2

    上图为IPv4地址映射到48位的MAC地址时使用的ARP请求和应答分组的格式。

    • 在ARP帧的以太网头部中,DST和SRC分别代表目的和源的以太网地址。

      对于ARP请求,DST为ff:ff:ff:ff:ff:ff,即广播地址。

    • 在以太网帧中,对于ARP(请求或应答),2字节长度的长度或类型字段的值必须为0x0806。

    • 固定大小的前四个字段指出了可变大小的四个字段的类型和大小。

    • 硬件类型指出硬件地址类型。对于以太网该值为1。

      协议类型字段指出映射的协议地址类型。对于IPv4地址,该值为0x0800。

    • 硬件大小和协议大小分别指出硬件地址和协议地址的字节数。

      对于以太网中使用IPv4地址的ARP请求或应答,它们的值分别为6和4。

    • Op字段指出该操作是ARP请求(值为1),ARP应答(值为2),RARP请求(值为3)或RAPR应答(值为4)(RAAP是ARP的反向映射协议)。

      此字段用于区分ARP分组是请求还是应答分组。

    • 这后面的四个字段如图上描述。这里也会出现一些重复信息:以太网头部和ARP消息都包含发送方的硬件地址。

      在ARP请求中,除目的硬件地址(设为0)外,其他字段都要填充。

      在ARP应答中,接收主机收到请求填上自己的硬件地址,并置换源和目的地址,Op设为2。

    与ARP相关的一些补充

    ARP缓存超时

    在大多数实现中,完整条目的超时时间为20分钟,不完整条目(如强迫执行一次到不存在主机的ARP请求)为3分钟。[RFC 1122]中规定条目即使在使用时也启动超时,但是很多实现是在每次使用条目后启动超时。


    这是关于软状态的一个重要例子。软状态是指在超时到达前没有更新而被丢弃的信息。
    如果网络条件发生变化,软状态有助于启动自动重新配置,因此很多Internet协议使用软状态。
    软状态的成本是协议必须刷新状态以免过期。
    在一些协议设计中,经常包含“软状态”刷新,以保持软状态活跃。

    代理ARP

    代理ARP使一个系统(通常为一个专门配置的路由器)可回答不同主机的ARP请求。

    它使ARP请求发送者认为做出响应的系统就是目的主机(目的主机在其他地方)。


    代理ARP也被称为混杂ARP或者ARP黑客。这两个名词源于代理ARP的用途:两个物理网络互相隐蔽自己。
    从前,一个网络使用代理响应其他网络对于自己的请求,有两个常见原因:①有些系统无法进行子网划分②有些系统使用比较久的广播地址

    免费ARP

    ARP还有一个功能被称为免费ARP。通常发生在启动,接口被配置为“上行”,一台主机发送ARP请求寻址自己的地址时。

    免费ARP需要达到两个目标:

    • 允许一台主机确定另一台主机是否配置相同的IPv4地址。

      发送免费ARP的主机并不期望收到应答。但是,若收到一个应答,通常显示的就是错误消息:“从以太网地址······发送的重复IP地址”。

    • 如果发送免费ARP的主机以已改变硬件地址(关闭主机或替换接口卡,然后重新启动主机),
      该帧导致任何接收广播并其缓存中有该条目的其他主机,将该条目中地旧硬件地址更新为与该帧一致。

    免费ARP提供的一些迹象显示,多个站可以尝试使用相同的IPv4地址,但是没有对产生IP地址冲突有解决机制。为解决这个问题,[RFC 5227]描述了IPv4地址冲突检测(ACD),采用一种持续的类似于免费ARP的交换,来避免在同一广播域中地址重复。

    推荐使用DHCP分配地址。


    《TCP/IP详解 卷1》学习笔记

  • 相关阅读:
    Compression algorithm (deflate)
    tcpip数据包编码解析(chunk and gzip)_space of Jialy_百度空间
    What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
    gzip压缩算法: gzip 所使用压缩算法的基本原理
    Decompressing a GZip Stream with Zlib
    Frequently Asked Questions about zlib
    how to decompress gzip stream with zlib
    自己动手写web服务器四(web服务器是如何通过压缩数据,web服务器的gzip模块的实现)
    What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
    C语言抓http gzip包并解压 失败 C/C++ ChinaUnix.net
  • 原文地址:https://www.cnblogs.com/myworld7/p/8430223.html
Copyright © 2011-2022 走看看