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

目录

我们前面暂时跳过了网络层,带着网络层的功能去学习链路层。现在可以说我们只差最后一块拼图了,通过网络层,了解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之后才会得到,我们需要运营商的路由器为我们提供服务。

相关推荐
骄傲的心别枯萎2 分钟前
项目1:FFMPEG推流器讲解(二):FFMPEG输出模块初始化
linux·ffmpeg·音视频·视频编解码·rv1126
Nimsolax5 分钟前
Linux网络应用层自定义协议与序列化
linux·网络
egoist202311 分钟前
[linux仓库]图解System V共享内存:从shmget到内存映射的完整指南
linux·开发语言·共享内存·system v
葵花日记13 分钟前
LINUX——进度条
linux·运维·服务器
hmcjn(小何同学)1 小时前
轻松Linux-10.进程信号
linux·运维·服务器
用户31187945592181 小时前
libopenssl1_0_0-1.0.2p-3.49.1.x86_64安装教程(RPM包手动安装步骤+依赖解决附安装包下载)
linux
不爱学习的老登1 小时前
从零开始搭建私有服务器并部署网站
运维·服务器
驱动探索者1 小时前
linux 学习平台 arm+x86 搭建
linux·arm开发·学习
深思慎考1 小时前
【新版】Elasticsearch 8.15.2 完整安装流程(Linux国内镜像提速版)
java·linux·c++·elasticsearch·jenkins·框架
微电子爱好者1 小时前
TCP和UDP调试工具的介绍和使用
linux·tcp/ip·udp