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

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

#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 应答。


相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2036 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • uTools

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

    6 引用 • 14 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    8444 引用 • 38459 回帖 • 154 关注
  • 数据库

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

    343 引用 • 723 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    497 引用 • 1388 回帖 • 279 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 72 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 2 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 409 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖 • 1 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    55 引用 • 85 回帖
  • Mac

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

    166 引用 • 595 回帖
  • abitmean

    有点意思就行了

    27 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 5 关注
  • sts
    2 引用 • 2 回帖 • 197 关注
  • HBase

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

    17 引用 • 6 回帖 • 75 关注
  • 宕机

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

    13 引用 • 82 回帖 • 59 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 172 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    265 引用 • 666 回帖 • 1 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 63 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • 链书

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

    链书社

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

    14 引用 • 257 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖 • 1 关注