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

可以看到此时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

原文地址:https://www.cnblogs.com/fzxiaomange/p/ipv6-startup.html

时间: 2024-08-07 07:11:23

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

http 基础与通讯原理

目录 http 基础与通讯原理 Internet 与中国 1990年10月 注册CN顶级域名 1993年3月2日 接入第一根专线 1994年4月20日 实现与互联网的全功能连接 1994年5月21日 设置CN域名服务器 1996年1月 正式进入Internet TCP/IP协议 socket 套接字 套接字转发过程 套接字连接过程 套接字相关系统函数 HTTP 服务 通讯过程 相关术语 工作机制 HTTP的多种连接模式 URL URL的组成 网站访问量 IP PV UV QPS PV,QPS,并

基于Netty的聊天系统(一)通讯原理篇

今天周六,正好顺便把聊天系统的通讯原理写一下,本来是用XMPP+Openfire做了一个聊天,但是在做群聊那块需要去写插件来主动向表里变去写数据,因为openfire外国人写的,最初设计的群聊是会议室那种形式,和我们现在这种QQ群聊还是有差别的,改造起来比较麻烦,需要去通都源码等等,openfire是基于mina来写的,mina和netty又出自同一作者之手,那么我们就基于netty来写一个吧,首先我们来谈一谈通讯的原理 1:通讯原理 首先比方说A和B两个人要进行聊天(这里我们先讨论一对一这种聊

ios cordova 原生与js通讯原理

在ios中,cordova的CDVViewController继承了viewController,每一个h5的页面,都对应一个CDVVIewController, 里面都有一个webview,是ios中专门显示h5页面的view. h5和原生端的交互,主要是通过插件的形式实现,原生这边写一个类继承CDVPlugin,然后实现方法,js那边封装好每个接口的方法, 最终通过调用cordova.js里的exec,传入服务类名,方法名,以及回调函数及参数等进行调用. 它的通讯原理是:有两种方法 1.通过

QQ通讯原理及QQ是怎么穿透内网的(转)

QQ是一个基于TCP/UDP协议的通讯软件 发送消息的时候是UDP打洞,登陆的时候使用HTTP~因为登陆服务器其实就是一个HTTP服务器,只不过不是常用的那些,那个服务器是腾讯自行开发的!!! 一.登录 QQ客户端在局域网内,当你打开QQ登录到QQ服务器时,通过外网,你的客户端与QQ服务器建立了一个长连接.你可以用netstat -bn  看到此连接的状态是 establish 此时,在QQ服务器那面看到的连接的IP是你们局域网对外的IP.举个例子:       QQ服务器      IP:12

stm32-SPI通讯原理详解

那么今天再说说SPI吧,通过前面的IIC其实我们知道,通讯协议,其实就是通过时序来传输数据,通过自定义不同的函数来实现数据的传输(具体就是按照时序,来读写寄存器的标志位,来完成数据传输的具体操作),所以可以通过再定义不同的函数来读写相应存储传输数据的存储空间,以完成对数据的处理,那我们前面提到的IIC主要应用到的地方就是读写EEPROM,那今天说的SPI,就以读写FLASH来讲讲它的通讯原理. 其实我们知道它与IIC不同的是,它是由4条线路控制的 片选: 选择设备是根据片选线拉低电平来得到选中的

VMware/vSphere克隆主机网卡启动失败

主标题: VMware/vSphere制作模板操作系统 副标题: VMware/vSphere克隆主机网卡启动失败 VMware/vSphere中新安装好的虚拟机把以下两个文件添加注释后关机,即可转换为虚拟机模板 [root]# cat /etc/udev/rules.d/70-persistent-net.rules # SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=

虚拟机centos 6.5 网卡启动报错解决办法

> centos 6.5 网卡启动报错如下: Error: Device 'eth0' (/org/freedesktop/NetworkManager/Devices/0) disconnecting failed [FAILED] 解决办法查看eth0网卡配置 默认这项为no 状态:ONBOOT=no 解决办法把ONBOOT=no修改为ONBOOT=yes  然后执行:service network restart OK 了

解决克隆LinuxCentOS系统之后网卡启动不了

问题:克隆系统后,进入系统启动网卡后报错 解决办法: 1.查看udev-post是否启动 2.编辑 vi /etc/udev/rules.d/70-persistent-net.rules 对比如下两张图,将第一行没有注释的eth0行首加#号注释掉 将第二行最后面的NAME="eth1"修改为NAME="eth0" 3.重启 reboot now 重启后发生新问题:启动网卡报错 cat /etc/sysconfig/network-scripts/ifcfg-eth

JVM运行原理及Stack和Heap的实现过程

Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器. 一.JVM原理 1.JVM简介: JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. java编译器只要面向JVM,生成JVM能理解