IPv6系列-初学者的10个常见困扰

本文是《IPv6系列》文章的第二篇《常见困扰》,紧接《入门指南》,用于解答IPv6的10个常见困扰。
小慢哥的原创文章,欢迎转载
目录
▪ 本文缘由
▪ 困扰1. IPv4和IPv6只有地址格式不同吗
▪ 困扰2. IPv4到IPv6对应用程序是透明无感知的吗
▪ 困扰3. 提供WEB服务,需要每台服务器都配置IPv6地址吗
▪ 困扰4. IPv4和IPv6要配在同一张网卡上吗
▪ 困扰5. 我的网卡有fe80开头的地址,可以用来上公网吗
▪ 困扰6. IPv6地址如何配置
▪ 困扰7. 没有了ARP,如何解析MAC地址
▪ 困扰8. IPv6使用多播替代广播,需要做哪些改造
▪ 困扰9. IPv6真的安全吗
▪ 困扰10. 如何学习IPv6
▪ 后续说明
本文缘由
在笔者的上一篇文章《IPv6系列-入门指南》里,简要阐述了以下内容:
▷ 掌握IPv6的必要性
▷ IPv6的3个常见顾虑
▷ IPv6基础知识
▷ 常用测试方法
而在进一步的实践学习中,会遇到很多的困扰。笔者结合自己以及身边的同行兄弟们遇到的困扰,精心挑选出10个困扰在本文中进行解答。
如果没有阅读过《IPv6系列-入门指南》,敬请劳神垂阅,以便知识的连贯。
困扰1. IPv4和IPv6只有地址格式不同吗
除了地址格式不同,IPv4与IPv6协议栈也不同,他们在逻辑上是完全不同的2个世界
以下实践中经常会遇到的4个不同之处:
▷ 基本通讯过程:ND替代ARP、多播替代广播、fe80地址成为标配、ICMP成为通讯核心
▷ IP配置方式:客户端以无状态自动配置IP成为主流,弱化DHCP
▷ DNS域名解析:AAAA记录替代IPv4的A记录、对应用存在优先级问题(优先解析AAAA还是A)
▷ 应用层适应性:socket编程中AF_INET仅支持IPv4,AF_INET6仅支持IPv6
困扰2. IPv4到IPv6对应用程序是透明无感知的吗
错,是有感知的,上层应用程序需要进行改造。
举个例子,当访问fzxiaomange.com时候,是要优先解析IPv6地址(AAAA)还是IPv4地址(A),因为总得选一条线路来发送请求。现在许多框架会优先选择IPv6。
注意:如果解析出AAAA记录,即使本机没有可路由IPv6地址,也有可能依然尝试通过IPv6进行请求,导致请求失败。
还有一个典型的例子,是程序会在应用层里交互底层IP地址,比如FTP主动模式会在应用层里交互IPv4地址,而如果实际可用的是IPv6地址,就可能导致后续连接的异常。
无法做到透明无感知,是导致产生IPv4到IPv6的部分过渡方案的原因之一。
困扰3. 提供WEB服务,需要每台服务器都配置IPv6地址吗
现在有一种言论,说“IPv6地址无限多,每台服务器都可以配一个IP地址,不用做NAT”。
这很容易误导人,具体如何使用IPv6,还得根据场景而定。比如笔者的个人博客fzxiaomange.com,由nginx->php->mysql组成,分别位于3台服务器上,那只需要在nginx上配置IPv6地址,并在DNS上添加一条AAAA记录指向L7的IPv6地址即可。完全没必要在php、mysql服务器上配置IPv6地址,而且一旦配置了,就直接暴露内网了。
每个设备都配置IPv6,主要适用于偏客户端以及地址需求量大的场景,诸如物联网设备、手机4G、家庭宽带等。
另外,IPv6有NAT,适用于办公PC、机房服务器等需要访问IPv6网络,而不想被别人主动访问的场景。
困扰4. IPv4和IPv6要配在同一张网卡上吗
都可以,首先需要先了解2个词“单栈”和“双栈”:
以节点为角度(通用的解释):
▷ 单栈:表示一个IPv6节点,也就是一台服务器,或一部手机,仅有IPv6地址,或仅有IPv4地址,前者叫做“IPv6单栈”或“IPv6-Only”,后者叫“IPv4单栈”或“IPv4-Only”。
▷ 双栈:表示一个IPv6节点,同时拥有IPv6地址和IPv4地址
以网卡为角度:
▷ 单栈:表示一张网卡仅有IPv6地址,或仅有IPv4地址,示意图如下

▷ 双栈:表示一张网卡同时拥有IPv6地址和IPv4地址

IPv4和IPv6在逻辑上是两个完全不相交的世界。如果终端处位于同一个物理层,比如同一个VLAN,那么网卡就只能同时配置IPv6地址和IPv4地址;反之,就必须一张网卡配置IPv6,另一张网卡配置IPv4。所以,关键看网络架构是如何设计,各有利弊。比如放同一张网卡上,就可以做到带宽共享,而放不同网卡,可以做到带宽分别限制与计费。
困扰5. 我的网卡有fe80开头的地址,可以用来上公网吗


当网卡启动的时候,会自动生成“链路本地地址”(Link-Local Address),这是一个fe80::/10的单播地址。“链路本地地址”用于IP自动配置、邻居发现等。
注意事项:
▷ 核心:每张网卡都会存在“链路本地地址”,这是IPv6协议通讯的核心,不应当删掉
▷ 范围:仅在同一个二层范围内进行传播,不会被路由器做转发
▷ 地址:“链路本地地址”的算法不统一,有的操作系统会根据mac地址计算而来(EUI-64),而有的则是随机或其他某种算法计算而来
▷ 服务:“链路本地地址”虽然可以在二层内互通,但主要用于核心通讯以及某些网络高级协议。不适用于上层应用业务之间的通讯。因此不能用来上公网,也不能用于对外提供服务
困扰6. IPv6地址如何配置
公网地址和私网地址
▷ 公网地址:“全球单播地址”(Global Unicast Address,2000::/3)
▷ 私网地址:“唯一本地地址”(Unique-Local Address,fc00::/7)
细心的人可能会发现,为什么这里叫做“全球单播地址”,而“唯一本地地址”却不叫做“唯一本地单播地址”,好吧,其实都是简称,在RFC里是这么定义的:“Global Unicast Addresses”、“Link-Local IPv6 Unicast Addresses”。其实“全球单播地址”是可以叫做“全球地址”的,只是这样显得有点别扭。
自动生成还是固定IP
在IPv6里,任何单播地址都可以自动生成,也可以手工配置固定IP,具体看应用场景:
▷ 客户端:如果我想访问ipv6互联网,而不对外提供服务,那么使用自动生成即可,无需使用固定的ip地址
▷ 服务端:如果需要对外提供服务,那么ip地址就需要固定了,不能使用自动生成
自动配置IP
在ipv6里还分为2种方法:“有状态”与“无状态”
▷ 有状态(Stateful):地址由DHCPv6 Server统一管理,DHCPv6 Client从中获得一个可用的IP地址
▷ 无状态(Stateless,简称SLAAC):路由器发出“路由通告”报文(Router Advertisement,简称RA),报文内包含了IPv6地址的前缀信息。当收到RA包后,就会根据其中前缀信息,自动生成一个或多个IP地址
困扰7. 没有了ARP,如何解析MAC地址
ARP协议是IPv4用于解析目标MAC地址的协议,而在IPv6里,解析地址采用的是邻居发现(Neighbor Discovery Protocol,简称NDP或ND)
ND不是一个具体协议,而是用来描述多个相关功能的协议的抽象集合,所涵盖的所有协议均是基于ICMPv6。其中有2种报文与解析MAC地址有关:
▷ 邻居请求报文NS(Neighbor Solicitation):请求解析
▷ 邻居通告报文NA(Neighbor Advertisement):响应解析
这与ping是非常类似的:
▷ ping:发送icmp的echo request报文,对端响应icmp的echo reply报文
▷ 地址解析:发送icmp的ns报文,对端响应icmp的na报文
困扰8. IPv6使用多播替代广播,需要做哪些改造
IPv6使用多播替代了广播,多播的特点是不会像广播那样完全泛洪,而是数据包只发送给加入了多播组的机器。
但是,这有个前提,就是交换机要能识别并维护多播组的信息,主流交换机都具备此功能,然而并不都是默认开启的。对于二层交换机来说,需要开启MLDv2 Snooping。
顾名思义,就是交换机会识别“MLDv2成员报告”报文从哪个端口发来的,并记录下来,之后当交换机收到多播包后,会先查找其多播地址是否能在缓存里匹配上
▷ 匹配成功:仅会将数据包从相应的端口发出
▷ 匹配失败:就会泛洪,此时和广播毫无差异
困扰9. IPv6真的安全吗
理想很美好,IPv6从设计之初,就进行了大量的安全方面的设计,“完整的”IPv6在安全方面有至少以下3个优势:
▷ 原生支持的端到端加密
▷ 安全的邻居发现(Secure Neighbor Discovery,简称SEND)
▷ 更大的地址空间
现实很残酷,只有第3点发挥了作用,更大的地址空间,减少了被非法扫描到的概率。而第1、2点并没真正普及起来,因为协议本身就很复杂、学习难度很大、实现起来也很不容易。因此IETF为了加速IPv6的普及,对安全性不再强制要求。这也导致了IPv6实际上并没有预期中的那么安全,在IPv4里存在的地址欺骗、虚假网关等情况,在IPv6里依然存在。
困扰10. 如何学习IPv6
网上能找到非常多的IPv6教程,其中有很多教程都是通篇讲IPv6地址、IP包格式、ICMP包格式,这很容易让初学者打退堂鼓。笔者虽然不是专业的网工,但愿能抛砖引玉,推荐的学习步骤如下:
1️⃣ IPv6的历史、设计理念
2️⃣ IPv6的地址格式、分类、前缀计算,以及与IPv4的对比
3️⃣ IP地址、网关路由的配置与查看
4️⃣ 服务端实践,尝试给自己的网站增加IPv6
5️⃣ 客户端实践,让自己的PC访问IPv6互联网
6️⃣ 应用层实践,自己写一对C/S程序,能同时支持IPv4与IPv6
7️⃣ IPv6通讯原理,抓包分析每个包,熟悉ND、DHCPv6等
8️⃣ IPv4与IPv6的互访、过渡
9️⃣ IPv6安全
IPv6系列-初学者的10个常见困扰的更多相关文章
- IPv6系列-入门指南
本文是<IPv6系列>文章的第一篇<入门指南>,用于快速了解并上手IPv6. 小慢哥的原创文章,欢迎转载 目录 ▪ 一. 为什么要了解IPv6 ▪ 二. 顾虑:IPv6地址太复 ...
- 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)
问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己 ...
- C语言初学者代码中的常见错误与瑕疵(5)
问题: 素数 在世博园某信息通信馆中,游客可利用手机等终端参与互动小游戏,与虚拟人物Kr. Kong 进行猜数比赛. 当屏幕出现一个整数X时,若你能比Kr. Kong更快的发出最接近它的素数答案,你将 ...
- 分数的加减法——C语言初学者代码中的常见错误与瑕疵(12)
前文链接:分数的加减法——C语言初学者代码中的常见错误与瑕疵(11) 重构 题目的修正 我抛弃了原题中“其中a, b, c, d是一个0-9的整数”这样的前提条件,因为这种限制毫无必要.只假设a, b ...
- C语言初学者代码中的常见错误与瑕疵(9)
题目 字母的个数 现在给你一个由小写字母组成字符串,要你找出字符串中出现次数最多的字母,如果出现次数最多字母有多个那么输出最小的那个. 输入:第一行输入一个正整数T(0<T<25) 随后T ...
- 要心中有“数”——C语言初学者代码中的常见错误与瑕疵(8)
在 C语言初学者代码中的常见错误与瑕疵(7) 中,我给出的重构代码中存在BUG.这个BUG是在飞鸟_Asuka网友指出“是不是时间复杂度比较大”,并说他“第一眼看到我就想把它当成一个数学问题来做”之后 ...
- C语言初学者代码中的常见错误与瑕疵(7)
问题: 矩形的个数 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形,总共18个矩形.给出A,B,计算可以从中找到 ...
- 10个常见的JavaScript BUG
译者按: 安全起见,在开发中我基本不用==. 原文: 10 COMMON JAVASCRIPT BUGS AND HOW TO AVOID THEM 译者: Fundebug 为了保证可读性,本文采用 ...
- 10个常见的Node.js面试题
如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对Node.js的掌握程度. 本文就为你罗列了10个常见的Node.js面试题,分别考察了Node.js编程相关的几个主要方面. ...
随机推荐
- API 接口监控产品全新改版,免费开放全部功能
作为 EOLINKER 研发管理体系的重要一环,EOLINKER 接口监控即 AMT 产品将在 3月4日 迎来全新变化,AMT 产品将正式命名为 EOLINKER-API Beacon --API-烽 ...
- Python编码格式导致的csv读取错误
Python编码格式导致的csv读取错误(pandas.read_csv) 本文记录python小白我今天遇到的这两个问题(csv.reader和pandas.csv_read): pandas模块“ ...
- .NET 大数据量并发解决方案
https://www.cnblogs.com/wxlevel/p/7484738.html
- [如何在Mac下使用gulp] 1.创建项目及安装gulp
1.创建项目 2.安装gulp 3.创建gulpfile.js文件 4.运行gulp 创建项目 -创建项目文件夹命名为firstGulp,并在firstGulp目录下运行 npm init .npm ...
- os、sys模块
os模块 os模块是与操作系统交互的一个接口 os.makedirs("dirname1/dirname2") # 可生成多层递归目录 os.removedirs("di ...
- 24.通过ngram分词机制实现index-time搜索推荐
一.ngram和index-time搜索推荐原理 1.什么是ngram 假设有一个单词:quick,在5种长度下的ngram情况如下: ngram length=1,q u i c k ...
- -------------Django-----URLS路由
一.相约Django. 1.Django的特点:Django定义了服务分布.路由映射.模板编程.数据处理的一套完整的功能. (1)集成数据访问组件:Django的model层自带数据库ORM组件. ( ...
- ganlgia-rrdcached
一.介绍 rrdcached是一个高性能的RRD缓存守护进程,在不带来大量磁盘读/写文件i/o负荷的情况下,允许gmetad实例维护多个RRD文件.rrdcached可通过命令套接字控制,并且包含在大 ...
- JavaSE 学习笔记之Import 导入(十二)
Import - 导入:类名称变长,写起来很麻烦.为了简化,使用了一个关键字:import,可以使用这个关键字导入指定包中的类.记住:实际开发时,到的哪个类就导入哪个类,不建议使用*. import ...
- 清北学堂模拟赛d2t5 吃东西(eat)
题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...