地址解析为两种不同的地址形式提供映射: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请求可以更新其他主机高速缓存中的旧的硬件地址。

TCP/IP详解读书笔记:ARP-地址解析协议的更多相关文章

  1. TCP/IP详解读书笔记:链路层

    在TCP/IP协议族中,链路层主要有三个目的: 1)为IP模块发送和接受IP数据报: 2)为ARP模块发送ARP请求和接受ARP应答: 3)为RARP模块发送RARP请求和接受RARP应答: 以太网和 ...

  2. TCP/IP详解读书笔记:概述

    分层 分层是一种很通用的架构模式.通过分层,可以把一个系统分解成多个层,每个层专注于各自的功能,并提供接口给上面的层调用.上面的层不需要了解调用层的详细实现,只依赖于其接口,这就给维护带来了很大的好处 ...

  3. TCP/IP详解学习笔记(6)-UDP协议

    1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议. 2.UDP协议头 2.1.UDP端口号 ...

  4. TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute

    1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送 ...

  5. TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute【转】

    转自:http://blog.csdn.net/goodboy1881/article/details/670761 1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议(是一种尽力传送的协 ...

  6. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

  7. TCP/IP详解学习笔记 这位仁兄写得太好了.(转载)

    TCP/IP详解学习笔记   这位仁兄写得太好了   TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/20444 ...

  8. 【转】TCP/IP详解学习笔记(一)

      TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.aspx TCP/IP详解学习笔记(13)-T ...

  9. 【转】TCP/IP详解学习笔记(二)

    TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节 1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据 ...

随机推荐

  1. php 中 拓展 xdebug的完全理解

    question: Xdebug unable to connect to client, where do I start debugging the debugger? I'm setting u ...

  2. [HTML5] Track First Contentful Paint with PerformanceObserver and Google Analytics

    "If you can't measure it, you can't improve it." The first step when doing performance wor ...

  3. PHP多文件上传代码练习

    HTML表单: <html> <head><title>upload file</title> <meta http-equiv="Co ...

  4. 如何使用WinDriver为PCIe采集卡装驱动

    如何使用WinDriver为PCIe采集卡装驱动 第一步:使用WinDriver生成驱动 1.运行Drier Wizard 2.点击New host driverproject 3.在列表中,选择待安 ...

  5. ajax同步和异步

    // 方案2: 回调函数 // function getFile( callback ){ // // 1: 创建ajax对象 XMLHttpRequest // var xhr = new XMLH ...

  6. 如何让你的webapp也能跳窗口搜索

    目前很多手机app或者一些webapp,搜索栏基本采用跳窗口的搜索方式 怎么做 实现方式: 1.在触发外层的input的时候打开个modal层,默认打开该modal层的时候就触发了moda里面的inp ...

  7. 分布式消息系统Jafka入门指南

    分布式消息系统Jafka入门指南 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.JafkaMQ简单介绍 JafkaMQ是一个分布式的公布/订阅消息系 ...

  8. 算法笔记_069:Floyd算法简单介绍(Java)

    目录 1 问题描述 2 解决方案 2.1 使用Floyd算法得到最短距离示例 2.2 具体编码   1 问题描述 何为Floyd算法? Floyd算法功能:给定一个加权连通图,求取从每一个顶点到其它所 ...

  9. C#音视频网络流解码:H264视频和ACC音频

    下面两种方式是直接翻译过来的,还有问题,比如指针的使用和值的传入.考虑C#和C++的差异,还是要抱着怀疑的态度去看待,不一定是对的. H264视频解码网络流: using FFmpeg.AutoGen ...

  10. selenium2.0 --常用函数2

    新建实例driver = webdriver.Chrome() 1.获取当前页面的Url函数 方法:current_url 实例: driver.current_url 2.获取元素坐标 方法:loc ...