TCP/IP协议族【第8章地址解析协议APR】

来源:互联网 发布:七腾软件科技有限公司 编辑:程序博客网 时间:2024/06/16 12:14

8.1 地址映射

 在网络这一级,主机和路由器是通过它们的逻辑地址(IP地址)来识别的。逻辑地址在全局是唯一的。

在物理这一级别,主机和路由器通过本地地址来识别。

8.1.1 静态映射

把物理地址与逻辑地址映射到一张表。保存到每一台机器,缺点:需要定期更新

8.1.2 动态映射

使用协议根据逻辑地址找出静态地址。目前有两种协议:

地址解析协议(APR):把逻辑地址解析成物理地址、

逆地址解析协议(RARP)。把物理地址解析成逻辑地址(已被其他协议替代)

8.2 APR协议

APR接受来自IP协议的逻辑地址,将其映射成物理地址,然后再把物理地址递交给数据链路层。

ARP工作时,送出一个含有所希望的IP地址的以太网广播数据包(包含发送方的物理地址,ip地址,接收方的IP地址)。网络上的没太主机或者路由器都会收到广播,但只有期待的接收方才能认出是自己的IP地址,并以一个含有IP和以太网地址对的数据包作为应答,以单播的形式响应查询者。

8.2.1 分组格式


硬件类型字段指明了发送方想知道的硬件接口类型,以太网的值为1。

协议类型字段指明了发送方提供的高层协议类型,IP为0806(16进制)。

硬件地址长度和协议长度指明了硬件地址和逻辑地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用。

操作字段用来表示这个报文的目的,ARP请求为1,ARP响应为2,

8.2.2 封装

APR数据直接封装在数据链路层的帧中


8.2.3 操作

APR请求采用广播发送,APR应答采用单播发送。

发送方收到回应后,就知道目标机器的物理地址了。然后携带有给目标机器的IP数据报就封装成帧,以单播的方式发送到终点。

8.3 ATMAPR

ATM 地址识别协议(ATM Address Resolution Protocol)

8.3.1 分组格式


8.3.2 ATMAPR操作

永久虚电路:PVC连接

在PVC的情况下,反向请求报文(inverse request message)和反向应答报文(inverse reply message)可以把物理地址和IP绑定起来。

SVC链接:路由器想和另一个路由器(或主机)建立连接时,必须建立一条新的虚电路。

建立过程3个步骤:连接服务器,收到新物理地址,建立连接

在SVC的情况下,用请求报文和回答报文可以将物理地址跟IP地址绑定。

用请求报文和回答报文也可以用来构建服务器的映射表。

8.3.3 逻辑子网(LIS)

LIS允许把ATM划为若干个逻辑子网,要使用ATMAPR,各子网中都需要一个独立的服务器。

8.4 APR软件包



8.4.1 高速缓存表

空间有限,表中的映射关系不能无时间限制保存。

状态、硬件类型、协议类型、硬件地址长度、协议地址长度、接口号、队列号、尝试、超时、硬件地址、协议地址

8.4.2 队列

ARP协议维护着一个队列,每个队列维护一个终点。用来在ARP尝试解析硬件地址的时候保存IP分组。

输出模块把未解析的IP分组发送到相应的队列,输入模块从队列中取出分组,并联通解析出的物理地址一并发给数据链路层传输。

8.4.3 输出模块

ARP——output——module{sleep,等待接受来自IP软件的IP分组检查高速缓存表,寻找IP分组对应的物理地址if(找到){    if(状态是 resolved)     {        从该表项提取硬件地址对应的值        把分组连同物理地址发送到数据链路层         return     }     if( 状态是 pending){     把分组放入响应的队列,     return          }}else{//没找到            创建一个高速缓存表项,状态是pending。attempts为1          创建一个队列     把分组放入队列     发送一个ARP请求     return}}

8.4.4 输入模块

ARP——input——module{sleep,直到一个ARP请求(或者回答)到达检查高速缓存表,寻找相应的表项if(找到){更新这个表项if( 状态是 pending){while(相应的队列非空){  从队列取分组   把这个分组连同物理地址一起发送   }}}  if(未找到){    创建一个表项    把新建的表项放入表  }  if(这个分组是请求分组)  {    发送ARP回答  }}

8.4.5 高速缓存控制模块

cache control module负责维护高速缓存表。

ARP_cache_control_module{sleep,定时任务结束for(表项){   if(状态为free)    {      继续        }    if(状态为pending ){    把尝试值+1      if(尝试 >最大数 )       {         把状态改为free         撤销相应的队列              }       else{         发送一个ARP请求       }    }    if(状态为 resolved)    {        递减超时字段的值        if(超时字段值<=0)        {        把状态改为free        撤销效应的队列        }    }}}

**************************************************************************


在本地测试下。

简单的ping下。可以看到上面有个43广播。我本机没有回应。

44 我发出一个广播 who has ....,45收到目标机器的单独回应。

arp -a 可以查看本地的缓存。

要测试可以arp -d删除指定的IP映射。


阅读全文
0 0
原创粉丝点击