哈工大计算网络课程网络层协议之:IP数据报、IP子网、子网掩码详解

news2024/9/25 15:25:14

哈工大计算网络课程网络层协议之:IP数据报、IP子网、子网掩码详解

文章目录

  • 哈工大计算网络课程网络层协议之:IP数据报、IP子网、子网掩码详解
    • Internet网络层
    • IP数据报(分组)格式
    • IP数据报分片
      • 最大传输单元(MTU)
      • IP分片与重组
      • IP分片过程
    • IP编址
    • IP子网(Subnets)
    • 有类IP地址
    • IP地址与子网划分
    • 子网掩码

Internet网络层

主机、路由器网络层主要功能包括:

在这里插入图片描述

网络层核心功能之一:就是路由和转发,因此Internet网络层一个需要实现的重要的功能就是设计路由协议,进行路径选择。比如路由协议:RIP、OSPF、BGP等。

**转发表存储了具体的路由信息,表示目的IP地址与对应输出链路端口的映射关系。**也就涉及到IP协议的相关内容:寻址规约、分组格式等。

在Internet网络传输过程中,IP数据分组难免会出现一些差错,此时,网络层需要将这些差错信息传输给相应的路由器或主机,这个时候就需要另一个非常重要的协议:ICPM协议(互联网控制报文协议)。它的作用是提供差错报告,以及路由器信令相关功能。 ICPM协议在一定程度上相当于IP协议的伴生协议,也就是说,实现IP协议,也就要实现ICPM协议,才能实现IP协议中的一些差错报告等功能。

IP数据报(分组)格式

IP数据报格式主要包括两部分:首部,数据段。

在这里插入图片描述

固定部分表示在所有的IP数据报中都是固定大小的。

  • 版本号: 占4位,表示IP协议的版本号。比如,如果是IPv4的话,这个4位表示的值就是4,如果是IPv6的话,这4位表示的值就是6。
  • 首部长度: 占4位。表示IP分组的首部长度。由于4位所能表示的最大值就是15,而首部长度最小就是20,因此IP协议规定,首部长度换算成10进制时,以4字节为单位。比如,当首部长度换算成10进制为5时,其表示的实际IP首部长度为20(5X4)字节
  • 服务类型(TOS)字段: 占8位:表示期望获得哪种类型的服务。1998年这个字段改名为区分服务。只有在网络提供区分服务(DiffServ)时使用。一般情况下不适应,通常IP分组的该字段(第二字节)的值为00H。
  • 总长度: 占16位,表示整个IP分组的总字节数(首部+数据)。由于是16位的,可以表示的最大范围是65535Byte,最小的IP分组首部:20B,IP分组可以封装的最大数据:65535-20 = 65515B。
  • 生存时间(TTL): 占8位,表示IP分组在网络中可以通过的路由器数(或跳步数)。路由器每转发一次分组,TTL减一。如果TTL=0时,路由器会丢弃该IP分组。此时,路由器一般会向源主机发送一个ICMP的报文。
  • 协议: 占8位,表示IP分组封装的是哪个协议的数据包,实现复用/分用。比如:协议值为6时,表示TCP协议,封装的是TCP段。协议值为17时,表示UDP协议,封装的是UDP数据报。
  • 首部校验和: 占16位,实现对IP分组首部的差错检测。计算校验和时,该字段置全0。采用的算法就是反码算数运行求和,和的反码作为首部校验和字段。校验和是逐跳计算、逐跳校验的,也就是首部校验和在每跳路由器转发时,一定都是重新计算重新校验的(每一跳转发时,首部字段可能都会有变化,比如TTL-1)。
  • 源IP地址、目的IP地址: 各占32位,分别标识发送分组的源主机/路由器(网络接口)和接收分组的目的主机/路由器(网络接口)的IP地址。
  • 选项字段: 长度可变,范围在1~40B之间,携带安全、源选路径、时间戳和路由记录等内容。实际上很少被使用。
  • 填充字段: 长度可变,范围在0~3B之间,目的是补齐整个首部,符合32位对其,即保证首部长度是4字节的倍数。

IP数据报分片

最大传输单元(MTU)

按照网络层结构,IP分组在具体的网络中传输时,会向下封装到数据链路层的数据帧中。不同的数据链路在封装时,对数据帧大小是有限制的。因此,用MTU来表示链路层数据帧可封装数据的上限。

网络链路的最大传输单元(MTU)—链路层数据帧可封装数据的上限

显然,不同链路的MTU是不同的,那么如果传输路径上两个链路的MTU不同该如何处理呢?当一个IP数据报,在一个较大MTU的链路上传输时,是可以封装到数据帧里的,但是当经过路由器转发到下一个较小MTU的链路上时,有可能就装不到一个数据帧里面。这时就涉及到IP分片的问题。

IP分片与重组

大IP分组向较小MTU链路转发时,可以被”分片“(fragmented)。

并不是只要大的IP分组向较小MTU链路转发时,就一定会被分片。路由器是否可以对其进行分片,是根据分组里的某个标志位来看的。 如果此时,路由器发现该IP分组不允许被分片,会将该分组丢弃,同时一般也会发送ICMP报文给源主机。

如果该IP分组允许被分片,则1个IP分组会被分为多片IP分组。

这些IP分片到达目的主机后进行”重组“(reassembled)。也就是说,路由器只管分组,而数据分组到达的最终目的主机负责组装。

但是随着数据分组在传输过程中的不断拆分,各个分组可能会被沿着不同的链路进行传输,到达目的主机的顺序也无法保证,那么目的主机如何才能在接收到这些分组后,识别各个分组的顺序并重新组装呢。这就需要在各个分组中添加一些标识。

因此,在IP首部的相关字段用于标识分片以及确定分片的相对顺序。 如果其中的某一分片丢失了,目的主机会在等待一段时间后,如果还没有接收到,则会将整个分组都丢弃。

具体来说,IP首部的总长度、标识、标志位和片偏移字段参与标识分片。

  • 标识字段: 占16位,标识一个IP分组。IP协议利用一个计数器,每产生IP分组计数器加1,作为该IP分组的标识。借助于源IP地址、目的IP地址、协议等字段一起,唯一标识一个IP分组。

  • 标志位: 占3位。最高位的bit保留,没有定义,第二个bit标识DF,最低位的bit标识MF。

    • DF:(Don’t Fragment)
    • MF:(More Fragment)

    这个标志位即标识了路由器是否可以对一个分组进行分片。

    • DF=1: 禁止分片。即如果IP分组超过了某个链路的MTU的话,禁止路由器对该IP分组分片。
    • DF=0: 允许分片。即如果IP分组超过了某个链路的MTU的话,允许路由器对该IP分组分片。
    • MF=1: 非最后一片。这个标志位置1,首先说明这个IP分组不是一个独立的IP分组,而是由IP分组分片出来的分组。而且可以明确的是,这个分片不是最后一片。
    • MF=0: 最后一片(或未分片)。即说明是分片的最后一片,又或者是根本没有分片。
  • 片偏移量: 占13位,一个IP分组分片封装原IP分组数据的相对偏移量。根据片偏移量的相对大小,实际上就可以排序出每个片的顺序。最后一片是MF=0,而且如果MF=0,且是被分片的分组话,那么它的片偏移量肯定不是0。在IPv4的分组格式里,片偏移量的值是以8字节为单位的。

IP分片过程

假设原IP分组总长度为L,待转发链路的MTU为M

若L > M,且DF = 0,则可以/需要分片。

分片后每个分片的标识复制原IP分组的标识。即原IP分组标识是什么,分片后的所有IP分组都取这个一样的标识。

通常分片时,除最后一片,其他分片均按照MTU允许的最大分片进行分片。

由于片偏移量是以8字节为单位,因此除了最后一个分片外,一个最大分片可封装的数据应该是8的倍数。因此,一个最大分片可封装的数据为:

在这里插入图片描述

MTU - 20字节的首部带下,表示数据帧携带的数据字节大小。除以8后向下取整,这个就是分片后,一个分片最大可装载的数据量。

此时,一个总长度为L的IP数据报,分片后的总分片数为:

在这里插入图片描述

L-20表示原IP数据报减去20字节首部长度,除以d(每个分片最大可封装数据大小) = 分片总数。

每片的片偏移字段取值为:

在这里插入图片描述

第一分片的片偏移量一定是0,其他的分片以此类推。

  • 每片的总长度字段为:

在这里插入图片描述

即除了最后一个分片外,都是最大的数据大小,加上20字节首部大小。最后一片即包含整个数据报剩下的那部分字节数。

  • 每片的MF标志位为:

在这里插入图片描述

即除了最后一个分片的MF=0外,其他分片的MF都等于1,表示非最后一个分片。

例子:

  • 4000B数据报
  • 输出链路MTU = 1500B
  • DF = 0

在这里插入图片描述

在这里插入图片描述

IP编址

IP分组中,需要两个非常重要的字段,来表示一个IP分组从哪里来,到哪里去

  • 源地址(SA):从哪儿来
  • 目的地之(DA):到哪儿去

在这里插入图片描述

网络接口:主机/路由器与物理链路的连接

  • 实现网络层功能
  • 路由器通常有多个接口
  • 主机通常只有一个或两个接口(比如,有限的以太网接口,无限的802.11接口)

在进行网络编址的过程中,事实上,需要重点编址的是实现网络层功能的这些接口。编址后的接口可以用来实现IP数据分组的寻址过程。

在这里插入图片描述

这些红色的表示网络层中的需要进行IP编址的网络层设备,包括路由器、主机的网络接口。

IP地址:32比特(IPv4)编号标识主机、路由器的接口,比如:11011111 00000001 00000001 00000001。而这些32位的二进制数比较难以记忆和使用。因此为了更方便的使用和记忆,一般会将上述32位拆分成4个8位,每个8bit转换成10进制,再用点号.拼接起来。

上述32位IP地址,采用4个十进制数来表示为:

在这里插入图片描述

这种对IP的书写方式,也成为点分十进制IP地址形式,也是目前使用比较广泛的IP地址书写方式。按照这种方式,可以对上述示例图中的每个接口分配一个IP地址,即在网络层中,可以利用这些唯一标识的IP地址,唯一标识这些网络接口。

在Internet网络中,IP地址更准确来说,是与每个网络接口相关联,即某某主机、路由器的IP地址。而一般说某个主机的IP地址,实际上是因为大部分主机往往只有一个网络接口,这个接口地址往往也被当做主机IP地址。

怎么样为接口分配IP地址?

如果我们随意的为接口分配独立的IP地址,再用路由转发表来记录的话,之前也讨论过这个问题,很容易造成路由器的存储、检索性能瓶颈。因此,就像改进后的路由表的目的地址表示一个范围来说,在为接口分配IP地址时,也应该是按照范围进行分配。

IP子网(Subnets)

此时,把32位IP地址划分为两部分:

  • 网络号(NetID)—高位比特
  • 主机号(HostID)—低位比特

在这里插入图片描述

高比特位用来表示一个网络,此时,在进行地址分配时,需要遵循一个基本原则:

  • 保证分配到某一个区域网络中的IP地址集合,它们的网络号是相同的,并且主机号是不同的。

在这里插入图片描述

如上图所示,红色部分表示的就是该IP地址所属的网络号,不同子网下的网络号是不同的。

这样,具有相同网络号的IP地址的集合就构成了一个IP子网。对于这样一个集合的网络接口,我们可以利用它们相同的网络号来描述这个区域的网络。

IP子网的特点:

  • IP地址具有相同网络号的设备接口
  • 不跨越路由器(第三及以上层网络设备),就可以彼此物理联通的接口。换句话说,如果中间跨越了路由器,也就不是一个IP子网了。

有了这样的编址方式,在路由转发表中,在存储向哪一个网络中转发数据时,就不需要记录某一个具体的IP地址了,只需要记录相应区域的IP子网地址就可以了。也就是,可以利用一个特殊地址,来描述一个个的IP子网的整体,这个地址就是IP子网地址。

有类IP地址

上述我们介绍了IP子网的概念,具有相同网络号的一组IP地址集合构成了一个IP子网,这些IP地址在不跨越路由器就可以实现彼此的物理联通。

在IP子网的概念下,一个IP地址是由高比特位的网络号和低比特位的主机号共同构成的。那么,这里存在的问题就是这两部分应该各占总的IP长度的多少位比较合适?

显而易见,当网络号占用的比特更多时,能表示的IP子网就更多,但是每个IP子网中包含的主机数就更少。而当主机号更多时,每个子网包含的主机数更多,可以形成更大的网络,但是能够表示的子网个数就相对更少。

最初为了解决这个问题,就涉及到有类IP地址划分的概念。

有类编址

假设下面图中的圆圈包含了整个32位的IP地址空间,所谓的有类IP地址编制,实际上采取的是一个二分法。首先把最高比特位50%的地址空间分给称为A类地址空间,同时定义A类地址的网络号占用8bit,剩余24bit用来表示主机号。由于A类地址网络号的最高位固定为0,因此,网络号所能表示的范围就是0-2的7次方,即0-127,而24位主机号能表示的范围就在0.0.0~255.255.255。

这里网络号最高位固定位0也很好理解,因为32位IP地址所能表示的地址范围为0.0.0.0-255.255.255.255,为了使A类地址占总地址空间的一半,所以把最高8bit位拆成2半,即A类地址最高8bit表示0~127,所以最高位固定为0.

在这里插入图片描述

在剩下的50%地址空间中,继续进行二分,即继续在最高8bit所能表示的128~255之间进行二分,因此,B类地址所能表示的地址范围就在:128.0.0.0 ~ 191.255.255.255。同时,在B类地址中,定义前16位bit作为网络号,后16位作为主机号。

因为A类地址的高8bit最大是127,因此B类地址的最高位应该是1,同时为了满足二分的特性,次高位应该是0。

在这里插入图片描述

最后,剩余1/4的地址空间的最高2bit一定是11,再进行二分的话就是接着根据第三高位进行拆分,划分给C类地址。显然这部分地址的高8位表示的地址范围在:192~223之间。同时,定义C类地址的高24位为网络号,低8位为主机号。

在这里插入图片描述

对于剩余的1/8的地址空间,再进行最后一次的二分,拆分成两个占6.25%地址空间的D类地址和E类地址。高8bit表示的地址范围分别是:

  • E类地址:224~239
  • D类地址:240~255

这两类地址,不再区分网络号和主机号,一般这两类地址空间用作特殊目的。这类地址一般用来命名或标识互联网中的一组主机,这组主机理论上可以分布在互联网中的每个地方。在这种情况下,这类地址只能作为IP分组的目的地址,也就是只能往这类地址发送数据。这类地址也被成为多播地址,或是组播地址。

在这里插入图片描述

通过上面的饼状图也能看出,在IP网络中,A类地址+B类地址+C类地址占据了整个IP地址范围的87.5%,也都根据上述IP编制中提及的,划分了网络号和主机号,因此都可以用来标识互联网中的一个唯一网络接口的。

但也有一些特殊的IP地址,是不能够被分配给主机使用的,比如下述的一些特殊IP地址:

在这里插入图片描述

IP地址与子网划分

子网掩码

子网掩码形如IP地址,也是32位地址的形式,区别在于对网络号和子网号对应的bit位全部取1,对应主机号bit位全部写0。

例如:

  • A类网络的默认子网掩码为:255.0.0.0
  • B类网络的默认子网掩码为:255.255.0.0
  • C类网络的默认子网掩码为:255.255.255.0

此时,假设B类网络借用主机号的3bit来划分子网,将该子网的主机号的最高3bit都置为1,那么此时该子网的掩码为:255.255.224.0。

因此,子网地址+子网掩码 = 准确确定子网大小。

例如:

  • 子网:201.2.3.0、子网掩码:255.255.255.0

由于子网掩码是255.255.255.0,子网号对应的bit全部取1,也就是该子网的IP地址24位都表示网络号,我们就知道这个子网就是一个标准的C类网络。

假设我们想将这个子网,划分为等长的4个子网,就是针对该C类网络的8位主机号,进行均等的划分,256/4=64,因此划分后的每个子网的IP地址为:

在这里插入图片描述

现在我们知道了如何对子网进行划分,那么如上图所示,当路由器将这些不同的子网关联在一起后,路由器如何确定应该将IP分组转发到那个子网去呢?

这个时候,路由器的转发表除了要保存子网的地址外,还必须伴随着相关的子网掩码。

此时,路由器转发表的检索过程为:

  • 将IP分组的目的IP地址与子网掩码按位与运算,提取对应的子网地址。

例如:目的IP地址:172.32.1.112,子网掩码为:255.255.254.0

将目的IP地址与子网掩码按位做与操作后,得到的结果为:

在这里插入图片描述

因此,该目的IP地址对应的子网地址位:172.32.0.0(子网掩码:255.255.254.0)

这个子网对应的地址范围,也就是主机号所能表示的IP地址范围为:172.32.0.0~172.32.1.255。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网工内推 | 云计算专场,有通讯补助,13薪,带薪年假

01 中电信数智科技有限公司湖南分公司 招聘岗位:云计算工程师 职责描述: 1、云计算平台环境的搭建:安装、部署、配置、优化; 2、云计算平台有关的解决方案、平台测试; 3、桌面云和虚拟化项目的交付和维护工作&#…

功能强大却十分小众的5款软件

有些软件虽然功能强大,使用便捷,但是却没有得到广泛的关注和推荐,这并不意味着它们不值得一试,相反,它们可能是你不知道的宝藏。我的任务就是要把这些隐藏的好软件分享给大家。 轻量级笔记——CintaNotes CintaNotes…

PCB设计系列分享-LDO的布局布线指南

目录 概要 整体架构流程 技术名词解释 技术细节 小结 概要 “噪声问题” 这是每位电路板设计师都会听到的四个字。为了解决噪声问题,往往要花费数小时的时间进行实验室测试.以便揪出元凶,但最终却发现,噪声是由开关电源的布局不当…

27-1BP_Adaboost强分类器公司财务预管建模——强预测器和弱预测器(附matlab程序)

1.简述 学习目标:进行强预测器和弱预测器的训练来减小误差 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间,从样本空间中找出m组训练数据,每组训练…

0015-TIPS-pawnyable : userfaultfd

原文 Linux Kernel PWN | 040303 Pawnyable之userfaultfd userfaultfdの利用 题目下载 代码分析 #include <linux/cdev.h> #include <linux/fs.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/random.h> #include &…

学生党可以做的暑期兼职,让暑假生活不再躺平

夏季期间有几种兼职工作可供选择&#xff1a; 1.许多超市在暑假期间会雇佣一些短期工来从事收银和理货等工作&#xff0c;每小时报酬一般约为15元左右&#xff0c;算是不错的待遇。 2.在暑假期间&#xff0c;你可以寻找一些人力资源工作&#xff0c;借助他们的帮助来安排一些临…

常用工具类之AJ-Captcha入门

1.引入MAVEN依赖 若依官方引入的是1.2.7版本。我选择了目前最常用的1.3.0版本。 在项目中给的 ruoyi-framework\pom.xml 添加依赖 <!-- anji滑块验证码 --><dependency><groupId>com.anji-plus</groupId><artifactId>spring-boot-starter-captc…

android native hook简介

&#xff08;一&#xff09;简介 android中的 native Hook是一个吸引人的技术点&#xff0c;诱使和带来很多特别精彩的想法和体验&#xff0c;在调试和其他场景中有很多应用。 本文代码基本都来自github上的源码&#xff0c;只做了适当的编辑和修改&#xff0c;主要是为了验证…

解决VMware虚拟机和Windows主机不在同一网段无法连接问题

解决VMware虚拟机和Windows主机不在同一网段无法连接问题 由于自己平时需要频繁更换虚拟机网段&#xff0c;有时候在Windows主机使用Xshell等SSH工具无法连接&#xff0c;还需要配置Windows主机的网段&#xff0c;需要将它们的网段配置到同一网段内&#xff0c;才能使SSH连接成…

Pillow库 三分钟带你了解最基础的使用

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰 目录 一、Pillow库是什么 二、以下是 Pillow 的一些主要作用和使用方法的概述&#xff1a; 三、学习使用 Pillow&#xff0c;一个强大的 Python …

python综合实践-利用Python turtle模块画樱花丛

目录 一、方法步骤 二、代码实现 三、代码解释 四、优化代码 五、Python turtle模块介绍 六、Python turtle模块使用方法 创建画布和画笔对象 控制画笔移动和旋转 控制画笔外观 绘制基本图形 控制画布参数 这段代码使用Python turtle模块&#xff0c;利用递归的方式绘…

前端实现消息推送、即时通信、SSE、WebSocket、http简介

信息推送 服务端主动向客户端推送消息&#xff0c;使客户端能够即时接收到信息。 场景 页面接收到点赞&#xff0c;消息提醒聊天功能弹幕功能实时更新数据功能 实现即时通讯方式 短轮询 浏览器&#xff08;客户端&#xff09;每隔一段时间向服务器发送http请求&#xff0c;…

leetcode47. 全排列 II(回溯算法-java)

全排列 II leetcode47. 全排列 II题目描述解题思路代码演示 回溯算法专题 leetcode47. 全排列 II 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/permutations-ii 题目描述 给定一个可包含重复数字的序列 nums &#xf…

Vulnhub: Corrosion靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.130 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.130 目录爆破 blog-post目录下存在两个目录 对archives目录中的randylogs.php进行测试发现存在文件包含 wfuzz -c -w /op…

POI设置日期类型时间约束createDateConstraint不生效了

背景 在使用 POI 导出 excel 时间类型加入时间约束时&#xff0c;发生了使用 Excel 打开无法正确使用时间约束的问题&#xff0c;但是在 永中Office 打开可以使用 关键词 helper.createDateConstraint&#xff0c;POI设置时间约束 设置时间约束的代码如下 该代码是有问题的&…

浏览器渲染流程

解析HTML&#xff0c;生成DOM树&#xff0c;解析CSS&#xff0c;生成CSSOM树 将DOM树和CSSOM树结合&#xff0c;生成渲染树(Render Tree) Layout(回流):根据生成的渲染树&#xff0c;进行回流(Layout)&#xff0c;得到节点的几何信息&#xff08;位置&#xff0c;大小&#x…

MySQL实战解析底层---为什么我的MySQL会“抖“一下

目录 前言 SQL语句为什么变“慢”了 InnoDB刷脏页的控制策略 前言 一条SQL语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很难复现&#xff0c;它不只随机&#xff0c;而且持续时间还很…

STM32挂载SD卡基于Fatfs文件系统读取文件信息

STM32挂载SD卡基于Fatfs文件系统读取文件信息 &#x1f516;本例程基于正点原子标准库修改而来。 &#x1f4cd;FatFs 相关API函数网站&#xff1a;http://elm-chan.org/fsw/ff/00index_e.html &#x1f334;分别测试了SD卡模块以及Mini SD卡模块。 &#x1f33f;STM32f1单片…

代码随想录二刷day29 | 回溯之 491.递增子序列 46.全排列 47.全排列 II

day29 491.递增子序列回溯三部曲 46.全排列回溯三部曲 47.全排列 II 491.递增子序列 题目链接 解题思路&#xff1a; 回溯三部曲 递归函数参数 本题求子序列&#xff0c;很明显一个元素不能重复使用&#xff0c;所以需要startIndex&#xff0c;调整下一层递归的起始位置。…

【Python 基础篇】Python各种运算符详解

文章目录 引言一、算术运算符二、比较运算符三、逻辑运算符四、赋值运算符总结 引言 在 Python 编程中&#xff0c;运算符是用于执行各种数学和逻辑操作的特殊符号。它们使我们能够对变量和值进行各种计算和比较。本篇博客将深入探讨 Python 中的常见运算符&#xff0c;并通过…