地址解析为两种不同的地址形式提供映射:32bit的IP和数据链路层使用的任何类型的地址。

当一台主机把以太网数据帧发送到位于同一局域网的另一台主机,是根据48bit的以太网地址而不是IP地址。设备驱动程序是从不会去检查IP数据报中的目的IP地址。

ARP为IP地址到对应的硬件地址之间提供动态映射。

例子

这个例子是想通过FTP协议连接主机bsdi。

在发送TCP连接前,需要将IP地址映射为硬件地址,这就需要ARP了。

ARP发送一份称作ARP请求的以太网数据桢给以太网的所有主机,也就是广播,目的就是让是这个IP地址的主机吱一声。目的主机收到这份广播报文后,发送一个ARP应答,包含了IP地址和对应的硬件地址。

ARP后面的基本概念就是,网络接口有一个硬件地址。在硬件层次上交换数据就必须有正确的接口地址,内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据,IP地址在这里是毫无用处的。

ARP高速缓存

ARP高效运行的关键是每个主机都有一个ARP高速缓存。这个缓存存储了最近的IP和硬件地址之间的映射,一般生存时间为20分钟,一般在访问条目时重设超时值。

查看ARP高速缓存的命令为:arp -a。

ARP的分组格式

分组格式分为14字节的以太网首部和28字节的ARP请求/应答。

首先是以太网首部。

以太网首部的前两个字段是以太网的源地址和目的地址。目的地址全为1则是广播地址,发送请求时就是广播。

以太网帧类型:表示后面的数据类型,对ARP请求和应答来说,值为0x0806。

接下来是ARP请求/应答。

硬件类型:硬件地址的类型,比如1表示以太网地址。

协议类型:要映射的协议地址类型,0x0800表示IP地址。值得注意的是,它与IP数据报中的以太网数据帧的类型字段的值相同。

硬件地址长度:单位为字节,值为6,也就是48bit硬件地址。

协议地址长度:单位为字节,值为4,也就是32bit IP地址。

op:四种操作类型,ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4)。

剩下的4个字段看字面意思就很清楚了,不赘述。

ARP举例

执行一个连接,然后使用tcpdump(linux下命令)查看。

可以看到,第一行中有源主机的硬件地址,目的端为ff:ff:ff:ff,也就是广播地址。紧接着输出的是arp,表明帧类型字段值为0x0806,说明这是一个ARP请求/应答。再后面的60是以太网数据帧的长度。

第二行中我们可以看到,尽管ARP请求是广播的,但是ARP应答是单播的。

第三行是请求建立TCP连接。这个不是这章的重点,等18章详述。

一般情况下,主机在收到ARP请求或发送应答时,都要把请求端的硬件地址和IP存入ARP高速缓存。这样在建立TCP连接时,应答端就不需要发送ARP来解析IP了。

如果尝试连接的是一台不存在的主机,那么会进行多次ARP请求,并会在ARP高速缓存中保存一个不完整的条目。这里有个超时重传的算法问题,TCP时会涉及。

ARP代理

上面讨论的是在同一个以太网中的情况。如果ARP请求是从一个网络的主机发送到另一个网络的主机,那么连接这两个网络的路由器可以回答该请求,这个过程称为委托ARP或ARP代理。这样,发起端就会误以为路由器就是目的主机,而路由器作为目的主机的代理,会把分组转发给目的主机。

这里一个疑问是关于解释一个IP的问题,哪位看懂的请指教。

故意的ARP

一般在系统引导期间进行接口配置时,主机会发送ARP查找自己的IP。这个特性称为“故意的ARP”(原文翻译是免费的ARP,我觉得无意义)。

这个特性有两个作用:

1)确认是否有另一个主机设置了一样的IP。如果IP是唯一的,那么就应该没有ARP应答;一旦有应答,就说明IP设置重复了。

2)如果发送故意ARP的主机正好改变了硬件地址,比如换了一块网卡并重启,那么这个ARP请求可以更新其他主机高速缓存中的旧的硬件地址。

最新文章

  1. 使用 Productivity Power Tools 2013来帮助你提高 VS2013的工作效率
  2. web初学之重定向与请求转发
  3. Android自定义PopupWindow显示在控件上方或者下方
  4. js009-客户端检测
  5. Vue数据绑定
  6. Android实现支持缩放平移图片
  7. nginx博客系统(内含nginx图片缩略图处理代码,不错)
  8. 解密SQL SERVER 2005加密存储过程,函数
  9. STL(pair map set vector priority_queue) poj 3297
  10. Linux学习之路:shell变量(二)环境变量
  11. JVM Run-Time Data Areas.
  12. SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue性能测试(转)
  13. AJAX 处理xml 数据
  14. Ubuntu 11.04 NFS 配置
  15. 简单RPC之Socket实现
  16. springcloud-spring cloud config统一配置中心
  17. Ubuntu 下 Tomcat7 的安装和配置
  18. SQLServer最耗资源时间的SQL语句
  19. PostgreSQL 资源
  20. Faster\Slower 快慢指针的应用

热门文章

  1. dedecms入侵拿webshell之方法总结
  2. Linux的进程间通信-文件和文件锁
  3. "com.android.ide.s.ProcessException:Process 'cand 'C:\Program Files\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 2"
  4. 把自动机用作 Key-Value 存储
  5. C# WinForm 异步执行耗时操作并将过程显示在界面中
  6. 假设这篇文章也能訪问过万,我的那些朋友就是SB
  7. PHP和数据访问之(插入。删除。和更新数据)
  8. 坑爹的Adprep32.exe
  9. ASP.NET请求管道、应用程序生命周期、整体运行机制
  10. 【Linux】替换文本中的字符