17

IPv6通讯原理(1) - 不能忽略的网卡启动过程-小慢哥Linux运维

 4 years ago
source link: https://blog.51cto.com/cyent/2409870
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
IPv6通讯原理(1) - 不能忽略的网卡启动过程

本文主题:通过抓包分析,深入观察网卡启动过程的每个步骤,从而逐步掌握通讯原理。

☆小慢哥的原创文章,欢迎转载


▪ 一. 为什么不能忽略网卡启动过程
▪ 二. 实验环境
▪ 三. 网卡启动前/后的样子
▪ 四. 结论写在前
▪ Step1. 生成“链路本地地址”
▪ Step2. 生成“被请求节点多播地址”
▪ Step3. “多播成员报告”
▪ Step4. “重复地址检测”
▪ Step5. “无状态地址自动配置”
▪ 思考题
▪ 附. 实验脚本与抓包文件


一. 为什么不能忽略网卡启动过程

掌握网络技术,除了看RFC协议外,最直接高效的方法就是“亲眼所见”

其中抓包分析是最为关键的方法,能了解到:

▷ What:对应哪个协议
▷ Why:协议用途
▷ When:协议之间的关联
▷ How:报文地址和内容

网卡启动是网络通讯的第一步,只有夯实基础方能展翅高飞。


二. 实验环境

本文以CentOS 7为实验环境,创建两个network namespace(名字分别为ns1和ns2),并通过veth网卡桥接到同一个linux bridge(名字为br0),来模拟最简单的环境,即两台同二层服务器。

先贴出mac地址:

▷ ns1内的mac:52:54:00:00:00:01
▷ ns2内的mac:52:54:00:00:00:02

实验步骤:

1️⃣ 在ns1里启动网卡,但不抓包查看
2️⃣ 在ns2里启动网卡,同时在br0上进行抓包分析

观察:

▷ ns2会产生哪些包
▷ ns1是否会对ns2进行响应

本文最后会附上实验脚本和抓包文件的下载地址。


三. 网卡启动前/后的样子

网卡启动前的样子

在ns2里启动网卡之前,先对ns2里的网络环境进行查看,命令如下

# 查看网卡状态
ip netns exec ns2 ip link

# 查看ipv6地址
ip netns exec ns2 ip -6 addr

# 查看ipv6路由
ip netns exec ns2 ip -6 route

# 查看ipv6多播地址
ip netns exec ns2 ip -6 maddr

IPv6通讯原理(1) - 不能忽略的网卡启动过程

可以看到此时eth0处于DOWN的状态,接下去,对eth0进行UP。

网卡启动后的样子

# 启动网卡
ip netns exec ns2 ip link set eth0 up

进入ns2里查看

IPv6通讯原理(1) - 不能忽略的网卡启动过程

可以看到,此时网卡已启动,并获得了一个链路本地地址(图中fe80开头的)

抓到了哪些包呢

IPv6通讯原理(1) - 不能忽略的网卡启动过程

这些包都是什么意思,如何产生,为何产生,请接着往下看。


四. 结论写在前

网卡启动过程一共有5步,详见示意图(右边的数字,表示对应抓包图中的第几个包):

IPv6通讯原理(1) - 不能忽略的网卡启动过程

接下来,将对这5步进行逐步讲解。


Step1. 生成“链路本地地址”

IPv6通讯原理(1) - 不能忽略的网卡启动过程

(本步骤尚未产生数据包)

“链路本地地址”是什么

▷ 当网卡启动时会根据某种算法自动生成链路本地地址(Link-Local Address)。
▷ 具体生成的地址,与操作系统有关,有的根据MAC地址换算而来(EUI-64),有的则是随机生成,并不统一。
▷ “链路本地地址”是范围为fe80::/10的单播地址。
▷ “链路本地”顾名思义,只在同一个二层内传播,不会被路由器转发。

“链路本地地址”有什么作用

▷ 地址自动配置
▷ 邻居发现协议
▷ 路由转发(可以作为下一跳地址)


Step2. 生成“被请求节点多播地址”

IPv6通讯原理(1) - 不能忽略的网卡启动过程

(本步骤尚未产生数据包)

“被请求节点多播地址”是什么

在IPv6的世界中,每生成一个ip地址(准确说是单播地址),无论什么类型,都会对应生成一个“被请求节点多播地址”(Solicited-Node multicast address)。

组成方式:FF02::1:FF00:0/104 + 单播地址的最后24bit。可以看到,该地址是通过单播地址推导而成,不是随机的。上图中红框里的地址就是“链路本地地址”对应的“被请求节点多播地址”。

为什么需要“被请求节点多播地址”

就4个字:“地址解析”

▷ IPv4中用ARP做地址解析,ARP是基于广播的。
▷ IPv6没有广播,只有多播。既然是多播,就总得有一个多播地址才行,于是应运而生。

“被请求节点多播地址”工作原理

当他人想解析我的MAC地址时,发送一个“地址解析请求包”到这个多播地址,然后属于该多播地址的成员(也就是“我”)就会收到该数据包,最后“我”返回MAC地址给对方。这样就完成了“地址解析”的流程。

“被请求节点”这5个字到底是什么意思

别人请求解析我的地址,那么我就是被请求的节点。我生成“被请求节点多播地址”的目的,就是让别人能够请求到我。


Step3. “多播成员报告”

IPv6通讯原理(1) - 不能忽略的网卡启动过程

(对应抓包图中的No. 1/2/4/6)

什么是“多播成员报告”

▷ MLDv2协议(多播控制协议)中的一种报文类型(Membership Report)。
▷ 通俗理解就是对外宣称“我要加入某某多播组”。
▷ 成员报告是单向的,不会收到回应包。

为什么要进行“多播成员报告”

▷ 只要生成多播地址,就要进行成员报告,这是多播的工作机制。
▷ 成员报告的目的是为了减少网络中的多播流量。

要报告的是哪个成员

▷ 要报告的成员不是单播地址,而是多播地址。
▷ 这里指的就是“被请求节点多播地址”。即“我要加入ff02::1:ff00:2多播组”

IPv6通讯原理(1) - 不能忽略的网卡启动过程


Step4. “重复地址检测”

IPv6通讯原理(1) - 不能忽略的网卡启动过程

(对应抓包图中的No. 3)

什么是“重复地址检测”

▷ 为了防止IP地址冲突,每生成一个单播地址,都会进行一次“重复地址检测”(Duplicate Address Detection,简称DAD)。
▷ 此刻,就是对Step1生成的“链路本地地址”进行检测。

何时进行“重复地址检测”

▷ 在生成单播地址并完成发送一次“MLDv2成员报告”后,就会随机延时一小段时间进行检测。
▷ 在centos7里检测次数可通过内核参数net.ipv6.conf.eth0.dad_transmits进行修改,若设置为0表示不进行检测。

“重复地址检测”的工作原理

▷ 举个例子:我想给我家小狗取名,叫“球球”,但不想和邻居家的小狗重名,于是我大声喊:“球球”。如果没有任何狗狗看过来,那就可以认定此名字没有冲突。
▷ 专业解释:发送一个地址解析包(Neighbor Solicitation,简称NS),请求解析的地址就是自己的地址,并等待回应,若超时仍未得到回应(Neighbor Advertisement,简称NA),即可认为地址可用。


Step5. “无状态地址自动配置”

IPv6通讯原理(1) - 不能忽略的网卡启动过程

(对应抓包图中的No. 5/7/8)

什么是“无状态地址自动配置”

在IPv6中,有2种自动配置IP地址的方法:

▷ DHCPv6:也叫做“有状态分配”
▷ SLAAC:“无状态地址自动配置”(Stateless Address Autoconfiguration)

SLAAC的作用是什么

▷ 自动配置IP地址
▷ 自动配置网关

注:这里说的IP地址,是指“全球单播地址”或者“唯一本地地址”,也就是俗称的公网地址和私网地址。而不是“链路本地地址”。

工作原理

涉及到这2种报文:

▷ “路由器请求”(Router Solicitation,简称RS)
▷ “路由器通告”(Router Advertisement,简称RA)

当收到路由器回应的RA报文后,就会根据报文中的IP前缀信息,自动生成IP地址,并将网关指向该路由器的“链路本地地址”。

如何能够收到RA报文呢

有2种办法:

▷ 路由器定期发送RA报文
▷ 自己主动发送RS报文,路由器收到后就会立刻回应RA报文

由于本次实验中没有路由器,因此截图中仅能看到主动发送的RS报文,而没有得到回应。


1️⃣ 在生成“全球单播地址”或“唯一本地地址”之后,还会采用“链路本地地址”做基础通讯吗?
2️⃣ 为什么“多播成员报告”可以减少网络中不必要的多播流量,接入层交换机要进行额外配置吗?
3️⃣ “地址重复”时,是否会自动更换IP?
4️⃣ RA包只能包含一个IP前缀信息吗?一个前缀只能生成一个IP地址吗?生成的地址是什么样的?
5️⃣ 若存在多台路由器,网关会指向谁?
6️⃣ 如果不想自动配置IP,只想手工配置IP,可以忽视RA包吗?如何忽视?

上述问题,将在《IPv6系列》的下一篇文章中进行解答。


附. 实验脚本与抓包文件

# 实验脚本
https://fzxiaomange.com/attachment/ipv6-init.sh

# 抓包文件
https://fzxiaomange.com/attachment/ipv6-init.pcap

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK