一、IPv4协议详解
1.1 IP协议简介
IP协议位于 TCP/IP 模型的网络层,是整个 TCP/IP 协议族的核心,也是构成互联网的基础。
IP协议用于屏蔽下层物理网络的差异,为上层提供统一的IP数据报。 IP协议提供了无连接的、不可靠的、尽力的数据报投递服务:
- 无连接的投递服务: 发送端可于任何时候自由发送数据,而接收端永远不知道自己会在何时从哪里接收到数据。每个IP数据报独立处理和传输,一台主机发出的数据报序列,可能会走不同的路径,甚至有可能其中一部分数据报会在传输过程中丢失。
- 不可靠的投递服务: IP协议本身不保证IP数据报投递的结果。在传输过程中,IP数据报可能会丢失、重复、延迟和乱序等,IP协议不对内容作任何检测,也不将这些结果通知收发双方。IP数据报的丢失将通过路由器发ICMP报文告知。要想保证数据可靠,需要上层应用处理,例如TCP协议利用IP协议传输数据,但是丢包、超时等情况还是要靠 TCP 自己解决。
- 尽力的投递服务: 每个数据链路上会规定一个最大传输单元MTU,如果IP数据报的长度超过MTU,那么网络层就会把这些报文分割成一个一个的小组(分组)进行传送,以适应具体的传输网络。
1.2 IPv4数据报文定义
TCP/IP协议 定义了一个在因特网上传输的包,称为 IP数据报,它由首部和数据两部分组成。其中首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的,在 0 ~ 40 字节之间,这部分最大长度为40字节。也就是说 IP数据报 首部的长度在 20 ~ 60 字节之间。
首部中的源地址和目的地址都是IP协议地址。如下图所示:
1.3 IP头格式分析
- 版本(Version)字段:占4比特,用来表明IP协议实现的版本号,目前有 IPv4、IPv6 两个版本,当前一般为IPv4,即0100。
- 首部长度(Internet Header Length,IHL)字段:占4比特,因为头部长度不固定(Option可选部分不固定),所以需要标识该分组的头部长度多少,用4bit表示,以4byte为单位,取值范围:5 ~ 15,即20(5*4) ~ 60(15*4)byte(其它字段也是类似的计算方式,因为bit位是不够表示该字段的值)。
- 服务类型(Type of Service ,TOS)字段:占8比特,其中前3比特为优先权子字段(Precedence,现已被忽略);第4至第7比特分别代表延迟、吞吐量、可靠性和花费。当它们取值为1时分别代表要求最小时延、最大吞吐量、最高可靠性和最小费用(这四者冲突,只能选择一个),可以全为0,若全为0则表示一般服务,第8比特保留未用。服务类型字段声明了数据报被网络系统传输时可以被怎样处理。例如:TELNET协议可能要求有最小的延迟,FTP协议(数据)可能要求有最大吞吐量,SNMP协议可能要求有最高可靠性,NNTP(Network News Transfer Protocol,网络新闻传输协议)可能要求最小费用,而ICMP协议可能无特殊要求(4比特全为0)。实际上,大部分主机会忽略这个字段,但一些动态路由协议如OSPF(Open Shortest Path First Protocol)、IS-IS(Intermediate System to Intermediate System Protocol)可以根据这些字段的值进行路由决策。RFC2474的ToS取消了IP precedence字段而使用了DSCP,QoS里有描述,给QoS用来打标签。
- 总长度:占16比特,指明整个数据包的长度(以字节为单位,含头长度),最大长度为 216 -1 = 65535字节,可用总长度减去头部长度获得实际报文数据的长度,取值范围0-65535byte,链路只允许1500byte,所以一般超过 1480 字节后就会被分片(以太帧MTU最大为 1500 - 固定首部 20)都需要MTU分片 。
- 标识字段:占16比特,用来唯一的标识主机发送的每一份数据报,通常每发一份报文,它的值会加1。通常与标记字段和分片偏移字段一起用于IP报文的分片。当原始报文大小超过MTU,那么就必须将原始数据进行分片。每个被分片的报文大小不得超过MTU,而这个字段还将在同一原始文件被分片的报文上打上相同的标记,以便接收设备可以识别出属于同一个报文的分片,IP 报文的唯一id,分片报文的id 相同,便于进行重组。“类似于进程号”,有时候电信会用它来识别流量是否是同一台主机(因为做了PAT后源ip都是一样的!)
注意:Ethernet以太网跟802.3以太网有所区别,802.3是由IEEE指定的标准,比较复杂用的比较少,网卡一般两种都支持。IP数据包的MTU值在各种物理线路环境下对应的MTU取值:(注意:不包含帧头和尾)
- 标志位字段:占3比特,标志一份数据报是否分片(DF:Don’t Fragment;MF:More Fragment)。第1位没有被使用;第2位是不分片标志位(DF,DF=1:不能分片,DF=0:允许分片),Do not fragment,顾名思义,不要分片,当DF位设置为1时,表示路由器不能对报文进行分片处理;第3位M表示还有后继分片(MF,MF=1:后面还有分片,MF=0:最后一个),More fragment,多分片,当路由器对报文进行分片时,除了最后一个分片的MF位设置为0外,其他所有分片的MF位均设置1,以便接收者直到收到MF位为0的分片为止
- 段偏移字段:占13比特,如果一份数据报要求分段的话,此字段指明该段偏移距原始数据报开始的位置。该字段是与ip分片后,相应的ip片在总的ip片的位置。该字段的单位是8字节。比如,一个长度为4000字节的ip报文,到达路由器。这是超过了链路层的MTU,需要进行分片,4000字节中,20字节为包头,3980字节为数据,需要分成3个ip片(链路层MTU为1500),那么第一个分片的片偏移就是0,表示该分片在3980的第0位开始,第1479位结束。第二个ip片的片偏移为185(1480/8),表示该分片开始的位置在原来ip的第1480位,结束在2959。第三片的片偏移为370(2960/8),表示开始的时候是2960位,结束的时候在3979位。
- 生存期(TTL:Time to Live)字段:占8比特,用来设置数据包最多可以经过的路由器数(数据报到达目的地的最大报文跳数),由发送数据的源主机设置,通常为32、64(win7)、128、255(linux)等。每经过一个路由器,其值减1,直到0时该数据包被丢弃,这个字段主要是用来防止数据报在网络中无限循环。
- 协议字段:占8比特,指明IP层所封装的上层协议类型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。
- 头部校验和字段:占16比特,内容是根据IP头部计算得到的校验和码。计算方法是:对头部中每个16比特进行二进制反码求和。(和ICMP、IGMP、TCP、UDP不同,IP不对头部后的数据进行校验)。
- 源IP地址、目标IP地址字段:各占32比特,用来标明发送IP数据报文的源主机地址和接收IP报文的目标主机地址。
- 选项字段:是一个变长字段,长度必须是32比特(4字节)的整数倍,如果不足,必须填充0以达到此长度要求,最多40字节。选项字段用来定义一些任选项:如记录路径、时间戳等,可以包含多个选项。这些选项很少被使用,同时并不是所有主机和路由器都支持这些选项。
- 填充字段(Padding):用于对报头进行填充,以使报头长度能够被32位的倍数整除。
- 数据(Payload):用来存入实际要传输的数据,同时将 IP 上层协议(TCP、UDP等协议)的首部也作为数据进行处理。
二、IPv4地址
2.1 IPv4地址简介
IP协议 中一个非常重要的内容就是给每个连接在Internet上的主机、路由器等分配的一个32bit唯一地址,这个地址叫做 IP地址。这种唯一地址保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出自己所需的对象来。
IP地址就像是我们的家庭住址,如果你要写信给一个人,就要知道对方的地址,这样邮递员才能把信送到。计算机发送信息就好比是邮递员,它必须知道唯一的“家庭地址”才能不至于把信送错人家。只不过寄信地址是用文字来表示,计算机地址是用二进制数字表示。
IPv4是Internet Protocol version 4的缩写,即IP协议版本4,又称互联网通信协议第四版,是IP协议开发过程中的第四个修订版本,也是此协议第一个被广泛部署的版本。
按照协议规定,IP 地址用二进制来表示,每个 IPv4 地址长 32 位,比特换算成字节,就是4个字节,因此,IPv4地址的数量是2^32 = 4294967296,也就是说:最多可以给大约 43 亿台接入互联网的设备配置其独一无二的IPv4地址,如11000000 10101000 00000001 00000110(192.168.1.6)。IP地址包括 网络地址 和 主机地址 两部分。
一个采用二进制形式的IP地址是一串很长的数字,难以处理。为了方便使用,IP地址习惯性地被写成十进制形式,使用 .
将节32位长度的IPv4地址分为四个不同的字节(8位),每个字节的十进制取值范围为:0 ~ 255(28),这种表示法叫做 点分十进制表示法,这显然比一连串二进制 1 和 0 容易记忆得多,是目前使用比较广泛的IP地址书写方式,如下图所示。
Tips: 在Internet网络中,IP地址更准确来说,是与每个网络接口相关联,即某某主机、路由器的IP地址。而一般说某个主机的IP地址,实际上是因为大部分主机往往只有一个网络接口,这个接口地址往往也被当做主机IP地址。
2.2 IPv4 地址分类
如果我们随意的为主机分配独立的IP地址,再用路由转发表来记录的话,很容易造成路由器的存储、检索性能瓶颈。因此,把32位IP地址划分为两部分: 网络号(NetID)和 主机号(HostID),在为接口分配IP地址时,按照范围进行分配。这样同一个物理网络上的所有主机都使用同一个网络ID,同一个网络上的一个主机(包括网络上工作站,服务器等)有一个唯一的主机ID与其对应。
Internet委员会定义了5种IP地址类型以适合不同容量的网络,即A类~E类。其中A、B、C这3类地址由国际互联网络信息中心(InternetNIC)在全球范围内统一分配,D类是广播地址,E类是保留地址(未启用)。
- A、B、C 三类IP地址分为网络地址和主机地址,网络地址表示一个网络,主机地址分给具体的主机;
- 主机地址全为 0 和全为 1 的IP 有特殊用途。主机地址全为 0 表示网络号,代表这个网络本身;主机地址全为1 表示广播地址,代表这个网络中的所有主机,所以每一个网络的主机数都是2^n-2,n是主机地址的位数;
- 每个类别中(除了 D、E类),都有一些地址有特殊的用户,留作私有地址或者回环地址,例如192.168..、127.0.0.1;
- 子网掩码全为1的位数就是网络地址的位数。
(1) A类地址 A类地址 是指在IP地址的四段号码中,第一段号码为网络号码,剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址,A类地址就由1字节网络地址和3字节主机地址组成,即网络标识长度为8位,主机标识的长度为24位,子网掩码为255.255.0.0。
A类地址中第一位固定为 0
,有从 0 ~ 127 共128个网络,其中网络地址低7位全为 0
和 全为 1
的为特殊地址,不能使用,所以 A 类地址可用的网络数是 126个。A类地址中每个网络可容纳 $2^{24}$-2 = 256×256×256-2 = 16,777,214 台主机(去除 1个主机位为 0的网络地址 和 1主机位为个广播地址)。A类地可用 IP 地址从 [1.0.0.1] ~ [126.255.255.255]。
A类地址中一些特殊网址如下:
- 127.0.0.1 是本地地址(localhost)或称为“回环地址”(Loopback Address),可以理解为一个虚拟网卡,这个网卡只接收来自本机的数据包,一般用于测试使用,例如:ping 127.0.0.1 来测试本机TCP/IP是否正常。
- 10.0.0.0 255.0.0.0,保留了1个A类网络。网络地址
10
用作内网地址,从 10.0.0.0 ~ 10.255.255.255,很多公司内网 IP 都是 10 网段。 - 每一个网络,主机地址全 0 和全 1 的都是保留地址,所以每一个网络的主机数都是2^n-2,n是主机地址的位数。
(2) B类地址
B类地址 是指在IP地址的四段号码中,前两段号码为网络号码,后两段号码为本地计算机的主机号码。如果用二进制表示IP地址,B类地址就由2字节网络地址和2字节主机地址组成。
B类地址中前两位固定为 10
,网络标识长度为16位,主机标识长度为16位,子网掩码为255.255.0.0,有$2^{14}$=16384个网络,每个网络所能容纳的计算机数为$2^{16}$-2=65534台主机。B类网络地址适用于中等规模的网络,地址全 0 和 全 1 的都是保留地址,B类地址可用 IP 地址从 [128.0.0.1] ~ [191.255.255.254]。
B类地址中一些特殊网址如下:
- 172.16.0.0 ~ 172.31.255.255 保留了16个B类网络留作私有地址使用。
- 169.254.0.0 ~ 169.254.255.255 是保留地址。
(3) C类地址
C类地址 是指在IP地址的四段号码中,前三段号码为网络号码,剩下一段号码为本地计算机号码。如果用二进制表示IP地址,C类地址就由3字节网络地址和1字节主机地址组成,网络地址中前三位固定为 110
,子网掩码为255.255.255.0。C类地址中网络标识长度为24位,主机标识长度为8位,C类网络地址数量较多,有$2^{21}$=2097152个网络。每个网络最多只能包含$2^{8}$-2=254台计算机,适用于小规模局域网络。C类地址全 0 和全 1 的都是保留地址,范围 192.0.0.1-223.255.255.254。
C类地址中一些特殊网址如下:
- 192.168.0.0~192.168.255.255,保留了256个C类网络留作私有地址使用。
(4) D类地址
D类地址 D类地址被称作多播地址或组播地址(Multicast Address),不分网络地址和主机地址,用于组播(也称为多播)的地址,无子网掩码。在以太网中,D类地址命名了一组应该在这个网络中应用接收到一个分组的站点。D类地址最高位必须是 1110
,范围从224.0.0.0到239.255.255.255。
在D类地址中,“224.×.×.× ~ 239.×.×.×” 属于多播/组播地址,计算机不能使用,设置该IP时,windows有提示,linux不会提示;
(5) E类地址
E类地址 不分网络地址和主机地址,以 1111 开始,为保留地址,其中240.0.0.0-255.255.255.254作为保留地址,主要用于Internet试验和开发,255.255.255.255作为广播地址。。
2.3 保留的特殊IP地址
以下这些特殊IP地址都是不能分配给主机用的地址:
-
主机ID全为0的地址(如:192.168.0.0):特指某个网段,比如:192.168.0.0(子网掩码:255.255.0.0),指192.168.×.×网段。
-
主机ID全为1的地址(如:192.168.255.255):特指该网段的全部主机,比如:192.168.255.255(子网掩码:255.255.0.0),如果你的计算机发送数据包使用主机ID全是1的IP地址,数据链层就会使用广播地址FF-FF-FF-FF-FF-FF(ARP协议会用到)。
-
255.255.255.255:是一个特殊的广播地址,标识广播域内的所有主机,不是指互联网上所有主机,因为255.255.255.255传播范围非常有限,到了广播域的边界(网关)会自动终结。
-
127.×.×.×:是本地环回地址,指本机地址,一般用来测试使用。回送地址(127.×.×.×)是本机回送地址(Loopback Address),即主机IP堆栈内部的IP地址。
-
0.0.0.0:用于指定默认路由;如果计算机的IP地址和网络中的其它计算机地址冲突,使用ipconfig命令看到的就是0.0.0.0,子网掩码也是0.0.0.0。
Tips: 0.0.0.0 IP地址表示啥?为什么很多服务器程序绑定 0.0.0.0?
0.0.0.0 IP地址在互联网协议(IP)中是一个特殊的地址。它通常用于表示“本网络中的这个主机”,即本地主机。在不同的上下文中,0.0.0.0有不同的含义:
服务器绑定:当服务器程序绑定到0.0.0.0地址时,它实际上是在告诉操作系统监听所有可用的网络接口上的入站连接。这意味着无论数据从哪个网络接口进入(比如以太网接口、Wi-Fi接口等),服务器都能接受这些连接。这样做可以让服务器接受来自任何网络接口的连接,从而确保不会因为绑定到特定的接口而错过任何连接请求。
路由:在路由环境中,0.0.0.0可能表示一个默认路由或者是一个无效的目的地址。默认路由指的是当路由表中没有匹配特定目的地址的路由条目时,数据包应该被发送到的路由器。
客户端配置:在某些客户端配置中,0.0.0.0可能用作一个占位符,表示没有有效的IP地址配置,或者表示客户端应该使用自动IP地址分配(比如DHCP)来获取IP地址。
安全:在安全设置中,0.0.0.0有时被用来表示不应该监听任何网络接口,或者不应该允许任何来自外部的连接。
当服务器程序绑定到0.0.0.0时,它能够更加灵活地服务于多个网络接口,这对于希望接受来自任何网络源的连接的服务器来说是非常有用的。同时,它也简化了服务器配置,因为不需要为每个网络接口单独配置监听端口。
- 169.254.0.0:169.254.0.0-169.254.255.255 实际上是自动私有IP地址,DHCP自动获取失败会获得该网段地址。
2.4 公网和私网IP地址
公网IP地址:
公有地址分配和管理由Inter NIC(Internet Network Information Center 因特网信息中心)负责。各级ISP使用的公网地址都需要向Inter NIC提出申请,有Inter NIC统一发放,这样就能确保地址块不冲突。
私网IP地址:
创建IP寻址方案的人也创建了私网IP地址。在IP地址3种主要类型里,各保留了1个区域作为私有地址,给局域网用,这些地址可以被用于私有网络,在Internet中没有这些IP地址,Internet上的路由器也没有到私有网络的路由表。
- A类:10.0.0.0 255.0.0.0,保留了1个A类网络。
- B类:172.16.0.0 255.255.0.0~172.31.0.0 255.255.0.0,保留了16个B类网络。
- C类:192.168.0.0 255.255.255.0~192.168.255.0 255.255.255.0,保留了256个C类网络。
Tips:私网地址访问Internet需要做NAT或PAT网络地址转换。
三、IPv4子网掩码
3.1 划分子网
随着网络的发展,IP 地址的分配开始出现规模问题,分配一个新网络号变得越来越难,A 类和 B 类地址往往会浪费大量主机容量,C 类地址又经常无法提供足够的主机号,为了提高网络号的利用率于是便有了子网的划分。
对于A、B、C类地址,将主机号从高位拿出几位作为子网号,可进一步实现更小的网络划分,从而实现更加合理的网络IP分配。 划分子网的方法 是从 A、B、C 三类IP地址的主机位借用若干位作为子网号 (subnet_id),当然主机号也就相应减少了同样的位数。于是两级IP地址(网络号、主机号)在本单位内部就变为三级IP地址:网络号、子网号和主机号。
经过子网划分后的IP地址组成位:网络号+子网号+主机号。
这样,凡是从其它网络发送给某网络下的某台主机的IP数据报,仍然是根据IP数据报目的IP地址的网络号找到连接在本网络上的路由器,此路由器在收到IP数据报后,再按目的网络号和子网号找到目的子网,把IP数据报交付目的主机。
用例子说明划分子网的概念,下图表示某单位拥有一个B类IP地址,网络地址是145.13.0.0(网络号是145.13)。凡是目的地址为 145.13.x.x 的数据报都被送到这个网络上的路由器R1。
现把上图的网络划分为三个子网。这里假定子网号占用8位,因此在增加了子网号后,主机号就只有8位。所划分的三个子网分别是:145.13.3.0,145.13.7.0 和 145.13.21.0,在划分子网后,整个网络对外部仍表现为一个网络,其网络地址仍为145.13.0.0。网络145.13.0.0上的路由器R1在收到外来的数据报后,再根据数据报的目的地址把它转发到相应的子网:
总之,当没有划分子网时,IP地址是两级结构。划分子网后P地址变成了三级结构。划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号。
3.2 子网掩码
接着上一小节示例,假定有一个IP数据报(其目的地址是145.13.3.10)已经到达了145.13.0.0 这个网络的路由器R1。那么这个路由器如何把它转发到子网145.13.3.0呢?
我们知道,从IP数据报的首部无法看出源主机或目的主机所连接的网络是否进行了子网的划分。这是因为32位的IP地址本身以及数据报的首部都没有包含任何有关子网划分的信息。因此必须另外想办法,这就是使用 子网掩码( subnet mask)。
子网掩码 是用于把 IP 地址的主机部分划分成多个更小的子网,子网间相互独立,并且由于网络号不受影响所以子网的划分对外部是完全透明的。
图(a)是IP地址为145.13.3.10的主机本来的两级IP地址结构。
图(b)是这个两级IP地址的子网掩码。
图(c)是同一地址的三级IP地址结构,也就是说,现在从原来16位的主机号中拿出8位作为子网号,而主机号由16位减少到8位。
请注意,现在子网号为3的网络的网络地址是145.13.3.0(既不是原来两级IP地址的网络地址145.13.0.0,也不是简单的子网号3)。为了使路由器R1能够很方便地从数据报中的目的IP地址中提取出所要找的子网的网络地址,路由器R1就要使用三级IP地址的子网掩码。
图(d)是三级IP地址的子网掩码,它也是32位,由一串24个1和跟随的一串8个0组成。子网掩码中的1对应于IP地址中原来二级地址中的16位网络号加上新增加的8位子网号,而子网掩码中的0对应于现在的8位主机号。
图(e)表示R1把三级IP地址的子网掩码和收到的数据报的目的IP地址145.13.3.10逐位相“与”(AND),得出了所要找的子网的网络地址145.13.3.0。
使用子网掩码的好处就是:不管网络有没有划分子网,只要把子网掩码和IP地址进行逐位的“与”运算(AND),就立即得出网络地址来。
归纳一下上述的要点,从网络145.13.0.0外面看,这就是一个普通的B类网络,其子网掩码为16个连续1后面跟上16个连续0。但进入到这个网络后(即到了路由器R1),就看到了还有许多网络(即划分了子网后的许多网络),其网络地址是145.13.x.0(这里x可以表示不同的数值),而这些网络的子网掩码都是24个连续1后面跟上8个连续0。总之,在这个B类网络的外面和里面,看到的网络是不一样的。
子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
Tips: 在不划分子网时,既然没有子网,为什么还要使用子网掩码? 这就是为了更便于查找路由表。现在互联网的标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中1的位置和IP地址中的网络号字段 net_id 正好相对应。因此,若用默认子网掩码和某个不划分子网的IP地址逐位相“与”(AND),就应当能够得出该IP地址的网络地址来。这样做可以不用查找该地址的类别位就能知道这是哪一类的IP地址。
IP地址类型 | 默认子网掩码(十进制) | 默认子网掩码(十六进制) | 网络地址(二进制表示) |
---|---|---|---|
A类 | 255.0.0.0 | 0xFF000000 | 11111111.00000000.00000000.00000000 |
B类 | 255.255.0.0 | 0xFFFF0000 | 11111111.11111111.00000000.00000000 |
C类 | 255.255.255.0 | 0xFFFFFF00 | 11111111.11111111.11111111.00000000 |
子网掩码的表示方法:
- 点分十进制表示法: 二进制转换十进制,每8位用点号隔开。例如:子网掩码二进制11111111.11111111.11111111.00000000,表示为255.255.255.0
- CIDR斜线记法: 格式:IP地址/n,n表示十进制。
- (1) 192.168.1.100/24,其子网掩码表示为255.255.255.0,二进制表示为11111111.11111111.11111111.00000000
- (2) 172.16.198.12/20,其子网掩码表示为255.255.240.0,二进制表示为11111111.11111111.11110000.00000000
- 不难发现,例1中共有24个1,例2中共有20个1,所以n是这么来的。运营商ISP常用这样的方法给客户分配IP地址。
注:n为1到32的数字,表示子网掩码中网络号的长度,通过n的个数确定子网的主机数=2^(32-n)-2(-2的原因:主机位全为0时表示本网络的网络地址,主机位全为1时表示本网络的广播地址,这是两个特殊地址)。
3.3 子网划分的方法
以一个B类地址为例,说明可以有多少种子网划分的方法。在采用固定长度子网时,所划分的所有子网的子网掩码都是相同的。
以第一个子网划分的方法来解释:
- 该类子网号的位数为2(第15、16位),即该子网掩码的二进制可以表示为 :
11111111 11111111 11000000 00000000
,前面的16为全为1,代表B类IP地址的网络位,而第17,18位代表子网位(从主机位借用),剩余的14位代表主机位。 - 子网数: 2^2-2=4-2=2,减2的原因是减去全为1或全为0,即11 或 00 两种情况。
- 每个子网的主机数: 2^14-2=16384-2=16382。
Tips: 表中的“子网号的位数”中没有0,1,15和16这四种情况,因为这没有意义。
将一个网络划分子网后,把原本的主机号位置的一部分给了子网号,余下的才是给了子网的主机号。其形式如下:
做子网划分后的IP地址:网络号+子网号+子网主机号
如:192.168.1.100/25,其子网掩码表示:255.255.255.128,意思就是将 192.168.1.0 这个网段的主机位的最高1位划分为了子网。
划分子网主要从以下方面考虑:
- 网络中物理段的数量(即要划分的子网数量)
- 每个物理段的主机的数量
确定子网掩码的步骤:
-
第一步:确定物理网段的数量,并将其转换为二进制数,并确定位数 n 。列如,需要 6 个子网,6的二进制值为 110,共 3 位 , 即 n=3 ;
-
第二步:按照你 IP 地址的类型写出其缺省子网掩码。如 C 类,则缺省子网掩码为 11111111.11111111.11111111.00000000 ;
-
第三步:将子网掩码中与主机号的前 n 位对应的位置置 1 ,其余位置置 0 。若 n=3 且为:
-
C 类地址:则得到子网掩码为 11111111.11111111.11111111.11100000 化为十进制得到 255.255.255.224
-
B 类地址:则得到子网掩码为 11111111.11111111.11100000.00000000 化为十进制得到 255.255.224.0
-
A 类地址:则得到子网掩码为 11111111.11100000.00000000.00000000 化为十进制得到 255.224.0.0
-
另:由于网络被划分为 6 个子网,占用了主机号的前 3 位,若是 C 类地址,则主机号只能用 5 位来表示主机号,因此每个子网内的主机数量=( $2^{5}$ )- 2 = 30 , 6 个子网总共所能标识的主机数将小于 254 ,这点请大家注意!
-
四、IPv6地址及协议
4.1 IPv6地址简介
IPv6是Internet Protocol version 6(互联网通信协议第六版)的缩写,是互联网工程任务组(Internet Engineering Task Force, IETF)设计的用于替代IPv4的下一代IP协议。由于IPv4最大的问题在于网络地址资源不足,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,也解决了多种设备连入互联网的障碍。
IPv6地址由128位构成,是IPv4地址长度的4倍,采用冒号 :
十六进制表示法, 其所包含的 IP个数为 $2^{128}$。IPv6地址的分配通常以地址前缀为单位进行,其中前缀表示IPv6地址的网络部分。主机将接口标识符与网络前缀组合,形成完整的IPv6地址。例如,在前缀 2001:0db8:85a3::/64 和 接口标识符0123:4567:89ab:cdef 的情况下,生成的IPv6地址为 2001:0db8:85a3:0123:4567:89ab:cdef:0000。
IPv6有3种表示方法:
- 冒分十六进制表示法: 格式为 X:X:X:X:X:X:X:X,其中每个X表示地址中的16位字段,由4个十六进制数构成,例如:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,这种表示法中,每个 X 的前导0是可以省略的,例如:2001:0DB8:0000:0023:0008:0800:200C:417A → 2001:DB8:0:23:8:800:200C:417A。
- 0位压缩表示法: 在某些情况下,一个IPv6地址中间可能包含很长的一段0,可以把连续的一段0压缩为
::
。但为保证地址解析的唯一性,地址中::
只能出现一次,例如:FF01:0:0:0:0:0:0:1101 → FF01::1101
,0:0:0:0:0:0:0:1 → ::1
,0:0:0:0:0:0:0:0 → ::
等。 - 内嵌IPv4地址表示法: 为了实现IPv4 以 IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96位采用冒分十六进制表示,而最后32位地址则使用IPv4的点分十进制表示,例如:
::192.168.0.1
与::FFFF:192.168.0.1
就是两个典型的例子,注意在前96位中,压缩0位的方法依旧适用。
IPv6 也定义了一些保留地址和特殊用途地址,用于特定的目的,如环回地址(::1)、链路本地地址(fe80::/10)、多播地址范围(ff00::/8)等。这些地址有特殊的用途,不用于常规的主机和网络分配。
4.2 IPv6 协议数据报
IPv6报文由IPv6基本报头、IPv6扩展报头以及上层协议数据单元三部分组成。上层协议数据单元一般由上层协议报头和它的有效载荷构成,有效载荷可以是一个ICMPv6报文、一个TCP报文或一个UDP报文。IPv6 相比 IPv4 已经发生了巨大变化。IPv6 中为了减轻路由器的负担,省略了首部校验和字段。提高了包转发的效率。IPv6数据报结构如下图所示:
- 版本号(Version):长度为4位。指定IP协议的版本(IPv4/IPv6),对于IPv6来说,该值为6。
- 流量类型(Traffic Class):长度为8位。等同于IPv4中的TOS字段,表示IPv6数据报的类或优先级,主要应用于QoS。
- 流标签(Flow Label):长度为20位。IPv6中的新增字段,用于区分实时流量,不同的流标签+源地址可以唯一确定一条数据流,中间网络设备可以根据这些信息更加高效率的区分数据流。
- 有效载荷长度(Payload Length):长度为16位。有效载荷是指紧跟IPv6报头的数据报的其它部分(即扩展报头和上层协议数据单元)。该字段只能表示最大长度为65535字节的有效载荷。如果有效载荷的长度超过这个值,该字段会置0,而有效载荷的长度用逐跳选项扩展报头中的超大有效载荷选项来表示。
- 下一个报头(Next Header):长度为8位。该字段定义紧跟在IPv6报头后面的第一个扩展报头(如果存在)的类型,或者上层协议数据单元中的协议类型,相当于 IPv4 的协议字段,通常表示 IP 的上一层协议是 TCP 或 UDP。
- 跳数限制(Hop Limit):长度为8位。该字段类似于IPv4中的Time to Live字段,它定义了IP数据报所能经过的最大跳数。每经过一个设备,该数值减去1,当该字段的值为0时,数据报将被丢弃。
- 源地址(Source Address):长度为128位。表示发送端的地址。
- 目的地址(Destination Address):长度为128位。表示接收端的地址。
- 扩展首部(Extensions):IPv6的首部长度是固定的,共40字节。IPv4中的可选项就没地方放了,而 IPv6 增加了扩展首部的概念,通过扩展首部来实现IPv4中的可选项。在IPv4中可选项长度固定为40字节,但是在IPv6中没有这样的限制。也就是说,IPv6的扩展首部可以是任意长度。扩展首部当中还可以包含扩展首部协议以及下一个扩展首部字段。
- 数据(Payload):用来存入实际要传输的数据,同时将 IP 上层协议的首部也作为数据进行处理,例如UDP头、TCP头。
IPv6和IPv4相比,去除了IHL、Identifiers、Flags、Fragment Offset、Header Checksum、 Options、Padding域,只增了流标签域,因此IPv6报文头的处理较IPv4大大简化,提高了处理效率。另外,IPv6为了更好支持各种选项处理,提出了扩展头的概念,新增选项时不必修改现有结构就能做到,理论上可以无限扩展,体现了优异的灵活性。
五、IP报文数据转发和路由
IP协议有一个特别重要的特质就是路由选择,决定一个IP数据报从哪条路走,最终能不能成功的到达目的端。
IP协议通过以下步骤实现数据在网络中的转发和路由:
- 数据包封装:当源主机要发送数据时,IP协议将数据分割为适当大小的数据包(即IP分组或数据报)。
- 目的地址解析:源主机根据目标主机的IP地址确定数据包的目的地。如果目标主机在同一子网内,源主机可以直接将数据包发送到目标主机。否则,它将数据包发送到默认网关(通常是本地路由器)。
- 路由选择:路由器(包括可转发数据的主机)中维护着一张路由表,主要存放网络、主机与下一跳的对应关系。默认网关(路由器)接收到数据包后,它会检查数据包的目的IP地址,并查找自己的路由表。路由器根据路由表中的条目选择下一跳路径。选择下一跳路径的依据可能包括最长前缀匹配、最短路径、策略路由等。
- 数据包转发:路由器根据路由表中的下一跳信息,将数据包转发到适当的出口接口。该接口连接到下一个路由器或目标子网。
- 路由器间的转发:数据包经过一系列的路由器转发,每个路由器根据自己的路由表将数据包转发到下一个路由器,直到到达目标主机所在的网络。
- 到达目的主机:当数据包到达目的网络后,目标主机的默认网关或目标主机本身将根据目的IP地址将数据包交付给目标主机上的相应协议栈(如TCP或UDP)进行处理。
通过上述步骤,IP协议实现了数据在网络中的转发和路由。每个路由器根据自己的路由表和路由选择算法,将数据包转发到最终的目标主机。这样,数据包能够通过多个网络节点的转发,跨越不同的子网和网络,最终到达目的地。