经历了几次现网环境网络故障后,作为真*Yaml工程师的我深感自己网络基础知识的匮乏,纵然谈及CNI插件时种种装逼,但在明眼人看来可能错漏百出。为了能够在装逼路上走的更远,我打算分享一些关于网络基础知识的文章。

编写本文时,我最初的想法是想从 L2/L3 网络的工作原理谈起,之后引出 ARP 协议以及基于 ARP 的 VIP 方案。但挣扎很久之后发现,我不能将 L2/L3 网络的工作原理讲的十分通俗易懂,这其中的原因可能是自己对相关概念理解不够透彻,又或者是写作水平着急,总之这篇文章或许只能成为学习笔记。文章中关于 ARP 协议的介绍,我主要参考的Address Resolution Protocol (ARP)这个系列的文章,感兴趣的读者可以自己阅读原文。

背景知识

下图展示了一次网络的通信的过程:

  • L2 网络和 L3 网络区别?

    • L2 网络基于MAC 地址寻址转发数据,并精确的表示了一个网络广播域
    • L3 网络基于IP 地址寻址转发数据,由于寻址方式方式的不同,似乎并没有广播域冲突域的概念,而是以子网来体现。通常情况下我们可以认为同一个子网下 Host 位于同一个广播域中。
    • L2 网络基于交换机工作,交换机维护MAC地址表,该表记录 MAC 地址和端口号之间的映射。
    • L3 网络基于路由表工作,该表记录 IP 地址(子网)和 MAC 地址(网络设备)的映射关系。
    • L2 基于 MAC 地址的网络传输称为 Hop-to-Hop
    • L3 基于 IP 地址的网络传输称为 End-to-End
  • HOST 什么时候发送 ARP 包:

    • 当 dstIP 和本机处于同一个子网时,发送 ARP 请求 dstIP 的 MAC 地址。
    • 当 dstIP 和本机处于不同子网时,发送 ARP 请求 GW 的 MAC 地址。
    • 如果本地 ARP Cache 中包含对应的 MAC 信息,则直接跳过 ARP 请求过程。

ARP 报文

ARP 报文的基础结构,包含以下内容:

  • 报文头
    • Destination MAC address:对于 ARP 请求通常是 ffff.ffff.ffff ,表示在子网内广播,对于 ARP 应答一般是确切的 MAC 地址。
    • Source MAC address:发送 ARP 请求主机的 MAC 地址
    • EtherType:固定为 0x0806,表示是 ARP 报文
  • Padding
    • Hardware Type:表示硬件类型,通常是 1 ,表示 Ethernet
    • Protocol Type:表示协议类型,通常是 0x0800,表示 IPv4
    • Hardware Size:MAC 地址的字节长度,6 bytes(48 bits)
    • Protocol Size:IPv4 address 的字节长度,4 bytes(32 bits)
    • Opcode:表示 ARP 包的类型,只有1和2两种取值,表示请求或者应答
    • Sender MAC address:发起 ARP 包主机的 MAC 地址
    • Sender IP address:发起 ARP 包主机的 IP 地址
    • Target MAC address:对于 ARP 请求,设置为 00:00:00:00:00:00,对于 ARP 应答设置为确切的 MAC 地址
    • Target IP address:要请求 MAC 信息的 IP 地址

特殊 ARP 报文

除了正常的 ARP Request 和 ARP Response,还有几种用于特殊情景的 ARP 包。

Gratuitous ARP

一种特殊的 ARP 应答广播,主要用于在子网中通告本机 MAC 地址和 IP 地址。它没有没有对应的请求报文,Padding 内容如下:

  • Opcode:2,表示 reply
  • Sender MAC address:发起 ARP 包主机的 MAC 地址
  • Sender IP address:发起 ARP 包主机的 IP 地址
  • Target MAC address:ff:ff:ff:ff:ff:ff(这种情况下一般忽略这个信息)
  • Target IP address:发起 ARP 包主机的 IP 地址

PS:注意 Gratuitous ARP 虽然是应答,但是报文头中 Destination MAC address 应该填广播地址

Announcement ARP

一种特殊的 ARP 请求广播,主要用于在子网中通告本机 MAC 地址和 IP 地址,Padding 内容如下:

  • Opcode:1,表示 request
  • Sender MAC address:发起 ARP 包主机的 MAC 地址
  • Sender IP address:发起 ARP 包主机的 IP 地址
  • Target MAC address:ff:ff:ff:ff:ff:ff(这种情况下一般忽略这个信息)
  • Target IP address:发起 ARP 包主机的 IP 地址

Gratuitous ARP 和 Announcement ARP 只有 Opcode 取值不同,我们可以通过交替发送这两种报文来进行 Host 的 ARP 地址广播。

ARP Probe

用于检查子网内是否存在 IP 冲突,通常如果应答包中包含多个不同的 MAC 地址,那么表示存在 IP 冲突。

Padding 内容如下:

  • Opcode:1,表示 request
  • Sender MAC address:发起 ARP 包主机的 MAC 地址
  • Sender IP address:0.0.0.0
  • Target MAC address:00:00:00:00:00:00
  • Target IP address:要探测的 IP 地址(通常情况下是本机的IP)

ARP Probe 中, Sender IP address 被设置成了 0.0.0.0,Target MAC address 被设置为 00:00:00:00:00:00,这是为了将 ARP Probe 和 Announcement ARP 以及 ARP Request 区别开。

Proxy ARP

参考:https://www.practicalnetworking.net/series/arp/proxy-arp/

Linux 相关

内核参数

  • 禁用 ARP 响应
    • 通过内核参数禁用网卡的 ARP 响应:http://kb.linuxvirtualserver.org/wiki/Using_arp_announce/arp_ignore_to_disable_ARP
    • 禁用网卡 arp 协议

工具

  • arp
  • arping

工具库

参考