文档章节

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

小慢哥
 小慢哥
发布于 2019/06/16 10:09
字数 2326
阅读 26
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

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

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


目录

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

▪ 二. 实验环境

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

▪ 四. 结论写在前

▪ 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

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

🍀 网卡启动后的样子

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

进入ns2里查看

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

🍀 抓到了哪些包呢

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


四. 结论写在前

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

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


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

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

🍀 “链路本地地址”是什么

▷ 当网卡启动时会根据某种算法自动生成链路本地地址(Link-Local Address)。

▷ 具体生成的地址,与操作系统有关,有的根据MAC地址换算而来(EUI-64),有的则是随机生成,并不统一。

▷ “链路本地地址”是范围为 fe80::/10 的单播地址。

▷ “链路本地”顾名思义,只在同一个二层内传播,不会被路由器转发。

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

▷ 地址自动配置

▷ 邻居发现协议

▷ 路由转发(可以作为下一跳地址)


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

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

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

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

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

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

就4个字:“地址解析”

▷ IPv4中用ARP做地址解析,ARP是基于广播的。

▷ IPv6没有广播,只有多播。既然是多播,就总得有一个多播地址才行,于是应运而生。

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

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

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

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


Step3. “多播成员报告”

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

🍀 什么是“多播成员报告”

▷ MLDv2协议(多播控制协议)中的一种报文类型(Membership Report)。

▷ 通俗理解就是对外宣称“我要加入某某多播组”。

▷ 成员报告是单向的,不会收到回应包。

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

▷ 只要生成多播地址,就要进行成员报告,这是多播的工作机制。

▷ 成员报告的目的是为了减少网络中的多播流量。

🍀 要报告的是哪个成员

▷ 要报告的成员不是单播地址,而是多播地址。

▷ 这里指的就是“被请求节点多播地址”。即“我要加入ff02::1:ff00:2多播组”


Step4. “重复地址检测”

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

🍀 什么是“重复地址检测”

▷ 为了防止IP地址冲突,每生成一个单播地址,都会进行一次“重复地址检测”(Duplicate Address Detection,简称DAD)。

▷ 此刻,就是对Step1生成的“链路本地地址”进行检测。

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

▷ 在生成单播地址并完成发送一次“MLDv2成员报告”后,就会随机延时一小段时间进行检测。

▷ 在centos7里检测次数可通过内核参数net.ipv6.conf.eth0.dad_transmits进行修改,若设置为0表示不进行检测。

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

▷ 举个例子:我想给我家小狗取名,叫“球球”,但不想和邻居家的小狗重名,于是我大声喊:“球球”。如果没有任何狗狗看过来,那就可以认定此名字没有冲突。

▷ 专业解释:发送一个地址解析包(Neighbor Solicitation,简称NS),请求解析的地址就是自己的地址,并等待回应,若超时仍未得到回应(Neighbor Advertisement,简称NA),即可认为地址可用。


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

(对应抓包图中的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
小慢哥
粉丝 7
博文 27
码字总数 49485
作品 0
福州
架构师
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
记一次失败的Perl + Nginx + FastCGI 配置过程

这两天心血来潮,不知道为什么和 Perl + Nginx + FastCGI 配置 耗上了。但是失败了,记录如下: 1)安装Nginx 1.4.3 ,我的是WINDOWS 7 系统,修改配置文件如下: location ~ .(pl|cgi|perl)?...

通吃岛-低手哥
2013/10/27
1.6K
7
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.6K
0
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
Swift百万线程攻破单例(Singleton)模式

一、不安全的单例实现 在上一篇文章我们给出了单例的设计模式,直接给出了线程安全的实现方法。单例的实现有多种方法,如下面: class SwiftSingleton { } 这段代码的实现,在shared中进行条...

一叶博客
2014/06/20
3.3K
16

没有更多内容

加载失败,请刷新页面

加载更多

什么是移动语义? - What is move semantics?

问题: I just finished listening to the Software Engineering radio podcast interview with Scott Meyers regarding C++0x . 我刚刚结束了对Scott Meyers进行的有关C ++ 0x的Software En......

技术盛宴
今天
24
0
算法与数据结构体系课

算法与数据结构体系课【超清原画】 下载地址:百度云盘 从0到工作5年,面试、进大厂、搭建知识体系、拓展技术上限 你不再需要其它算法与数据结构课程了 为什么学算法已经是一个不应该问的问题...

1930133570
今天
21
0
如何停止跟踪并忽略对Git中文件的更改? - How to stop tracking and ignore changes to a file in Git?

问题: I have cloned a project that includes some .csproj files. 我已经克隆了一个包含一些.csproj文件的项目。 I don't need/like my local csproj files being tracked by Git (or bei......

富含淀粉
今天
25
0
Redis阻塞

可能存在问题 内在原因:API或数据结构使用不合理、CPU饱和、持久化阻塞等 外在原因:CPU竞争、内存交换、网络问题等 问题处理: API或数据结构使用不合理,可能存在慢查询或者大对象: 发现...

游泳鸟
今天
17
0
OSChina 周五乱弹 —— 来人,上幼儿园老师跳舞的图!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 小小编辑:《奇跡の海》- 坂本真綾 《奇跡の海》- 坂本真綾 手机党少年们想听歌,请使劲儿戳(这里) 巴蜀(@巴拉迪维)最近有点闹心了, @巴...

小小编辑
今天
64
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部