目录
一、因特网中的网络层协议
二、IP 数据报格式(IPv4)
三、IP 数据报分片和重组
1. 分片的概述
最大传输单元 MTU:是指链路层数据帧的数据区的最大字节数。
每个数据链路都有自己的 MTU,链路类型不同,MTU 的值也不同
由于有 MTU 这一限制,因此在因特网中,一个大的分组可能在路由器中被分割为几个分片,在最终的目的主机中将这些分片重新组装成一个大的分组:
- 在路由器中被分割为几个分片
- 在目的主机中将这些分片重组
此外,为了进一步识别出这些分组,还需要对分片进行标识。
2. 分片的例子
“ IP 分片分的是数据 ”,否则,没有首部的分片不知道发往何处
示例一
假设数据报长为 4000 bytes,最大传输单元 MTU 为 1500 bytes,我们假设 IP 首部没有选项字段,那么 IP 首部长度为 20:
- 分组的数据长度为:4000-20=3980
- 分片的数据长度 ≤ 1500-20=1480
分片的数据长度还需要计算
更进一步,由于偏移量是八字节的整数倍,因此分片数据长度必须为八的整数倍,除了最后一个分片可以不为整数倍,从而有:
- 1480/8=185
- 整个分片的长度为:20+8*185=1500
接着考虑每个分片中的偏移量:
- 3980/1480=2……1020
- 第一个分片偏移量:(1-1)*185=0
- 第二个分片偏移量:(2-1)*185=185
- 第三个分片偏移量:(3-1)*185=370
分片的 16 位标识符要与原分组的一致,从而 ID 均为 x 。
flagflag 用于标识是否为最后一个分片,若是则为 0,否则为 1 。
注:fragflag 字段包含 3 位二进制 Bit0、Bit1、Bit2,fragflag 指示的是 Bit2 的设置。
- Bit0:reserved, must be zero
- Bit1:0 = May Fragment, 1 = Don't Fragment.
- Bit2:0 = Last Fragment, 1 = More Fragments.
Bit1 用于指示能否进行分片,若某路由器接收到一个需要分片但又不被允许分片的分组,则选择丢弃该分组,并告诉发送方分组过大。
Q:如何区分是分片还是分组?
A:若 flagflag=1 且 offset=0,则是分组;否则是分片。
offset 是以 8 字节为单位来计算的,除最后一个分片之外,前面的分片的数据大小必须是 8 字节的整数倍(否则后一个分片的偏移量算出来是小数)
example:
- 4000 byte datagram
- MTU = 1000 bytes
数据大小:
- 分组:4000-20=3980
- MTU:≤1000-20=980
980/8=122.5,因此最多装入 122*8=976 的数据。
四、IP 地址
1. IP 地址概述
IP 地址:分配给主机或路由器 接口 的标识符。
接口:主机或路由器与物理链路之间的边界。
- 路由器有多个接口
- 主机可以有多个接口
- 每个接口至少有一个 IP 地址
IP 地址有两种:IPV4 和 IPV6
- IPV4:32 个二进制位长(4字节)常用点分十进制表示
- IPV6:128 个二进制位长(16字节)常用冒号分隔表示
2. IPv4 编址
32 比特的二进制表示和点分十进制表示法
将 4 个字节中的每一个字节分别用十进制数来表示,4 个十进制数之间用 “.” 分隔。
根据不同的取值范围,早期将 IP 地址分为五类。
IP 地址中前 5 位用于标识 IP 地址的类别,
- A 类地址的第一位为 “0”
- B 类地址的前两位为 “10”
- C 类地址的前三位为 “110”
- D 类地址的前四位为 “1110”
- E 类地址的前五位为 “11110”
其中,A 类、B 类与 C 类地址为基本的 IP 地址。
3. IP 地址结构
包括两部分:
- 网络号:指明主机所在网络的编号。
- 主机号:主机在网络中的编号。
4. 传统的 IP 地址分类
网络号和主机号均不能全为 0 或 1 。
5. ABC 类地址
A 类地址
利用 IP 地址的第一个字节作为网络地址,最高位为 0,其余的三个字节作为主机地址。
- 地址范围为 1. 0. 0. 1-127. 255. 255. 254
注:全 0 表示本地地址,全 1 表示在本地网络中向所有主机广播。
0. 0. 0. 0 只能作源地址,不能作目的地址。此外,凡是 127 开头的都表示 localhost 。
一个网络:是指具有相同网络号的所有 IP 地址的集合。
路由器连接不同的网络:
- 具有相同网络号的 IP 之间通讯一定不通过 Router
- 具有不同网络号的 IP 之间通讯一定要通过 Router
B 类地址
利用 IP 地址的前两个字节作为网络地址,最高位为 10,其余的两个字节作为主机地址。
- 地址范围为 128. 0. 0. 1-191. 255. 255. 254
C 类地址
利用 IP 地址的前三个字节作为网络地址,最高位为 110,最后一个字节作为主机地址。
- 地址范围为 192. 0. 0. 1-223. 255. 255. 254
6. 特殊 IP 地址段
本地回环地址:127. 0. 0. 1 - 127. 255. 255. 254
这是预留的一组 IP 地址,主要是用来识别主机本身的地址。也叫做 “localhost”,一般用来测试。
私有地址:10. x. x. x,172. 16. x. x - 172. 31. x. x,192. 168. x. x
这三个地址段被称为私有 IP 地址段,也就是局域网所使用的地址段,在公网上不能被路由。
私有地址在全球不唯一,公有地址在全球唯一。
7. 特殊 IP 地址
0. 0. 0. 0
这个地址严格上来说都不是真正意义上的 IP 地址。主要是用来标识不清楚的网络和主机的。系统遇到无法识别的网络或主机的时候会统一的归纳到这个地址。
255. 255. 255. 255
这个地址是受限的广播地址。主要指一个网段内的所有主机。
233. 255. 255. 255 向 233 网段广播
8. 互联网中的 IP 地址
- 同一局域网上的主机或路由器的 IP 地址中的网络号必须相同
- 交换机互连的网络仍然是一个局域网,只能有一个网络号。
- 路由器总是具有两个或两个以上 IP 地址。
- 当两个路由器直接相连时,在连线两端的接口处,可以指明 IP 地址也可以不指明 IP 地址。
路由器之间的网段需要与其它局域网区分开来,因此需要设置不同的网络号。对于上述 C 类地址(一共可以表示 254 个主机名),路由器之间只会占用两个。又因为路由器之间的网段使用的是公用地址,全球其它网段不能复用,从而导致极大的浪费。因此,当两个路由器直接相连时,在连线两端的接口处,可以指明 IP 地址也可以不指明 IP 地址。
五、子网
1. 子网的划分
IP 地址:
- 网络号(高位 bits)
- 主机号(低位 bits)
网络号相同的 IP 地址属于同一个网络,而网络还可以划分为若干子网(subnet)。
划分子网的方法是借用主机号高位部分的若干比特作为子网号,剩下的主机位作为主机号。
update:具有相同的网络号和子网号的所有 IP 地址的集合组成一个网络。
2. 子网的特点
什么是一个子网?从IP地址的观点来看:
- 设备接口的 IP 地址具有相同的网络部分
- 没有路由器的介入,物理上能够相互到达
3. 子网掩码
子网号字段长度是可变的,因此,为了确定子网地址,IP 协议提供了子网掩码的概念。子网掩码用来确定网络地址(包括网络号和子网号)和主机地址的长度。子网掩码长为 32 位比特,其中的 1 对应于 IP 地址中的网络号和子网号,而子网掩码中的 0 对应于主机号。
- 直接将子网掩码与 IP 地址相与,得到主机号
- 将子网掩码变反再与 IP 地址相与,得到网络地址
4. 子网的划分方法
例、现有一个 C 类网 202. 114. 1. 1-202. 114. 1. 254,
1)请写出怎样将这个 C 类网划分为 2 个、6 个、14 个子网;
注意:子网号也不能全为 1 或全为 0 。
假设 n 为子网号位数。由于子网号也不能全为 1 或全为 0,因此
2)假设这些 IP 用于某公司。现公司任一部门,最多有 30 台机器,问应该怎样划分子网?
假设 m 为主机号位数。由于主机号也不能全为 1 或全为 0,因此
5. 使用子网掩码的分组转发
不划分子网时,路由表只有两项:目的网络地址和下一跳地址,例如
目的网络地址 | 下一跳地址 |
---|---|
30.0.0.0 | 40.0.0.7 |
40.0.0.0 | 直接交付 |
128.1.0.0 | 直接交付 |
192.4.10.0 | 128.1.0.9 |
直接交付对应的是间接交付。目的网络地址代表分片或分组最终想要到达的 IP 地址,下一跳地址代表当前路由器想要让该分片或分组去到目的地而需要转发给的相邻的路由器的接口的 IP 地址。
使用子网划分后,路由表中将包括三项:目的网络地址、子网掩码和下一跳地址,例如:
R1 的路由表 | ||
目的网络地址 | 子网掩码 | 下一跳地址 |
128.30.33.0 | 255.255.255.128 | 接口 0 |
128.30.33.128 | 255.255.255.128 | 接口 1 |
128.30.36.0 | 255.255.255.0 | R2 |
接口是指本机的接口,R 是指要转发给的下一个路由器的接口。当一个分片或分组到达路由器时,按顺序和子网掩码相与,若结果与目的网络地址一致,则转发给对应的下一跳地址。