网络层——网际协议 IPv4

禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!

IPv4 数据报

网络层分组被称之为数据报,现在就先来看看 IPv4 的数据报格式。

字段 说明
版本(Version) 占 4 bit,通信双方使用的版本必须一致,对于 IPv4 字段的值是 4
首部长度(Internet Header Length, IHL) 占 4 bit,首部长度说明首部有多少 32 位字。由于 IPv4 首部可能包含数目不定的选项,这个字段也用来确定数据的偏移量。需要注意的是,这个字段是以 4 字节为单位,相应的值 × 4 才能表示首都长度
服务类型(Differentiated Services,DS) 占 6 bit,使不同类型的 IP 数据报能相互区分开,例如标记这个数据报着不着急被转发。只有在使用区分服务时,这个字段才起作用,在一般的情况下都不使用这个字段
显式拥塞通告(Explicit Congestion Notification,ECN) 允许在不丢弃报文的同时通知对方网络拥塞的发生
数据报长度(Total Length) 占 16 位字段,定义了报文总长,包含首部和数据,单位为字节。这个字段的最小值是 20(0 字节数据),最大值是 65535
标识、标志、片位移 和 IP 分片有关
存活时间(Time To Live,TTL) 占 8 位,避免报文在互联网中永远存在
上层协议(Protocol) 占 8 位,指示了 IP 数据报的数据部分应该交付给哪个指定的运输层协议,类似传输层报文段中端口号字段起到的作用
首部检验和 (Header Checksum) 占 16 位,检验和字段只对首部查错,用于帮助路由器检测收到的 IP 数据报中的比特错误
源地址、目的地址(Address) 报文的发送端、报文的接收端
选项(IP Option) 附加的首部字段可能跟在目的地址之后,携带安全、源选路径、时间戳和路由记录等内容。这个字段在 IPv6 已经没了
数据(有效载荷) 上层传递下来,需要被传输的数据

其中存活时间的具体实现为跳数计数器,报文经过的每个路由器都将此字段减 1,当此字段等于 0 时,报文不再向下一跳传送并被丢弃,最大值是 255。

上层协议字段中,常见协议值有:

协议字段值 协议名 缩写
1 互联网消息控制协议 ICMP
2 互联网组管理协议 IGMP
6 传输控制协议 TCP
17 用户数据报协议 UDP
41 IPv6 封装 ENCAP
89 开放式最短路径优先 OSPF
132 流控制传输协议 SCTP

对于首部检验和,在每一跳路由器都要重新计算出的首部检验和并与此字段进行比对,如果不一致,此报文将会被丢弃。注意每一条都必须算一次校验和并更新,因为 TTL 等其他可变字段的数据会变化。校验和的运算方式是采用反码算术运算求和,和的反码作为该字段的值,可以参考下面的例子。

数据报分片

考虑 MTU

对于链路层协议,不同的链路层协议能承载的网络层分组长度并不同,一个链路层协议能承载的最大数据量称之为最大传输单元 (MTU)。若传输时经过很多路由器,而之间的每条链路的 MTU 不同怎么办?解决方法就是将 IP 数据报中的数据分片为多个 IP 数据报,然后用单独的链路层帧封装数据报并发送。大 IP 数据分组向较小 MTU 链路转发时,在允许的情况下可以进行分片。
分片时每个分片的标识复制原 IP 分组标识,通常除了最后一个分组,其他分片均分为 MTU 允许的最大分片。一个最大分片可封装的数据,应该为 8 的倍数。既然有分片,那就需要重组为完整的数据报,IP 分片的重组工作由目的端系统负责。

相关字段

标识符(Identification)

占 16 位,这个字段主要被用来唯一地标识一个报文的所有分片,因为分片不一定按序到达,所以在重组时需要知道分片所属的报文。

标志符(Flags)

占 3 位,这个字段有 DF 和 MF 2 个标志。DF 标志为 1 时禁止分片,为 0 时允许分片。MF 标志为 1 时表示当前分片并非最后一片,为 0 时表示当前分片为最后一片。

分片偏移(Fragment Offset)

占 13 位,该字段指明了每个分片相对于原始报文开头的偏移量,以 8 字节作单位。

分片实例

现有一个数据报的总长度为 3820 字节,链路的 MTU 为 1400。由于首部占有 20 字节,因此该数据报将被分为 3 个数据报片,其数据部分的长度分别为 1400、1400 和 1000 字节。值的一提的是,分片后的每一个小数据报也需要 20 字节的首部。

对于这 3 个数据报,它们的各个参数为:

数据报 总长度 标识 MF DF 片位移
数据报 3820 相同 0 0 0
数据分片 1 1420 相同 1 0 0
数据分片 2 1420 相同 1 0 175
数据分片 3 1020 相同 0 0 350

IPv4 编址

IP 地址的表示

主机与物理链路、路由器与其任意一条链路之间的边界,都被称之为接口。由于每个主机和路由器都可以发送和接受 IP 数据报,因此所有接口都得拥有自己的 IP 地址。问题是如果 IP 地址乱分配,会使得转发表变得异常复杂,应该怎么样为接口分配 IP 地址?
IP 地址由 2 个字段组成,分别是网络前缀和主机号。网络前缀用于指明主机或路由器所连接到的网络,网络前缀在互联网中必须是唯一的。主机号用于标志主机或路由器,主机号在其所在的网络中是唯一的。就像电话号码划分区号一样,只有通过网络号和主机号的标识,路由器才能知道如何转发,而一个 IP 地址在互联网中是唯一的。

IP 地址 ::=

CIDR 策略

现在在全球因特网中,地址分配策略采用的是无类别域间路由选择 (CIDR)策略。CIDR 消除了传统 A、B、C 类地址和子网划分的概念,将子网寻址的概念一般化了。网络前缀可以是任意长度,融合子网地址和子网掩码可以更为方便地进行子网划分。当子网寻址时,32 bit 的 IP 地址的形式是 a.b.c.d/x,其中 x 指示了地址第一部分的比特数,构成了网络前缀。
CIDR 策略使得路由器转发分组时,可以往网络前缀相同的 IP 地址的区域发送,也就是缩小了发送链路的选择范围。因此采用 CIDR 策略提高了 IPv4 地址空间的分配效率,同时也提高了路有效率。

特殊的 IP 地址

网络号 主机号 作为 IP 分组源地址 作为 IP 分组目的地址 用途
全 0 全 0 × 本网络内表示本主机,路由表内表示默认路由
全 0 host-id × 本网络范围内表示某个特定主机
全 1 全 1 × 本网络范围内表示广播地址
net-id 全 0 × × 网络地址,表示一个网络
net-id 全 1 × 直接广播地址,对特定网络的主机进行广播
127 非全 0/1 用于本地软件的环回测试

私有地址

私有 IP 地址是一段保留的 IP 地址,只使用在局域网中,无法在 Internet 上使用。一共需要记住 3 组:

地址类型 保留的地址空间
A 类 10.0.0.0 ~ 10.255.255.255
B 类 172.16.0.0 ~ 172.31.255.255
C 类 192.168.0.0 ~ 192.168.255.255

划分子网

子网

所谓子网就是不跨越路由器(第三次及以上的网络设备),可以彼此物理连通的接口。如图 3 个主机接口和 1 个路由器接口的网络,就形成了一个子网。

接下来考虑“系统内的子网”例如一个公司中的某个部门拥有一个 C 类地址,但是连接的主机仅有个位数,而另一个部门希望拥有自己的局域网,就不能使用剩余的 IP 地址,这就造成了 IP 地址空间的利用率很低。IP 地址空间的利用率低也会导致所需的 IP 地址增加,导致了路由器转发表需要更多的空间来存储。
因此将物理网络再分为若干子网是局域网的内部行为,对外表现出来的还是一个网络。对于这种子网,分开主机和路由器的每个接口,这就产生了几个隔离的网络,每一个隔离的网络都是一个子网。

子网掩码

从 IP 数据报首部无法看出源主机或目的主机的网络是否划分了子网,如何确定?这是就采用了子网掩码,其特性为子网掩码和主机 IP 地址做“与 (AND)”运算后,得到的结果的主机号部分全部为 0。已知 IP 地址是 141.14.72.24,子网掩码是 255.255.192.0,就可以通过这个性质得到其网络前缀。

子网划分的手法是什么?若分为 2n个子网,则子网掩码往后移动 n 位**。

实例分析

例一

某公司使用一个 C 类网段地址 192.168.1.0/24,该公司有五个部门,人数分别为 29、28、25、15、14人,公司领导要求通过子网划分的方式将这些部门分别划分到不同的网段中,以达到各个部门间网络隔离的目的,如果你是一个网络工程师,你该如何规划?

要分成 5 个子网,那就只能分成 8 个子网来满足需求,同时 C 类地址分为 8 个子网后,每个子网中有 32 个 IP 地址,这可以满足所有子网的需求。因此在这个情景下,只需要将 C 类地址向后借 3 位即可满足需求。

192.168.1.0
192.168.1.32
192.168.1.64
192.168.1.96
192.168.1.128
192.168.1.160
192.168.1.192
192.168.1.224
子网掩码:255.255.255.224

例二

某公司使用一个C类网段地址 201.39.18.0/24,该公司有四个部门,人数分别为 80、50、25、10 人,公司领导要求通过子网划分的方式将这四个部门分别划分到不同的网段中,以达到各个部门间网络隔离的目的,如果你是一个网络工程师,你该如何规划?

注意到当直接分成 4 个子网时,每个子网的 IP 地址数为 64 个,这是不能满足要求的,容纳第一个部门,至少需要一个 128 个 IP 地址的子网。此时我们就考虑可变长子网,首先将 C 类地址向后借一位,分成 2 个 128 个 IP 地址的子网。接着将其中一个子网再向后退一位,再次分割成 2 个子网,其中的一个 64 个 IP 地址的子网用来满足部门二的需求。接着再将其中一个子网再次往后退一位,分成 2 个 32 个 IP 地址的子网,这 2 个子网可以满足剩下两个部门的需求。

201.39.18.0/25
201.39.18.128/26
201.39.18.192/27
201.39.18.224/28

路由聚合

组合大子网

使用单个网络前缀通告多个网络的能力称之为路由聚合,这也可以理解为将多个子网合成一个较大的子网。这是很重要的,因为 ISP 往往需要把它所有的多个组织连接到因特网,而这些组织也都有子网。

路由聚合的过程可以看做子网划分的逆过程,即子网划分的手法是子网掩码往后移动,路由聚合则是向前移动。

基于最长前缀

思考一个问题,若组织的 IP 不连续怎么办?此时将使用最长前缀匹配,也就是路由表寻找最长匹配项,并向其相关联的链路接口转发分组。

从这个也可以看出,子网掩码向前移动时,只有相邻的子网可以聚合,如果不相邻那就只好聚合成更大的子网。

路由聚合的实例

下面看一个路由聚合的实例,如图 ISP 共有 64 个 C 类网络。如果不采用 CIDR 技术,则在与该 ISP 的路由器交换路由信息的每一个路由器的路由表中需要有 64 个项目。但采用地址聚合后,只需用路由聚合后的 1 个项目 206.0.64.0/18 就能找到该 ISP。

IP 分组转发

转发原理

IP 分组的转发指的是从一个路由器转发到下一个路由器,每一跳路由器都要给出目标的网络前缀和下一跳地址,即沿途的路由器必须知道目标网络的下一路要给哪个接口。同时根据这一点我们也可以得到网络畅通的条件,也就是满足数据报能去能回

默认路由

默认路由是对IP数据包中的目的地址找不到存在的其他路由时,路由器所选择的路由。目的地不在路由器的路由表里的所有数据包都会使用默认路由,这条路由一般会连去另一个路由器。对于 Windows 系统而言,网关就是默认路由。

结合子网掩码

由于子网的存在性问题不能不能忽视,因此需要集合子网掩码进行转发。先用各网络的子网掩码和目的 IP 地址逐位做“与”预算,看是否和相应的网络地址匹配。若匹配,则将分组直接交付,否则就送往下一跳路由器。

参考资料

《计算机网络(第七版)》 谢希仁 著,电子工业出版社
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社

posted @ 2020-06-01 09:36  乌漆WhiteMoon  阅读(1703)  评论(0编辑  收藏  举报