协议簇:Ethernet Address Resolution Protocol (ARP) 解析

简介

前面的文章中,我们介绍了 MAC Frame 的帧格式。我们知道,在每个 Ethernet Frame 中都分别包含一个 48 bit 的源物理地址和目的物理地址. 对于源地址很容易理解,该地址可以直接从硬件上读取. 但是对于一个网络节点,他怎么知道一个 Frame 的目的物理地址呢? 本文我们将学习 ARP 协议来解答这个问题.

ARP 协议主要用来完成将网络层协议的地址(比如,IP 地址)解析为物理地址的工作.

为什么需要将网络层协议的地址转换为物理地址呢?

对于物理层来说,他仅仅能处理 48 bit 的物理地址,而网络层协议往往有自己协议中定义的协议地址,而这些协议的地址往往都不一样. 比如, IP 地址的长度为 32 bit,CHAOS 地址的长度为 16 bit, Xerox PUP 地址的长度为 8 bit.

反过来说,ARP 协议的存在也是必须的. 因为如果一个物理层想要同时支持上述的这些协议,他就不应该依赖于这些协议的实现,而是定义自己的地址格式,再通过一种方式将网络层协议的地址转化为物理地址. 这个方式就是 ARP 协议要实现的功能.

说明一点,接下来的描述将倾向于网络层协议是 IP 来进行描述.

ARP 包格式

ARP Packet Format
ARP 协议的包结构比较简单,我们直接看一个例子. 通过这个例子来解析每个字段的含义:

首先,我们注意到 ARP 包中 ar$op 字段可能的值有两个 REQUEST 和 REPLY。也就是说 ARP 协议的包大体分为两类,我们一一来看.

REQUEST

ARP Request Packet
这个包对应的二进制数据为:
00 01 08 00 06 04 00 01 dc a3 33 c4 1e 5a c0 a8
01 01 00 00 00 00 00 00 c0 a8 01 65

  1. 首先,我们看到 Wireshark 抓到的这个包中确实有9个字段,与我们上图中给出的 ARP 包结构完全吻合,并一一对应.
  2. Hardware type: Enternet(1) 该字段对应于 ar$hdr, 表明当前硬件地址的类型为 Ethernet 物理地址类型
  3. Protocol type: IPv4(0x0800) 该字段对应于 ar$pro, 表明网络层协议为 IP 协议,也就是说这个 ARP 请求包是为了完成将一个 IP 地址解析为物理地址的工作.
  4. Hardware size: 6 该字段对应于 ar$hln, 表明物理地址的长度, 这里 6 的单位为 byte,而不是 bit,需要注意.
  5. Protocol size: 4 该字段对应于 ar$pln, 表明网络层协议的长度, 这里 4 的单位为 byte,而不是 bit,需要注意.
  6. Opcode:request(1) 该字段对应于 ar$op, 表明当前 ARP 包的类型。这里,这个 ARP 包是一个请求包.
  7. Sender MAC Address: 该字段对应于 ar$sha, 表明发送这个ARP 请求包的网络节点的物理地址.
  8. Sender IP Address: 该字段对应于 ar$spa, 表明发送这个ARP 请求包的网络节点的网络层地址. 这里应为网络层协议为 IP 协议,因此这里是一个 IP 地址. 自然,不同的网络层协议实现的 ARP 协议,这个字段的长度和值是不同的.
  9. Target MAC Address: 该字段对应于 ar$tha,应为这个 ARP 包是一个请求包且当前网络节点不知道目的地址的物理地址,因此此处填上全0来占位.
    10.Target IP Address: 该字段对应于 ar$tpa, 表明想要将该IP地址解析为物理层地址.

总结:

  1. 这个 ARP 请求包想要解析 IP 地址 “192.168.1.101” 对应的物理地址
  2. 至于 arhln和arhln 和 arhlnarpln 的必要性,我们解释一下: ARP 协议用来完成将网络层协议地址解析为物理层地址的功能,而正如我们前文提到的,不同的网络层协议的地址长度是不同的,因此我们需要这两个字段来表明地址的长度。 只有这样,在接收者收到这个 ARP 请求时,才能正确的解析出来.
  3. 往往,ARP 请求都是以广播的形式发送。因为在发送这个 ARP 请求的时候,发送节点并不知道接收方的物理层地址.
REPLY

ARP Reply Packet
这个包对应的二进制数据为:
00 01 08 00 06 04 00 02 98 fa 9b 17 a8 f8 c0 a8
01 65 dc a3 33 c4 1e 5a c0 a8 01 01

  1. 在接收到 ARP 请求之后,接收者会比较这个ARP 请求中的网络层地址与自身的网络地址是否一致。如果一致,就使用自己的物理层地址构建一个 ARP Reply 包来响应这个请求。
  2. 这里,这个响应不再需要以广播的形式发送,因为在接收到的 ARP 请求包中包含了发送方的物理层地址,因此可以直接将响应发送给该网络节点.

END!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协议簇:IPv4 解析

简介 IP 是一种无连接的协议. 操作在使用分组交换的链路层(如以太网)上。此协议会尽最大努力交付数据包。 尽最大努力意味着: IP 协议不保证数据的可靠传输, 没有流量控制机制, 不保证传输序列(意味着 IP 数据包会在传输过程中乱序), 没有…

协议簇:ICMP 解析

简介 ICMP 是 Internet Control Message Protocol 的简写. 它主要用来调试网络通信环境中存在的问题. 比如,当 IP 数据包总是无法正常的发送到目的地址, 当网关没有足够的 buffer 来转发对应的数据包 等问题. 值得一提的是,它属于网络层,不属…

协议簇:TCP 解析: 基础

简介 本文我们将从 RFC 学习一下 RFC793 中描述的 TCP 协议. 这将区别于通常讲解计算机网络书籍中所描述的 TCP. 但他们必然是相统一的,不会互相冲突. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议…

协议簇:TCP 解析: 建立连接

简介 接前文 协议簇:TCP 解析: 基础, 我们这篇文章来看看 TCP 连接建立的过程,也就是众所周知的”三次握手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议簇&a…

协议簇:TCP 解析: 连接断开

简介 接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的”四次挥手“的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析:建立连接 协议…

协议簇:TCP 解析: Sequence Number

简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下。这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对应于一个序列号. 由于每个字节都有自己的序列号&a…

协议簇:TCP 解析:TCP 数据传输

简介 前面,我们分别介绍了 TCP 基础知识以及连接的建立和关闭,以及最重要的 Sequence Number 的概念. 本篇文章,我们来介绍一下 TCP 如何传输数据. 系列文章 协议簇:TCP 解析:基础 协议簇:TCP 解析&…

CodeTank iOS App Technical Support

CodeTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots

CentOS 7 防火墙命令

查看防火墙状态 systemctl status firewalld如果已经开启,状态为 active 如果未开启,状态为 inactive 开启防火墙 systemctl start firewalld关闭防火墙 systemctl stop firewalld查看当前防火墙的配置 firewall-cmd --list-all这里,我…

Go Concurrency Patterns: Context

Go Concurrency Patterns: Context 原文地址:https://blog.golang.org/context Introduction 在 Go 语言实现的服务器上,我们总是使用 goroutine 来处理与客户端建立的连接, 给每个连接分配一个独立的 goroutine. 在请求的 handler 中也通常…

Go Concurrency Patterns: Timing out, moving on

原文地址:https://blog.golang.org/concurrency-timeouts 并发变成有它自己的风格. 一个非常好的例子就是 timeout. 虽然 go 的 channel 没有直接支持 timeout 机制,但是要实现它非常容易. 比如说,我们想从一个 channel ch 中接收数据&#…

Go Concurrency Patterns: Pipelines and cancellation

原文地址: https://blog.golang.org/pipelines 简介 Go 语言提供的并发原语使得可以很方便的构建数据流 pipeline,使用这样的 pipeline 可以高效的利用 I/O 和多 cpu 的优势. 这篇文章我们将展示如何构建并使用 pipeline. 什么是 pipeline ? 在 go 语…

QTcpSocket connectToHost 建立连接速度慢问题

问题场景 在使用 QT 开发一个客户端 App 的时候,我们通过 QTcpSocket 与后台服务器进程通信。 后台程序使用其他语言编写。 问题: 在客户端启用之后尝试建立与后台程序的 TCP 连接的时候,发现连接速度非常慢(肉眼可见的慢&#x…

WinSock I/O 模型 -- Select 模型

简介 Select 模型是 WinSock 中最常见的 I/O 模型,这篇文章我们就来看看如何使用 Select api 来实现一个简单的 TCP 服务器. API 基础 Select 模型依赖 WinSock API Select 来检查当前 Socket 是否可写或者可读。 使用这个 API 的优点是我们不需要使用阻塞的 So…

WinSock I/O 模型 -- WSAEventSelect 模型

简介 WSAEventSelect 模型也是 WinSock 中最常见的异步 I/O 模型。 这篇文章我们就来看看如何使用 WSAEventSelect api 来实现一个简单的 TCP 服务器. API 基础 WSAEventSelect WSAEventSelect 用来把一个 SOCKET 对象和一个 WSAEVENT 对象关联起来。 lNetworkEvents 表示…

WinSock I/O 模型 -- WSAAsyncSelect 模型

简介 WSAAsyncSelect 模型也是 WinSock 中常见的异步 I/O 模型。 使用这个模型,网络应用程序通过接收以 Windows 消息为基础的网络事件通知来处理网络请求。 这篇文章我们就来看看如何使用 WSAAsyncSelect api 来实现一个简单的 TCP 服务器. API 基础 要使用 W…

WinSock I/O 模型 -- OVERLAPPED I/O 模型

简介 OVERLAPPED I/O 模型也是 WinSock 中常见的异步 I/O 模型,相比于我们之前提到的 Select 模型,WSAAsyncSelect 模型 和 WSAEventSelect 模型有更好的性能. 为了方便描述,下文我们将称 Overlapped I/O 模型为 “重叠模型”. 重叠模型的…

WinSock I/O 模型 -- IOCP 模型

前言 IOCP 全称 Input/Ouput Completion Ports,中文中翻译一般为“完成端口”,本文中我们使用 IOCP 简写. IOCP 模型是迄今为止最为复杂的一种 I/O 模型,但是同时通过使用 IOCP 我们往往可以达到最佳的系统性能. 当你的网络应用程序需要管理…

GTank iOS App Technical Support

GTank iOS App Technical Support For All Email: z253951598outlook.com TEL: 86-17782749061 App Screen Shoots ​​

证书体系: CSR 解析

原文同时发布于本人个人博客: https//kutank.com/blog/cert-csr/ 简介 CSR 全称 “证书签名请求”(Certificate Signing Request). 本文我们将来详细的学习 CSR 的知识,重点集中在 CSR 所包含的信息,及其意义。 CSR 的作用: CSR 通常由想要获…