《TCP/IP详解 卷一:协议》读书笔记 - 4 ARP 和 RARP

本贴最后更新于 2962 天前,其中的信息可能已经斗转星移

#ARP:地址解析协议
当一台主机把以太网数据帧发动到另一台主机时,是根据 48 bit 的一台网地址确定目的的接口。设备驱动程序从不检查 IP 数据报中的目的 IP 地址。因此需要 ARP(32 位 Internet 地址 -> 48 位以太网地址) 和 RARP(48 位以太网地址 -> 32 位 Internet 地址)


##例子
下面我们以一个例子来说明从应用层到链路层,整个协议栈的工作过程。
当我们输入以下命令 ftp www.zing.ac.cn
会进行以下步骤:

  1. 引用程序 FTP 客户端调用函数 gethostbyname 把主机名(www.zing.ac.cn)转换为 32 bit 的 IP 地址。这个过程成为域名解析,后续章节会有详细介绍。
  2. FTP 客户端请求 TCP 用得到的 IP 地址建立连接。
  3. TCP 发送一个连接请求分段到远端的主机,即发送一份 IP 数据报到上述 IP 地址。
  4. 根据目的 IP 的位置,IP 数据报需要发送到了位于本地网络上的一台主机或路由器。
  5. 假定是一个以太网,那么发送端主机必须把 32 bit 的 IP 地址转换为 48 bit 的以太网地址。从逻辑地址到物理地址的翻译。这就是 ARP 的功能。
  6. ARP 发送一份称为 ARP 请求的以太网数据帧给以太网上的每个主机。这个过程称为广播。ARP 请求数据帧中包含目的主机的 IP 地址。
  7. 目的主机的 ARP 层收到这份广播报文后,识别出这是发送端在询问它的硬件地址,于是发送一个 ARP 应答。这个 ARP 应答包括目的主机的 IP 地址和对应的硬件地址。
  8. 收到 ARP 应答后,使 ARP 进行请求-应答交换的 IP 数据报就可以传送了。
  9. 发送 IP 数据报到目的主机。

使用点对点链路时不需要 ARP,这是因为在设置链路的时候,已经告诉内核链路中每一端口的 IP 地址。类似于已经缓存了一个(IP 地址,硬件地址)的表。


##ARP 高速缓存
ARP 高速运行的关键是每个主机上都有一个 ARP 高速缓存。这个缓存存放了最近 Internet 地址到硬件地址之间的映射记录。每一项的有效时间是 20 分钟。可用 arp -a 命令查询。


##ARP 的分组格式
用于以太网的 ARP 请求或应答分组格式如下图:

ARP 分组格式

  • 以太网目的地址:6 字节,全 1 的特殊地址是广播地址。
  • 以太网源地址:6 字节
  • 帧类型:2 字节,表示后续数据类型,ARP 请求或应答该字段值为 0x0806
  • 硬件类型:2 字节,表示硬件地址的类型,1 表示以太网地址
  • 协议类型:2 字节,表示要映射的协议地址类型,值为 0x0800 即表示 IP 地址。
  • 硬件地址长度:1 字节,硬件地址长度,以字节为单位。
  • 协议地址长度:1 字节,要映射的协议地址长度,以字节为单位。
  • 操作字段:2 字节,ARP 请求值为 1、ARP 应答值为 2、RARP 请求值为 3、RARP 应答值为 4。

##ARP 代理
如果 ARP 请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路由器就可以回答该请求,这个过程称为委托 ARP 或者 ARP 代理。路由器隐藏了网络的物理细节。


##免费 ARP
主机通过发送 ARP 请求查找自己 IP 地址的特性称为免费 ARP。免费 ARP 有两个方面的作用。

  1. 可以用来确定是否存在 IP 冲突。主机广播 ARP 请求询问自己的 IP 地址,若收到 ARP 应答说明网络中存在 IP 冲突。
  2. 如果发送免费 ARP 的主机刚好改变了硬件地址,那么免费 ARP 就可以使其他主机高速缓存中的旧硬件地址进行相应的更新。

##arp 命令

  • arp -a :查询 ARP 高速缓存中的所有内容。
  • arp -d :参数 ARP 高速缓存中的指定项。
  • arp -s :添加项目到高速缓存中,永久性的。除非在末尾附上 temp 关键词。
  • arp -s ... pub :使系统起着主机 ARP 代理的作用。

#RARP:逆地址解析协议

ARP 的存在及工作原理非常容易理解:由于链路层发送数据帧需要通过目的主机的物理地址,而 IP 层数据报仅知道目的 IP 地址,因此需要 ARP 将 IP 地址映射为物理地址。
相反的,RARP 是为将物理地址映射到 IP 地址。其应用的背景相对比较陌生。具有本地磁盘的系统引导时,一般是从磁盘上的配置文件读取 IP 地址。但是无盘机,就只能采取 RARP 来获取本机的 IP 地址。
网络上的每个系统都具有唯一的硬件地址,这是由网络接口生产厂家配置的。无盘系统的 RARP 实现过程就是从接口卡读取唯一的硬件地址,然后发送 RARP 请求,获取本机硬件地址对应的 IP 地址。
简而言之,ARP 就是向网络询问某 IP 主机的物理地址。RARP 就是向网络询问本机物理地址对应的 IP 地址。


##RARP 的分组格式
RARP 的分组格式跟 ARP 分组基本一致。区别是 RARP 请求或应答的帧类型代码为 0x8035,RARP 请求操作码为 3,RARP 应答操作码为 4。
RARP 请求是以广播方式传送,应答一般是单播传送。


##RARP 服务器的设计

提供一个 ARP 服务器很简单,通常是 TCP/IP 在内核中实现的一部分。由于内核知道 IP 地址和硬件地址,因此收到一个询问本机 IP 地址的 ARP 请求时,只需要用相应的硬件地址来提供应答即可。
虽然 RARP 在概念上与 ARP 类似,但是实现上就比较复杂。

###作为用户进程的 RARP 服务器

RARP 服务器的复杂性在于,服务器一般要为多个主机提供硬件地址到 IP 地址的映射。该映射包含在一个磁盘文件中。由于内核一般不读取和分析磁盘文件,因此 RARP 服务器的功能就由用户进程来通过该,而不是内核 TCP/IP 实现的一部分。

更复杂的是,RARP 请求是作为一个特殊的以太网数据帧来传送的。因此 RARP 服务器必须能够发送和接收这种类型的以太网数据帧。

###每个网络有多个 RARP 服务器

RARP 请求是在硬件层上进行广播的,这意味着他们不经过路由器进行转发。为了无盘系统在 RARP 服务器关机的状态下也能引导,通常在一个网络上要提供多个 RARP 服务器。
这样就会使网络上流量发生冗余,而且多个服务器同时对同一 RARP 请求进行应答,会增加以太网冲突的概率。无盘系统一般采用最先收到的 RARP 应答。


相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 399 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 1 关注
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 2 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 609 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 38 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 92 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 521 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 996
    13 引用 • 200 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 45 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 405 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 125 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 604 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    129 引用 • 793 回帖 • 1 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 685 关注