# IP详解

IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。

IP协议有两个版本:IPv4和IPv6,而IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。它是IP协议提供的一种统一的地址格式,它为互联网上的的每一个网络和每一台主机分配一个逻辑地址,用于通信。

# IPv4地址分类

一个IP地址是由网络号和主机号组成的,每个IP地址是32位,分为四组,一组八位,用一个十进制数标识,我们最熟悉的IP是本地地址192.168.0.1。

IP地址分为5类:

IPClassify

注意:

  1. A,B,C类地址统称为单播地址,具有层次化机构,可分为网络位和主机位。适用于大型网络,中等网络,小型网络。
  2. D类地址是组播地址,没有层次化结构。
  3. E类地址保留用于科学研究。

他们归纳如下:

IPClassify2

在ABC三类地址中有一些私有地址,这些地址不能在Internet上用,只能在内部网络使用:

IPClassify3

除了上面的地址,还有一些特殊的IPv4地址:

  1. 一个网段中有两个特殊地址都是不分配给主机使用:
    1. 主机位全为0的地址称为网络地址,代表网络自身。
    2. 主机位全为1的地址被称为广播地址,代表网络中的所有主机。
  2. A类地址中有两个特殊地址:
    1. 0.0.0.0代表当前网络。主机利用DHCP获取地址时,发送的请求报文的源IP地址就是这个地址。
    2. 网络前缀为127是主机环回地址(Loopback),127.0.0.1==127.0.0.2==127.0.0.255。
  3. 在B类地址中(169.254.0.0~169.254.255.255)是一个特殊地址段,当主机使用DHCP获取IP失败时,就会使用这个网段中的一个随机地址。
  4. E类地址中255.255.255.255被称为有限广播地址(Limited Broadcast Address),这个被称为本地广播地址,代表当前网络中的所有主机。当主机利用DHCP获取地址时,发送的请求报文中的目标IP地址就是255.255.255.255。

# 子网划分

上面我们说到一个IP地址由网络号和主机号组成,网络号是网络供应商给的,而主机号我们是自己管理的,如果我们希望自己的网络需要划分出几个不同的网络组,这时候就需要在主机号中拿一部分作为子网号。那么如何区分哪些是子网号呢?这个时候就需要子网掩码了。

子网掩码需要配合IP地址来使用,它的工作过程是将32位的子网掩码与IP地址进行二进制形式的按位逻辑"与"运算得到的便是网络地址,将子网掩码和IP地址的二进制进行逻辑"异或"运算,得到的就是主机号。

下面是默认的子网掩码,也就是在未划分子网的情况下使用的子网掩码:

类别 子网掩码的二进制数值 子网掩码的十进制数值
A 11111111 00000000 00000000 00000000 255.0.0.0
B 11111111 11111111 00000000 00000000 255.255.0.0
C 11111111 11111111 11111111 00000000 255.255.255.0

下面是两个实战的场景:

subnet

subnet1

# CIDR

无类别域间路由(Classless Inter-Domain Routing、CIDR)是另一种子网掩码的表示方法,从上面我们知道单播IP有ABC三类,而CIDR打破了IP地址"类"的概念,打破了字节的限制,他也被称为VLSM(Variable Length Subnet Masking,可变长子网掩码)。CIDR采用13~27位可变网络ID,在IP地址后面添加一个/,后面是二进制子网掩码的位数。

# IPv4广播和组播

参考资料:

IPv4的地址按用途分有四种:

  • 单播,客户端与服务器之间点到点连接通信;
  • 组播,在发送者和多个接收者(如某个特定的分组)之间实现点对多点的连接通信;
  • 广播,在网络(广播地址范围内的子网)内广播数据包,网络内的每一台主机都将受到这些数据包;
  • 任播,使得数据包可以根据路由拓朴来决定送到"最近"或"最好"的目的地。

我们这里主要讨论的是组播和广播。注意TCP都是单播,UDP才可能会用广播和组播。他们的区别是:

  • 广播,一对全部,目的地址是局域网中的全部主机;
  • 多播,一对部分,目的地址是局域网中的部分主机;广播也是多播的一种特殊形式,即目的地址为全部主机。

# 广播

有时一个主机要向网上的所有其它主机发送帧,这就是广播,广播分为二层广播(目的MAC全F)和三层广播(IP地址的主机位全1),二层广播是不能跨路由器的,三层广播是可以跨路由器路由的。

广播又分为:

  • 受限的广播:它的地址是255.255.255.255。通常只在系统初始启动时才用到,此时主机还不知道它所在网络的网络掩码,甚至自己的IP都不知道。任何情况下路由器都不转发该广播,它仅存在于本地网络中。
  • 指向网络的广播:它的地址是主机号全为1的地址,路由器默认都会转发此类广播。
  • 指向子网的广播:它的地址是主机号全为1,且有特定子网号的地址。必须得知道子网掩码才能判断。
  • 指向所有子网的广播:它的地址是子网号和主机号全为1,如果网络没有划分子网,这就是一个指向全网的广播。

# 组播

广播是单台设备向网络中所有主机发送数据,而组播是向指定的一组主机发送主机。IP网络的多播一般通过多播IP地址来实现。多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址。Windows 2000中的DHCP管理器支持多播IP地址的自动分配。

源主机只需要发送一份数据,而网络中的路由器在转发该数据时需要将它复制多份,分别发给在该个多播组内的所有主机。也就是说,IP多播必须依赖于多播路由器,这些路由器具有识别多播包的功能。能够接收发往一个特定多播组地址数据的主机集合称为主机组 (host group)。一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。

组播地址也有分类的:

  • 224.0.0.0~224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
  • 224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;
  • 224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
  • 239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

# IPv6

参考资料:

UTC+1时间2019年11月25日 15:35 分(北京时间 22:35 分),RIPE NCC(欧洲网络协调中心)从可用池中的最后剩余地址进行了最后的分配。也就是说,全球的 IPv4 地址已经用完。2021年7月12日,中央网络安全和信息化委员会办公室、国家发展和改革委员会、工业和信息化部发布关于加快推进互联网协议第六版(IPv6)规模部署和应用工作的通知。

注意:

  1. IPv6是128位,一组16位,四个十六进制数,一共8组;IPv4是32位,一组8位,一个十进制数,一共4组。
  2. 当IPv6中间和末尾有很多零时,中间的零可以用::代表省略,但是末尾的零不能省掉(缩头不缩尾)。
  3. IPv6同v4一样,分成两部分:网络部分(前64位,其中前48位为网络供应商提供,为路由前缀,后16位为子网部分)和接口ID部分(后64位)。其中/后面的数字主要是指示了多少位前缀为网络部分。
  4. IPv6没有子网掩码,移除了广播。

大体上IPv6分为:

  • 单播地址(Unicast)
  • 组播地址(Multicast)
  • 任意播地址(Anycast)

IPClassify5

它的地址分配情况为:

IPv6fenpei

# 单播地址

下面是IPv6的单播地址的分类:

IPClassify4v6

  1. 可聚合全球单播地址(Aggregate global unicast address),可理解为公网地址。

    IPv6danbo1

    该地址规定前3位为001,地址范围为2xxx:xxxxx - 3FFF::FFFF,目前在用的前缀有三个:

    • 2001::/16:实际用于IPv6已分配地址。
    • 2002::/16:IPv6到IPv4的过渡地址。
    • 3ffe::/16:用于6bone网络测试,6bone是IETF(Internet工程任务组)用于对IPv6进行测试的网络,目的是将IPv4网络向IPv6网路迁移。
  2. 本地链路地址(link-local address)

    设计链路本地地址的目的是为了用于诸如自动地址配置、邻居发现或无路由器存在的单链路的寻址。路由器不能将带有链路本地源地址或目的地址的任何包转发到其他链路上去。

    IPv6danbo2

    此地址前缀是FE80::/10,当一个节点启用IPv6时自动生成,上面的64位扩展由MAC地址按照EUI 64转换而来,首先把MAC地址对半分开,插入一个固定值FFFE,再把第7位翻转。这样做的原因是在MAC地址中,第7比特为1表示本地管理,为0表示全球管理,而在EUI-64格式中,第7位为1表示全球唯一,为0表示本地维一。

    比如MAC地址为0012:3400:ABCD,需要做如下变动:

    0012:3400:ABCD -> 0012:34FF:FE00:ABCD -> 0212:34FF:FE00:ABCD -> FE80::212:34FF:FE00:ABCD

    IPv6danbo2_2

  3. 本地站点地址(site-local address)

    设计站点本地地址的目的是为了用于无需全球前缀的站点内部寻址。路由器不应转发站点外具有站点本地源或目的地址的任何包。

    IPv6danbo3

    此地址前缀是FEC0::/10,前10位是固定的,后54位用于子网分配,最后64位用于接口ID,这是IPv6的私网地址,就像IPv4的私网保留地址一样,只占到IPv6的0.1%。本地站点地址被设计用于永远不会与全球IPV6因特网进行通信的设备,比如:打印机、内部网服务器、网络交换机等。

  4. 唯一本地地址(Unique Local Address)

    IPv6danbo4

    唯一本地地址,概念上相当于私有IP,仅能够在本地网络使用,在IPv6 Internet上不可被路由。最开始在RFC 3513中规定使用本地站点地址作为通信,后来在RFC 3879中弃用了本地站点地址,后来RFC 4193中定义了唯一本地地址。

    由于站点本地地址会在网络间建立VPN时以及合并网络时导致冲突,因此它们已被弃用。唯一的本地地址确保每个网络使用不同的地址,以便链接和合并不成问题。

    唯一本地地址和链路本地地址的区别是,一个跨本地局域网(跨本地的两个路由器),一个在自己局域网里通信。比如一个公司有开发部和人事部,开发部和开发部以及人事部和人事部内部通信,都用链路本地地址;开发部和人事部之间通信用唯一本地地址。

    唯一本地地址有几个特征:

    • 允许站点进行合并或私下互连,而不会产生任何地址冲突或要求使用这些前缀对接口进行重新编号。
    • 独立于任何 ISP,而且可用于站点内通信,无需进行 Internet 连接。
    • 不可通过 Internet 路由,但是如果无意中因路由或 DNS 而泄露出去,也不会与其他地址发生冲突。
  5. 未指定地址(Unspecified address)

    形式为:0:0:0:0:0:0:0:0/128 或 ::/128

    它表示地址未指定,写路由时代表所有路由。此地址可为DHCPv6初始化过程中客户端所发送报文的源IP。

    在IPv4中,地址0.0.0.0和子网掩码0.0.0.0表示默认路由,在IPv6中地址0:0:0:0:0:0:0:0,掩码全为0表示默认路由,可以压缩为::/0。

  6. 环回地址(Loopack address)

    形式为:0:0:0:0:0:0:0:1/128 或 ::1/128

    在IPv4中,127.0.0.1到127.255.255.255区间表示环回地址,在IPv6中只有上面的地址表示环回地址。

  7. 内嵌IPV4地址的IPV6地址(IPv4 Compatible Address)

    1. IPV4兼容的IPV6地址--用于在IPV4网络上建立自动隧道,以传输IPV6数据包。 其中高96bit设为0,后面跟32bit的IPV4地址 0000:0000:0000:0000:0000:0000:206.123.31.2 0000:0000:0000:0000:0000:0000:ce7b:1f01 由于这种机制不太好,现在已经不再使用,转而采用更好的过渡机制
    2. 映射IPV4的IPV6地址--仅用于拥有IPV4和IPV6双协议栈节点的本地范围 其中高80bit设为0,后16bit设为1,再跟IPV4地址 0000:0000:0000:0000:0000:ffff:206.123.31.2 0000:0000:0000:0000:0000:ffff:ce7b:1f01

# 组播地址

IPv6 多播(组播)地址是一组接口的标识符(典型在不同节点上)。一个接口可以属于任何数目的多播组。

IPv6zubo

永久分配的多播地址的“含义”独立于范围值。

例如,如果给“NTP服务器组”分配一个组ID 为101(16进制)的永久多播地址,那么

  • FF01:0:0:0:0:0:0:101意味着在相同接口(即,相同节点)上的所有NTP服务器(作为发送者)。
  • FF02:0:0:0:0:0:0:101意味着在相同链路上的所有NTP服务器(作为发送者)。
  • FF05:0:0:0:0:0:0:101意味着在相同站点内的所有NTP服务器(作为发送者)。
  • FF0E:0:0:0:0:0:0:101意味着在互联网中的所有NTP服务器。

下面是组播指定的地址:

  • FF02::1,在本地链路范围的所有节点(all nodes)
  • FF02::2,在本地链路范围的所有路由器(all routers)
  • FF02::5,all ospf routers
  • FF02::9,所有运行RIP的路由器(all rip routers)
  • FF02::A,所有运行eigrp的路由器(all eigrp routers)
  • FF05::2,在一个站点范围内的所有路由器

# 任意播(Anycast address)

参考资料:

它应用在one-to-nearest模式,一个发送方同最近一组接收方之间的通信,当一个单播地址被分配到多于一个的接口上时,发到该接口的报文被网络路由到由路由协议度量的"最近"的目标接口上。

IPv6renbo1

任播地址基本上就像一个通常的单播地址,不同之处只是其前缀指定了子网和一个全0的标识符,地址中的子网前缀部分被设置为所用到子网前缀的值,地址的其余位设置为0,发送到这个地址上的数据包会被发送到该子网中的一个路由器上。所有的路由器对与它们有接口连接的子网都必须支持这种子网路由器任播地址。

任播选路是在有限的范围内进行,这个有限的范围是一个子网区域。任播地址中用其前缀定义了所有任播节点存在的地区。比如一个ISP可能要求它的每一个用户单位提供一个时间服务器,这些时间服务器共享单个任播地址。一个任播地址必定带有一个选路项,该选路项包括一些指针,指向共享该任播地址的所有节点的网络接口。

任播地址只能用作IPv6数据报的目的地址,任播地址只能分配给IPv6路由器,不能指定给IPv6主机。当前规定任播地址不能作为数据报的源地址,主要的担心是在多个任播成员的情况下,无法确定数据报的来源。但在一个开放的网络中,攻击者是很容易伪造数据报的源节点,若要获得安全性,较好的方法还是在高层协议中处理或是采用IPSec技术。

Anycast 的用途之一是用一个主机进行组内所有主机路由表的更新工作。IPv6 可以自动判断最近的网关,然后将数据包传给此网关。反过来,此网关可以对组内所有的主机进行Anycast,直到完成整个路由表的更新工作。

任意播的应用前景:

  1. 分布的服务共享相同的 IP 地址,同时在 IP 层进行透明的服务定位,这使得各种网络服务特别是应用层服务具有更强的透明性,比如 DNS(Domain Name System,域名系统),在 IPv6 网络中它可以共享一个熟知的 IP 地址,用户不需要特殊配置也不用关心访问的是哪一台 DNS 服务器;
  2. 路由系统选择了"最近"的服务,缩短了服务响应的时间,同时减轻了网络负载;
  3. 相同的服务在网络上冗余分布,路由系统可以提供机制选择负载相对轻的带宽相对高的路径来转发报文

它的好处:

  1. 减弱了分布式拒绝服务攻击(DDoS:Distributed Denial of Service)对用户带来的影响。当 Anycast 组中某一个成员或者几个成员受到攻击时,负责报文转发的路由器可以根据各个组成员的响应时间来决定报文应该转发到哪个成员上,这样受到攻击的成员由于没有响应,所以报文就不会被转发到那里,同时,由于 Anycast 提供的服务访问透明性,组成员也相对较难受到 DDoS 攻击。
  2. 减弱了网络拥塞给用户带来的影响。同上面的道理,当 Anycast 的某些组成员处在拥塞的网段时,它的响应时间就较长,报文可以被转发到响应较好的成员那里。

# 必有的IPv6

节点及路由器必须具备的IPv6地址:

IPv6all

# 百分号含义

IPv6中有百分号,如下

IPv6baifenhao

IPv6地址中的百分号是网卡interface标识,表示该地址仅限于标号为11的网络接口(一般指网卡或者虚拟网卡)。而在其他网络接口这个地址是无效的。由于所有的link-local地址都有相同的前缀FE80::/64,并且每个网络接口都必须分配一个link-local地址,因而导致当发送数据包到一个link-local地址时,如果路由器使用普通的路由方法就无法决定选用哪个网络接口。因此,引入了一种被叫做zone index的标识符,它提供额外的路由信息,这个标识符通常指网络接口,并且通过一个百分号(%)被附加在IPv6地址后面。

要查看网络接口可使用如下方法:

cmd -> netsh -> interface ipv6 -> show joins

# bind开启IPv6服务

port 53;
listen-on port 53 {192.168.32.46;};
listen-on-v6 port 53 {fe80::20c:29ff:fe88:9705;};
1
2
3