计算机网络--网络层串讲

ops/2024/9/23 7:23:59/

笔记整理自学习开源文档:小林coding

为什么要做这个串讲?因为我在学习408网络层的时候,看完机构的视频课感觉没有很好地将知识串联起来,便找到《图解网络》作为补充,且小林的讲解是我认为开源中较为通俗易懂的,因此我在学习过程中将精华部分记录下来加上自己的理解并录制这个串讲视频帮助自己理解知识点并分享给需要的同学,如果想深入学习还需要完整地去阅读小林的文字版,我相信你会有很大的收获的!

首先声明,这个串讲视频只讲重要知识点、底层逻辑,帮你快速过一遍知识点并串起来,不讲深入的细节和习题,具体细节还需要参考王道等视频讲解来学习,适用于已经有一定的基础或者想了解网络层学什么的同学。且我本人也是一个初学者,难免有讲的不好的地方还请见谅~

网络层串讲

网络层本质上是实现主机点对点通信的。

Mac地址和IP的地址的理解:

在这里插入图片描述

源IP地址和目标IP地址在传输过程中是不会变化的(前提:没有使用 NAT 网络),只有源 MAC 地址和目标 MAC 一直在变化

IP地址用点分十进制的标记方式,如192.168.1.3。

那么IP地址有哪些分类?

IP分类

前面是网络号,后面是主机号

在这里插入图片描述

注意,在计算最大主机数的时候需要减去主机号为全0 和全1的地址,因为他们有自己的特殊作用:

  • 主机号全为 1 指定某个网络下的所有主机,用于广播
  • 主机号全为 0 指定某个网络

具体广播的细节这里不讲。

分类的缺点是什么?

我们可以注意到C类的主机号只有8 位,也就是可用主机只有254个,太少了;而B类16位的主机号又太多,不在一个数量级的。举个例子,你是一个公司的老板,公司有300号人,你就不得不去申请B类IP,太过于浪费了,因此我们就引出了CIDR 无分类地址来解决。

无分类地址 CIDR

格式a.b.c.d/x,其中 /x 表示前 x 位属于网络号

比如 192.168.1.2/24,这种地址表示形式就是 CIDR,/24 表示前 24 位是网络号,剩余的 8 位是主机号

这里引出一个新的概念:子网掩码。初学者其实不好理解这个概念,我们后面在做题的时候又会发现子网掩码随处可见。那么到底什么是子网掩码??

其实其目的就是掩盖掉主机号,用于指示IP地址中哪些位是用于标识网络号以及子网号(后面会讲),将子网掩码和 IP 地址按位计算 AND,就可得到网络号(子网地址)。

在这里插入图片描述

很好理解,子网掩码用连续的1将网络号取出,主机号位置0就得到了子网地址。也就是说,告诉你IP,又告诉你子网掩码,你就能求出他的网络号。

这里提到了子网地址就需要引出一个概念:子网****划分

子网划分实际上是将主机号分为两个部分:子网网络地址和子网主机地址。看这个图就很好理解了:

在这里插入图片描述

假设对 C 类地址进行子网划分,网络地址 192.6.13.0,主机号共8位,子网占两位也就是01和10,将后面6位全部置0就能得到子网地址(实际上就是用我刚刚说的子网掩码进行操作的,只不过C类地址的默认子网掩码是255.255.255.0,只需要将后面8位中除了子网号置0即可,简化计算了)。

以上这一段,请好好理解!它把从IP分为网络号和主机号,再到后面引出子网掩码,子网划分等核心概念全部串起来了,408的题目也就是围绕这些核心概念做文章,特别在一块喜欢出计算题,比如让你算子网地址,判断是否在同一子网等,都是一个类型的,好好掌握这个本质就能快速解题。

然后我们继续,刚刚讲了IP的逻辑分类,现在讲讲物理分类,私有IP和公有IP。

顾名思义,公有IP就是全世界都能访问的,私有IP就是个人的或者组织内部的,这个考点了解即可,大概记忆一下私有IP的地址,比如192.168是比较常考的。

在这里插入图片描述

IP的转发分组

  1. IP地址的网络地址这一部分是用于进行路由控制,转发是由路由器实现的,路由控制表中记录着网络地址与下一步应该发送至路由器的地址。
  2. 在发送IP包的时候首先需要确定目的网络,路由器找到目的网络后再把分组在这个网络上交付给目的主机。怎么一步一步地找到目的地址?
  3. 从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将 IP 包转发给相应的下一个路由器。如果路由控制表中存在多条相同网络地址的记录,就选择相同位数最多的网络地址,也就是最长匹配。

举个例子:

在这里插入图片描述

  1. 主机 A 要发送一个 IP 包,其源地址是 10.1.1.30 和目标地址是 10.1.2.10,由于没有在主机 A 的路由表找到与目标地址 10.1.2.10 相同的网络地址,于是包被转发到默认路由(路由器 1
  2. 路由器 1 收到 IP 包后,也在路由器 1 的路由表匹配与目标地址相同的网络地址记录,发现匹配到了(其实这里也可以通过子网掩码计算取出前24位网络号进行匹配但是对数字由敏感度的话就没有必要算了很容易能看出),于是就把 IP 数据包转发到了 10.1.0.2 这台路由器 2
  3. 路由器 2 收到后,同样对比自身的路由表,发现匹配到了,于是把 IP 包从路由器 210.1.2.1 这个接口出去,最终经过交换机把 IP 数据包转发到了目标主机

但是现在又有一个问题,每一种数据链路的最大传输单元MTU 都是不相同的,比如以太网的 MTU 是 1500 字节,那么当IP 数据包大小大于 MTU 时, IP 数据包就会被分片。

因此我们又引出了IP 分片与重组

IP 分片与重组

当 IP 数据包大小大于 MTU 时, IP 数据包就会被分片。经过分片之后的 IP 数据报在被重组的时候,只能由目标主机进行,路由器是不会进行重组的。举个例子:

假设发送方发送一个 4000 字节的大数据报,若要传输在以太网链路,则需要把数据报分片成 3 个小数据报进行传输,再交由接收方重组成大数据报。

在这里插入图片描述

这里我们需要会计算偏移值,参考王道课本这两张图:

我们先来看一下IP数据报的格式,可以看到数据报是分为首部和数据部分的。

在这里插入图片描述

从这个题也能看到我们长度为4000B的数据报,分为了首部20B和3980B

在这里插入图片描述

我们抓住一个规律,除了最后一个分片,其余分片中的数据部分都是8B的倍数(分片以8字节为偏移单位需要我们记住)。因此如果我们以字节对数据进行编号的话,第二个偏移量的首个编号为1480,用1480/8=185,就能求出偏移值。

以上便是整个网络层最最核心也是408最常考的内容了,一定要好好理解、吃透!!

当然还有一些细小的知识,比如一堆协议,像比较重要的NAT技术,简单来说就是公司、家庭、教室内的主机对外部通信时,把私有 IP 地址转换成公有 IP 地址。还能把 IP 地址 + 端口号一起进行转换,这样,就用一个全球 IP 地址就可以了,这种转换技术就叫网络地址与端口转换 NAPT。

还有DHCP协议,我们的电脑通常都是通过 DHCP 动态获取 IP 地址,省去了配 IP 信息繁琐的过程。

这里就不对各种协议具体展开了,大家想了解的话可以去王道课本上看看,背一些重点即可,这一块不会考的很深的。大概了解一下每个协议是干什么的,然后通过英文名给他记住即可。

视频跳转链接

计算机网络】网络层串讲


http://www.ppmy.cn/ops/89202.html

相关文章

python dash框架

Dash 是一个用于创建数据分析型 web 应用的 Python 框架。它由 Plotly 团队开发,并且可以用来构建交互式的 web 应用程序,这些应用能够包含图表、表格、地图等多种数据可视化组件。 Dash 的特点: 易于使用:Dash 使用 Python 语法…

8.3 字符串中等 306 Additive Number 423 Reconstruct Original Digits from English

306 Additive Number //累加数:除了前两个数,其余数都等于前两个加起来,至少包括三个数 //难点找到前两个数 //条件1:至少包括三个数–>确定前两个数字的最大长度 len n/3 看下方注意1 //条件2:遇到0默认归属于他…

Langchain核心模块与实战[9]:RAG检索增强生成[文本向量化、实战ChatDoc智能文档助手]

Langchain核心模块与实战[9]:RAG检索增强生成[文本向量化、实战ChatDoc智能文档助手] 参考文章可以使用国产LLM进行下述项目复现: 初识langchain[1]:Langchain实战教学,利用qwen2.1与GLM-4大模型构建智能解决方案[含Agent、tavily面向AI搜索]langchain[2]:Langchain实战教…

spring注解:@Transactional使用简介

Transactional 是 Spring 框架提供的声明式事务管理的一个核心注解,主要用于对方法进行事务管理。它能够确保方法在执行过程中的多个操作要么全部成功,要么全部失败。这种事务管理方式可以简化开发人员编写事务管理代码的工作量,提高开发效率…

显示学习5(基于树莓派Pico) -- 彩色LCD的驱动

和这篇也算是姊妹篇,只是一个侧重SPI协议,一个侧重显示驱动。 总线学习3--SPI-CSDN博客 驱动来自:https://github.com/boochow/MicroPython-ST7735 所以这里主要还是学习。 代码Init def __init__( self, spi, aDC, aReset, aCS) :"&…

vue在Index.html中自定义全局变量

在inde.html定义整个项目都能访问的变量,用于判断等等 直接在 index.html中 js <script>window.VUE_APP_NODE_ENV <% process.env.NODE_ENV %>;</script> 我这里是 赋值了 环境值. 可以改变任意值都行. 要用的地方直接判断就行 if (VUE_APP_NODE_ENV…

面试经典算法150题系列-跳跃游戏||

跳跃游戏|| 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 num…

MyBatis 如何通过拦截器修改 SQL

目录 1. 实现Interceptor接口2. 注册配置文件 假如我们想实现多租户&#xff0c;或者在某些 SQL 后面自动拼接查询条件。在开发过程中大部分场景可能都是一个查询写一个 SQL 去处理&#xff0c;我们如果想修改最终 SQL 可以通过修改各个 mapper.xml 中的 SQL 来处理。 但实际过…