当前位置: 首页 > news >正文

Linux相关概念和易错知识点(45)(网络层、网段划分)

目录

  • 1.网络层
    • (1)IP协议头格式
    • (2)工作流程
  • 2.网段划分
    • (1)五类地址
    • (2)回环地址
    • (3)网段的特殊地址
    • (4)网络建设

我们前面暂时跳过了网络层,带着网络层的功能去学习链路层。现在可以说我们只差最后一块拼图了,通过网络层,了解IP报头的具体组成,我们就可以串联整个协议栈了。当然,有了ARP、MTU、NAPT的链路层铺垫,网络层会理解地非常轻松。

1.网络层

(1)IP协议头格式

网络层接收传输层的数据段,在这里进一步封装为数据报,报头结构如下图:

4 位版本号: 指定 IP 协议的版本,对于 IPv4 来说,这个字段的值就是 4。有的 IPv4 集成到了系统里,这些生态问题很难改变。

4 位头部长度: 4bit 表示的最大的数字是 15,真实的头部长度要 * 4,所以 IP 头部最大长度是 60 字节。固定长度是 20 字节,选项最多有 40 字节。

8 位服务类型: 其中有 4 位 TOS 字段,分别表示:最小延时、最大吞吐量、最高可靠性、最小成本,这四者相互冲突,只能选择一个(对于 ssh/telnet 这样的应用程序,最小延时比较重要;对于 ftp 这样的程序,最大吞吐量比较重要)。 除此之外,还有 1 位保留字段必须置为 0,以及 3 位已经弃用的优先权字段。

16 位总长度: IP 数据报总长度,包含IP报头 + 数据部分,IP报头的长度前面的 4 位头部长度也单独统计过。

16 位标识: 要理解这个,我们要结合MTU来看,链路层约束IP数据报(包含报头 + 数据)不能超过1500字节,如果超过了就要分片、重组。 所以在网络层,忽略报头的选项部分,发现传输层传下来的数据段超过1480字节的话,就要将数据分成多片,交到目标主机处再进行重组(路由器不会重组)。其中 16 位标识就是给每个分片一个相同的 ID,相同标识的说明它们原本是在一起的,网络层也会根据 16 位标识判断哪些分片属于同一组的。

3 位标志字段: 第 1 位现在不使用; 第 2 位为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文;第三位表示“更多分片”,如果分片了的话,最后一个分片置为 0,其他是 1,类似于一个结束标记。000表示无分片或者最后一块分片,001表示首块分片和中间分片。要结合片偏移最终确定。

13 位分片偏移: 是分片相对于原始 IP 报文数据部分开始处的偏移量,分片后每个片作为一个数据报独立传输,偏移量告诉了之后应当按照什么顺序组装,重组后的报文应当是完全连续的。 如果 13 位分片偏移的值是 1,说明其偏移的字节数是 1 * 8,这个偏移值要 * 8才能得到真实偏移值。 因此,每个分片(除了最后一个分片)的数据量应当是 8 的整数倍,否则无法连续地拼接起来。 总结一下,标识字段000,偏移量0表示无分片;001 + 0 表示第一块分片,001 + !0 表示中间的分片,000 + !0 表示最后一块分片,010表示禁止分片。

8 位生存时间(TTL): 数据报到达目的地的最大跳数,一般是64。每次经过一个路由转发,TTL -= 1,如果一直减到 0 还没到达,那么就丢弃,由上层控制重传。这个字段要是用来防止出现路由循环和网络拥堵。

8 位协议: 值表示上层协议的类型,6 对应TCP协议;17 对应UDP协议,1 对应ICMP协议(ping命令使用的协议),也就是说协议号为 1 的话报文就会交给ICMP协议去处理,而不是常认为的TCP和UDP。这和链路层mac帧格式的“类型”有相似之处,IP也是有自己的类型的,不同类型的IP报文其数据部分也不一样。

16 位头部校验和: 进行校验,其功能和链路层的CRC校验一致,主要用于鉴别头部是否损坏,损坏的话该报文直接丢弃。链路层和网络层都有自己的校验手段,链路层校验失败后直接丢弃且不做任何反馈,相应的,IP分片重组肯定收集不齐,也会重组失败,反映到传输层就是传输失败,由相应重传机制控制重传。如果IP层检验和失败,同样会直接丢弃且不做反馈,同样重组分片会因为不齐而失败,由传输层/应用层控制重传。 两者都不维护可靠性传输,如果校验失败都会直接丢弃而不反馈,造成后续的错误最终都汇集到传输层/应用层,由它们进行控制。 这也体现出分层的特点。

32 位源地址和 32 位目标地址: 表示发送端和接收端。其中路由器进行NAPT的时候会来修改这两个字段(正向查表和反向查表)

(2)工作流程

网络层负责接收传输层传下来的数据段。根据数据段的大小,进行分片处理。分片处理后的每一片都是一个独立的数据报,有着完整的IP报头,但是由于将数据部分分片,每个数据报里面的数据部分实际上是支离破碎的(按顺序拆成一块块的,每一块都不是完整的数据段),只有第一个分片有传输层的头部。 所以说需要标志、片偏移共同维护分片标识,因为一旦重组失败了,对于传输层而言数据就是错乱的,数据分片重组在传输层是不应该感知到的。

当IP层包装好后交给链路层,分片由IP层做好后,一定满足MTU的要求,所以链路层拿着数据报,根据数据报里面的目的IP判断是否是在当前局域网。如果是的话就ARP请求对应mac地址,如果不是的话就ARP请求网关地址的mac地址。 之后mac帧被封装传输给交换机,由交换机查表、扩散转发给对应主机。

如果转发给了路由器,路由器会进行解包操作,在链路层进行校验和,如果失败就丢弃。没有失败的话继续解包到网络层,进行头部校验和,如果失败就丢弃。 路由器根据目的IP查看自己的路由表,根据最长前缀选择好下一跳。与此同时路由器会NAPT,修改所有分片的源地址和第一块分片的端口号,并将TTL -= 1,之后封装好新的目的mac后发出去。

直到目的主机上进行解包,校验和,根据标志、标识、片偏移进行重组,重组成功后就将完整的数据段交给传输层,失败的话就不做任何处理。 TCP会触发超时重传或者快重传,UDP的话就需要应用层自己维护重传机制了。

2.网段划分

这里主要是补充一些上篇文章没有提及的IP地址相关的知识,不影响整体理解。

(1)五类地址

下面是总结各类地址的表格

地址类别首段地址范围(十进制)网络位/主机位(IPv4共32位)默认子网掩码主要用途
A类1~126(127.0.0.0为回环地址)前8位为网络位,后24位为主机位255.0.0.0大型网络(如早期主干网、大型企业)
B类128.0~191.255前16位为网络位,后16位为主机位255.255.0.0中型网络(如中型企业、高校)
C类192.0.0~223.255.255前24位为网络位,后8位为主机位255.255.255.0小型网络(如家庭、小型办公室)
D类224.0.0.0~239.255.255.255不划分网络位与主机位无默认子网掩码组播(如视频会议、数据群发)
E类240.0.0.0~255.255.255.254(255.255.255.255为广播地址)不划分网络位与主机位无默认子网掩码保留地址(用于科研、实验等特殊场景,未公开商用)

我们就考虑A、B、C类地址,最开始是严格划分的,但后面引入CIDR技术后,基本都是按需分配,如按照子网掩码,/23这种表示方式来划分网络号和主机号,这样极大地提高了地址的利用率。 但这并不意味五类地址被淘汰了,而是引入CIDR进行更精细的划分,比如我用拿到了一个/7的地址块,我可以说我拿到了2块A类地址(主机数为A类地址的两倍)。

(2)回环地址

127开头的地址属于IPv4的回环地址。

也就是说整个127.0.0.0/8网段(即127.0.0.1~127.255.255.254)均为此用途,核心作用是本地设备自我测试(如程序调试、网络协议验证),数据不会发送到外部网络,仅在设备内部循环。最常用的是127.0.0.1,常用来指代本地主机。

(3)网段的特殊地址

一个子网的理论主机总数 = 2 ^ 主机号位数,但实际上是2 ^ 主机号位数 - 2,有两个特殊地址不能使用。

主机号全0用于标识整个网段,主机号全1表示在该网段上广播。主机号网络号全1表示全局广播,全0一般都是临时占位(可表示本网络上的本主机),这些地址都不会分配到一个具体的主机上。

(4)网络建设

我们想要构建子网时,家里直接买个路由器即可,路由器具备构建子网的能力。但局域网的构建运营商也在做,有可能我们路由器出去还是子网,例如家庭路由器的WAN口IP实际上还是运营商子网下的私网IP。

申请公网IP,网络建设工作,都是交给运营商来做的。所以为什么上网交钱是给运营商交钱?我们报文出了路由器后还是在运营商的子网下,我们真正想要得到公网IP需要运营商路由器NAPT之后才会得到,我们需要运营商的路由器为我们提供服务。

http://www.dtcms.com/a/383870.html

相关文章:

  • 因果推断 | 从因果树到因果森林:理论解析与代码实践
  • Spring MVC 九大组件源码深度剖析(七):ViewResolver - 视图解析的智慧
  • 【左程云算法09】栈的入门题目-最小栈
  • java设计模式三、创建者模式
  • 出现次数最多的字符 字符串处理
  • 根据IP获取用户信息和天气信息的方法
  • Paxos协议
  • 上网行为二层部署案例
  • XLua教程之热补丁技术
  • Linux 基本命令超详细解释第一期 | cd | pwd | ls | mkdir | rmdir
  • 如何查找 Linux 中 `dm-X` 设备对应的真实磁盘或虚拟机?
  • 线性稳压器LDO原理
  • 大模型浪潮来袭
  • 第6课:安全性与权限控制
  • 如何用 Rust 重写 SQLite 数据库(二):是否有市场空间?
  • pgsql 特有字段记录
  • Leetcode第165场双周赛题目详解+复盘
  • rt1180 rt1180处理器ethercat具体技术介绍
  • Sugov 关于频率变化
  • 多语言编码Agent解决方案(6)-部署和使用指南
  • React 原理篇 - React 新架构深度解析
  • Flowgorith,一款图形化编程入门工具
  • LeetCode 674.最长连续递增序列
  • 贪心算法在AGV无人车路径规划中的应用
  • Week 16: 深度学习补遗:集成学习进阶与量子计算概念入门
  • HTTP 协议的基本格式
  • 深入理解 Java 异常处理机制
  • AI产品经理面试宝典第93天:Embedding技术选型与场景化应用指南
  • commons-csv
  • 【C++】类和对象1