网络层【第二篇】
一、IP数据包的首部格式
一个 IP 数据报由首部和数据两部分组成
首部的前一部分是固定长度,共 20 字节,是所有 IP 数据报必须具有的
版本——占 4 位,指 IP 协议的版本。目前的 IP 协议版本号为 4 (即 IPv4)
首部长度——占 4 位,可表示的最大数值是 15 个单位(一个单位为 4 字节),因此 IP 的首部长度的最大值是 60 字节
总长度——占 16 位,指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU。
标志(flag) ——占 3 位,目前只有前两位有意义。标志字段的最低位是 MF (More Fragment)。MF 1 表示后面“还有分片”。MF 0 表示最后一个分片。标志字段中间的一位是 DF (Don't Fragment) 。只有当 DF 0 时才允许分片。
片偏移—— 占13 位,指出:较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
生存时间——占8 位,记为 TTL (Time To Live),指示数据报在网络中可通过的路由器数的最大值。
协议——占8 位,指出此数据报携带的数据使用何种协议,以便目的主机的 IP 层将数据部分上交给那个处理过程
首部检验和——占16 位,只检验数据报的首部,不检验数据部分。这里不采用 CRC 检验码而采用简单的计算方法。
源地址和目的地址都各占 4 字节
IP 数据报首部的可变部分,从 1 个字节到 40 个字节不等,取决于所选择的项目。有了可变部分可以增加 IP 数据报的功能,但是往往不常用
IP数据包是可支持多种协议的:IP 数据报可以封装多种协议 PDU。
1.1IP数据报分组转发流程
IP 数据报的首部中没有地方可以用来指明“下一跳路由器的 IP 地址”。
当路由器收到待转发的数据报,不是将下一跳路由器的 IP 地址填入 IP 数据报,而是送交下层的网络接口软件。
网络接口软件使用 ARP 负责将下一跳路由器的 IP 地址转换成硬件地址,并将此硬件地址放在链路层的 MAC 帧的首部,然后根据这个硬件地址找到下一跳路由器
在路由表中,对每一条路由,最主要的是(目的网络地址,下一跳地址)
IP 数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
只有到达最后一个路由器时,才试图向目的主机进行直接交付。
虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即为特定的目的主机指明一个路由。
采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时采用这种特定主机路由。
默认路由:
路由器分组转发算法:
(1) 从数据报的首部提取目的主机的 IP 地址 D, 得出目的网络地址为 N。
(2) 若网络 N 与此路由器直接相连,则把数据报直接交付目的主机 D;否则是间接交付,执行(3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
(4) 若路由表中有到达网络 N 的路由,则把数据报传送给路由表指明的下一跳路由器;否则,执行(5)。
(5) 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
(6) 报告转发分组出错。
二、IP数据报片
过程:
一数据报的总长度为 3820 字节,其数据部分的长度为 3800 字节(使用固定首部),需要分片为长度不超过 1420 字节的数据报片。
因固定首部长度为 20 字节,因此每个数据报片的数据部分长度不能超过 1400 字节。
于是分为 3 个数据报片,其数据部分的长度分别为 1400、1400 和 1000 字节。
原始数据报首部被复制为各数据报片的首部,但必须修改有关字段的值。(片偏移字段)
片偏移是以8个字节为单位来进行偏移的,因此要除以8
三、子网掩码与子网划分
3.1子网划分
子网划分:从两级IP变成三级IP
从 1985 年起在 IP 地址中又增加了一个“子网号字段”,**使两级的 IP 地址变成为三级的 IP 地址。这种做法叫作划分子网 (subnetting) **。划分子网已成为互联网的正式标准协议。
划分子网纯属一个单位内部的事情。单位对外仍然表现为没有划分子网的网络(是对内的,外界并不知道)
从主机号借用若干个位作为子网号 subnet-id,而主机号 host-id 也就相应减少了若干个位。
当没有划分子网时,IP 地址是两级结构。
划分子网后 IP 地址就变成了三级结构。
划分子网只是把 IP 地址的主机号 host-id 这部分进行再划分,而不改变 IP 地址原来的网络号 net-id。
那么自从使用了子网划分以后,我们的分组转发就会变得简单一些:通过目的子网号能过滤出不少的主机
凡是从其他网络发送给本单位某个主机的 IP 数据报,仍然是根据 IP 数据报的目的网络号 net-id,先找到连接在本单位网络上的路由器。
然后此路由器在收到 IP 数据报后,再按目的网络号 net-id 和子网号 subnet-id 找到目的子网。
最后就将 IP 数据报直接交付目的主机。
下面根据两张图来进行对比:
未划分子网:
已划分子网:
但是要清楚的是一点:划分为子网后对外仍是一个网络(外界对我们划分子网是不知道的)
子网划分的优点
减少了 IP 地址的浪费
使网络的组织更加灵活
更便于维护和管理
缺点:
减少了能够在网络上连接的主机数
本来B类地址的最多可连接数为65534台,但是在子网划分了以后,我们可以明显看到并没有那么多台了。
3.2子网掩码
子网掩码其实就是子网划分之后才有的,从一个 IP 数据报的首部并无法判断源主机或目的主机所连接的网络是否进行了子网划分。
那么要分辨该IP是否进行了子网划分,就可以通过子网掩码来进行分辨了。
规则:
子网掩码长度=32位
某位=1:IP地址中的对应位为网络号和子网号
某位=0:IP地址中的对应位为主机号
(IP 地址) AND (子网掩码) =网络地址
3.3使用子网划分了以后,分组转发
但在划分子网的情况下,从 IP 地址却不能唯一地得出网络地址来,这是因为网络地址取决于那个网络所采用的子网掩码,但数据报的首部并没有提供子网掩码的信息。
因此分组转发的算法也必须做相应的改动。
同一个IP地址,由不同的子网掩码可以得出相同的网络地址,但是效果是不一样的。(因为子网掩码的不同,就代表了子网划分的地址不同)
过程:
(1) 从收到的分组的首部提取目的 IP 地址 D。
(2) 先用各网络的子网掩码和 D 逐位相“与”,看是否和相应的网
络地址匹配。若匹配,则将分组直接交付。否则就是间接交付,
执行 (3)。
(3) 若路由表中有目的地址为 D 的特定主机路由,则将分组传送给
指明的下一跳路由器;否则,执行 (4)。
(4) 对路由表中的每一行,将子网掩码和 D 逐位相“与”。若结果与该行的目的网络地址匹配,则将分组传送给该行指明的下一跳路由器;否则,执行 (5)。
(5) 若路由表中有一个默认路由,则将分组传送给路由表中所指明
的默认路由器;否则,执行 (6)。
(6) 报告转发分组出错。
四、无分类编址CIDR
无分类CIDR提出的背景:
划分子网在一定程度上缓解了互联网在发展中遇到的困难。然而在 1992 年互联网仍然面临三个必须尽早解决的问题:
(1) B 类地址在 1992 年已分配了近一半,眼看就要在 1994 年 3 月全部分配完毕!
(2) 互联网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。
(3) 整个 IPv4 的地址空间最终将全部耗尽
CIDR干了什么:
CIDR消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
CIDR使用各种长度的“网络前缀”(network-prefix)来代替分类地址中的网络号和子网号。
IP 地址从三级编址(使用子网掩码)又回到了两级编址。
CIDR 使用“斜线记法”(slash notation),它又称为 CIDR 记法,即在 IP 地址面加上一个斜线“/”,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。例如: 220.78.168.0/24
CIDR 虽然不使用子网了,但仍然使用“掩码”这一名词(但不叫子网掩码)。
对于 /20 地址块,它的掩码是 20 个连续的 1。 斜线记法中的数字就是掩码中1的个数。
128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位)。
在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。
128.14.32.0/20 地址块的最小地址:128.14.32.0
128.14.32.0/20 地址块的最大地址:128.14.47.255
全 0 和全 1 的主机号地址一般不使用。
4.1路由聚合
一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。
路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。
前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址。
这些 C 类地址合起来就构成了超网
CIDR 的一个好处是:可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块。
通过一个网络号就可以查找ISP了,非常方便。
4.2CIDR 记法的其他形式
点十进制中的0可以省略
掩码可以根据CIDR的网络前缀推断出来
星号前面表示的是网络前缀,星号后面表示的是主机号。主机号的0和1是任意的。
4.3最长匹配
使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果
应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。
网络前缀越长,其地址块就越小,因而路由就越具体 (more specific) 。
举例子:
路由表中的两个项目都匹配出目的地址:
但是我们选择最具体的那个:
最后
如果大家有更好的理解方式或者文章有错误的地方还请大家不吝在评论区留言,大家互相学习交流~~~
如果想看更多的原创技术文章,欢迎大家关注我的微信公众号:Java3y。Java技术群讨论:742919422。公众号还有海量的视频资源哦,关注即可免费领取。
可能感兴趣的链接:
文章的目录导航(微信公众号端):https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
文章的目录导航(PC端):http://www.zhongfucheng.bitcron.com/post/shou-ji/pcduan-wen-zhang-dao-hang
海量精美脑图:http://www.zhongfucheng.bitcron.com/post/shou-ji/nao-tu-da-quan