2024-04-18  阅读(4)
原文作者:小小工匠 原文地址: https://artisan.blog.csdn.net/article/details/118464702

202404182040102921.png


Pre

计网 - IPv4 协议:路由和寻址的区别是什么?

IPv4 用 32 位整数描述地址,最多只能支持 43 亿设备 ,显然是不够用的, 这也被称作 IP 地址耗尽问题

为了解决这个问题,有一种可行的方法是拆分子网。拆分子网,会带来很多问题,比如说内外网数据交互,需要网络地址转换协议(NAT 协议),增加传输成本。再比如说,多级网络会增加数据的路由和传输链路,降低网络的速度。理想的状态当然是所有设备在一个网络中,互相可以通过地址访问。

为了解决这个问题,1998 年互联网工程工作小组推出了全新款的 IP 协议——IPv6 协议。但是目前 IPv6 的普及程度还不够高.

既然不能做到完全普及,也就引出了关联的一道面试题目:什么是 Tunnel 技术?


IPv4 和 IPv6 相似点

IPv6 的工作原理和 IPv4 类似, 分成切片(Segmentation)、增加封包头、路由(寻址)这样几个阶段去工作

IPv6 同样接收上方主机到主机(Host-to-Host)协议传递来的数据,比如一个 TCP 段(Segment),然后将 TCP 段再次切片做成一个个的 IPv6 封包(Datagram or Packet),再调用底层局域网能力(数据链路层)传输数据

具体的过程如下图所示:

202404182040106012.png
作为网络层协议的 IPv6,最核心的能力是确保数据可以从发送主机到达接收主机。因此,和 IPv4 类似,IPv6同样需要定义地址的格式,以及路由算法如何工作。


IPv6 地址

接下来我们重点说说地址格式的区别。

IPv4 的地址是 4 个 8 位(octet),总共 32 位。 IPv6 的地址是 8 个 16 位(hextet),总共 128 位

202404182040109843.png

从这个设计来看,IPv6 可以支持的地址数量是 IPv4 的很多倍。就算将 IPv6 的地址分给每个人,每个人拥有的地址数量,依旧是今天总地址数量的很多倍。

格式上,IPv4 的地址用.分割,如103.28.7.35。每一个是 8 位,用 0-255 的数字表示。

IPv6 的地址用:分割,如0123:4567:89ab:cdef:0123:4567:89ab:cdef,总共 8 个 16 位的数字,通常用 16 进制表示

202404182040113574.png

  • Hexadecimal notation:十六进制表示
  • Quartet:16 位
  • Most significant:最高有效位
  • Binary notation:二进制表示

上图中的地址是一个 IPv6 地址的完全态,其实也有简写的方式。比如:

    0123:4567:0000:0000:0123:4567:0000:cdef

可以省略前 64 字节的0000:0000简写为:

    0123:4567::0123:4567:0000:cdef

::只能出现一次,相当于省略了若干组0000。比如说1111::2222相当于中间省略了 6 组0000 。为什么不能出现两个::呢?因为如果有两个::,就会对省略的0000的位置产生歧义。比如说1111::2222:3333,你就不知道究竟0000在1111::2222和2222::3333是怎么分布的。

开头的 0 也可以简写,就变成如下的样子:

    123:4567::123:4567:0:cdef

还有一种情况我们想要后面部分都填0,比如说3c4d::/16,这个代表只有前16位有数据,后面是0;1234:5878:abcd/64代表只有左边64位有数据,后面是 0;再比如ff00/8,只有左边 8 位是有数据的。

202404182040117845.png


IPv6 的寻址

接下来我们讨论下寻址,和 IPv4 相同, 寻址的目的是找到设备,以及规划到设备途经的路径。和 IPv4 相同,IPv6寻址最核心的内容就是要对网络进行划分 。IPv6 地址很充裕,因此对网络的划分和 IPv4 有很显著的差异。

寻址分类

IPv6 的寻址分成了几种类型:

  • 全局单播寻址(和 IPv4 地址作用差不多,在互联网中通过地址查找一个设备,简单来说,单播就是 1 对 1);
  • 本地单播(类似 IPv4 里的一个内部网络,要求地址必须以fe80开头,类似我们 IPv4 中127开头的地址);
  • 分组多播(Group Multicast),类似今天我们说的广播,将消息发送给多个接收者;
  • 任意播(Anycast),这个方式比较特殊,接下来我们会详细讲解。

全局单播

202404182040121176.png
全局单播,就是将消息从一个设备传到另一个设备,这和 IPv4 发送/接收消息大同小异。而全局单播地址,目标就是定位网络中的设备,这个地址和 IPv4 的地址作用相同,只不过格式略有差异。总的来说,IPv6 地址太多,因此不再需要子网掩码,而是直接将 IPv6 的地址分区即可。

在实现全局单播时,IPv6 地址通常分成 3 个部分:

  • 站点前缀(Site Prefix)48bit,一般是由 ISP(Internet Service Providor,运营商)或者RIR(Regional Internet Registry, 地区性互联网注册机构),RIR 将 IP 地址分配给运营商;
  • 子网号(Subnet ID),16bit,用于站点内部区分子网;
  • 接口号(Interface ID), 64bit,用于站点内部区分设备。

因此 IPv6 也是一个树状结构,站点前缀需要一定资质,子网号和接口号内部定义。IPv6 的寻址过程就是先通过站点前缀找到站点,然后追踪子网,再找到接口(也就是设备的网卡)。

从上面全局单播的分区,我们可以看出,IPv6 分给站点的地址非常多。一个站点,有 16bit 的子网,相当于 65535 个子网;每个子网中,还可以用 64 位整数表示设备。


本地单播

理论上,虽然 IPv6 可以将所有的设备都连入一个网络。但在实际场景中,很多公司还是需要一个内部网络的。这种情况在 IPv6 的设计中属于局域网络。

在局域网络中,实现设备到设备的通信,就是本地单播。IPv6 的本地单播地址组成如下图所示:

202404182040124527.png
这种协议比较简单,本 地单播地址必须以fe80开头,后面 64 位的 0,然后接上 54 位的设备编号 。上图中的 Interface 可以理解成网络接口,其实就是网卡


分组多播

有时候,我们需要实现广播。所谓广播,就是将消息同时发送给多个接收者。

IPv6 中设计了分组多播,来实现广播的能力。当 IP 地址以 8 个 1 开头,也就是ff00开头,后面会跟上一个分组的编号时,就是在进行分组多播。

这个时候,我们需要一个广播设备,在这个设备中已经定义了这些分组编号,并且拥有分组下所有设备的清单,这个广播设备会帮助我们将消息发送给对应分组下的所有设备。


任意播(Anycast)

任意播,本质是将消息发送给多个接收方,并选择一条最优的路径。这样说有点抽象,接下来我具体解释一下。

比如说在一个网络中有多个授时服务,这些授时服务都共享了一个任播地址。当一个客户端想要获取时间,就可以将请求发送到这个任播地址。客户端的请求扩散出去后,可能会找到授时服务中的一个或者多个,但是距离最近的往往会先被发现。这个时候,客户端就使用它第一次收到的授时信息修正自己的时间。


IPv6 和 IPv4 的兼容

目前 IPv6 还没有完全普及,大部分知名的网站都是同时支持 IPv6 和 IPv4。这个时候我们可以分成 2 种情况讨论:

  • 一个 IPv4 的网络和一个 IPv6 的网络通信;
  • 一个 IPv6 的网络和一个 IPv6 的网络通信,但是中间需要经过一个 IPv4 的网络。

情况 1:IPv4 网络和 IPv6 网络通信

例如一个 IPv6 的客户端,想要访问 IPv4 的服务器,步骤如下图所示:

202404182040128158.png

  1. 客户端通过 DNS64 服务器查询 AAAA 记录。DNS64 是国际互联网工程任务组(IETF)提供的一种解决 IPv4 和 IPv6 兼容问题的 DNS 服务。这个 DNS 查询服务会把 IPv4 地址和 IPv6 地址同时返回。
  2. DNS64 服务器返回含 IPv4 地址的 AAAA 记录。
  3. 客户端将对应的 IPv4 地址请求发送给一个 NAT64 路由器
  4. 由这个 NAT64 路由器将 IPv6 地址转换为 IPv4 地址,从而访问 IPv4 网络,并收集结果。
  5. 消息返回到客户端。

情况 2:两个 IPv6 网络被 IPv4 隔离

这种情况在普及 IPv6 的过程中比较常见,IPv6 的网络一开始是一个个孤岛,IPv6 网络需要通信,就需要一些特别的手段。

不知道你有没有联想到坐火车穿越隧道的感觉,连接两个孤岛 IPv6 网络,其实就是在 IPv4 网络中建立一条隧道。如下图所示:

202404182040131219.png

隧道的本质就是在两个 IPv6 的网络出口网关处,实现一段地址转换的程序


总结

总结下, IPv6 解决的是地址耗尽的问题。因为解决了地址耗尽的问题,所以很多其他问题也得到了解决,比如说减少了子网,更小的封包头部体积,最终提升了性能等

QA

Tunnel 技术是什么了吗

Tunnel 就是隧道,这和现实中的隧道是很相似的。隧道不是只有一辆车通过,而是每天都有大量的车辆来来往往。两个网络,用隧道连接,位于两个网络中的设备通信,都可以使用这个隧道。隧道是两个网络间用程序定义的一种通道。具体来说,如果两个 IPv6 网络被 IPv4 分隔开,那么两个 IPv6 网络的出口处(和 IPv4 网络的网关处)就可以用程序(或硬件)实现一个隧道,方便两个网络中设备的通信。

IPv6 和 IPv4 究竟有哪些区别

IPv6 和 IPv4 最核心的区别是地址空间大小不同 。IPv6 用 128 位地址,解决了 IP 地址耗尽问题。因为地址空间大小不同,它们对地址的定义,对路由寻址策略都有显著的差异。

在路由寻址策略上,IPv6 消除了设备间地址冲突的问题,改变了划分子网的方式。在 IPv4 网络中,一个局域网往往会共享一个公网 IP,因此需要 NAT 协议和外网连接。

在划分子网的时候,IPv4 地址少,需要子网掩码来处理划分子网。IPv6 有充足的地址,因此不需要局域网共享外网 IP。也正因为 IPv6 地址多,可以直接将 IPv6 地址划分成站点、子网、设备,每个段都有充足的 IP 地址。

因为 IPv6 支持的 IP 地址数量大大上升,一个子网可以有 248 个 IP 地址,这个子网可能是公司网络、家庭网络等。这样 IP 地址的分配方式也发生了变化,IPv4 网络中设备分配 IP 地址的方式是中心化的,由 DHCP(动态主机协议)为局域网中的设备分配 IP 地址。而在 IPv6 网络中,因为 IP 地址很少发生冲突,可以由设备自己申请自己的 IP 地址。

另外因为 IPv6 中任何一个节点都可以是一个组播节点,这样就可以构造一个对等的网络,也就是可以支持在没有中心化的路由器,或者一个网络多个路由器的情况下工作。节点可以通过向周围节点类似打探消息的方式,发现更多的节点。这是一个配套 IPv6 的能力,叫作邻居发现(ND)。

2024041820401349010.png


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文