网络层协议 IP 协议介绍 -- IP 协议,网段划分,私有 IP 和 公网 IP,路由

目录

1 IP 协议

1.1 IP 协议格式

2. 网段划分

2.1 网络号和主机号

2.2 传统 IP 地址分类和 CIDR 技术

2.3 特殊的 IP 地址

2.4 IP 地址的数量限制

2.5 私有 IP 和公网 IP

3. 路由


        网络层主要作用是实现不同局域网之间的通信连接,并为数据在复杂网络环境中的传输提供路径选择和逻辑寻址能力

1 IP 协议

        先介绍一下在网络通信中,主机、路由器、节点的概念。

        主机:配有 IP 地址但是不进行路由控制的设备

        路由器:即配有 IP 地址又能进行路由控制的设备

        节点:在网络通信中,由多个主机和路由器构成了复杂的拓扑结构,其中主机和路由器就是该网络拓扑结构中一个一个的节点。

        如下图所示,主机 B 要将数据传输到主机 C 需要经过多个路由器,主机 B 到主机 C 之间所经过的路由器构成一条路径,如何选择这条路径就是 IP 协议需要做的主要工作

1.1 IP 协议格式

        (1)4 位版本号(version):指定 IP 协议的版本,目前有 IPv4 和 IPv6,主流还是使用的 IPv4。对于 IPv4 来说,该字段为 4

        (2)4 位首部长度(header length): 表示该 IP 报文头部有多少个 4 字节的字段。因为只有 4 位,所以最大表示为 15,其中前 20 字节是必须有的,所以 IP 头部的大小范围为[20, 15*4 = 60] 字节。

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

        (4)16 位总长度(total length):IP 数据报整体占多少个字节。

       (5)16 位标识(id):用于标识主机发送报文的唯一性。如果上层协议(TCP/UDP)报文过大,超过了 MTU(最大传输单元),在被封装在 IP 数据报中时,会将上层报文分成若干个 IP 数据报,16 位标识用于标识该 IP 报文属于哪一个上层数据报

        (6)3 位标志字段:第一位保留,目前不使用;第二位为 1 表示禁止分片,这时候如果报文长度超过 MTU,IP 模块就会丢弃报文。第三位表示“更多分片”,当置 0 时,表示该 IP 数据报为最后一个分片,其他情况置为 1,类似一个结束标记

        (7)13 位分片偏移(framegament offset):该字段表示的是分片相对于原始 IP 报文开始处的偏移。用于表示当前分片在原报文的哪个位置,实际偏移的字节数是该字段 * 8,因此,除了最后一个分片,其他分片的长度必须是 8 的整数倍。

        (8)8 位生存时间(Time To Live,TTL):数据报到达目标主机的最大跳跃节点数。一般是 64,每经过一个路由器,TTL 减 1,减到 0 还没到达,则丢弃报文。这个字段主要是用来防止出现路由循环的情况

        (9)8 位协议字段:表示上层的协议类型。

        (10)16 位首部校验和:使用 CRC 进行校验,来鉴别头部是否损坏。

        (11)32 位源地址和 32 位目标地址:表示发送端和接收端的 IP 地址。

        (12)选项字段:不定长,最多 40 字节,此处不作介绍。

2. 网段划分

2.1 网络号和主机号

        IP 地址分为两个部分,网络号和主机号

        网络号:保证相互连接的两个网段(子网)具有不同的标识

        主机号:同一个网段内,主机之间具有相同的网络号,但是必须有不同的主机号。

        如上图所示,上半张图主机的 IP 地址前半部分都是 192.168.128,叫做该网段的网络号(网络标识),表示这些主机属于同一个子网中, 在该子网中增加主机,则这台主机的网络号和该子网的其他主机网络号一致,但是主机号必须不能和子网中的其他主机重复。

        通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同。手动管理子网内的 IP 是一个相当麻烦的事情。

        有一种叫做 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),是一种基于 UDP 的应用层协议,主要是用于自动为网络中的设备分配 IP 地址及相关网络参数,避免手动配置的繁琐和地址冲突问题。通常由路由器或专用服务器担任。

        当一台主机接入网络之后,使用该技术使其自动获取 IP,断开网络之后 IP 地址可回收再利用。

2.2 传统 IP 地址分类和 CIDR 技术

        传统的 IP 地址分类方案是一种划分网络号和主机号的方案,把所有 IP 地址分为五类。

         A 类 0.0.0.0 到 127.255.255.255

        B 类 128.0.0.0 到 191.255.255.255

        C 类 192.0.0.0 到 223.255.255.255

        D 类 224.0.0.0 到 239.255.255.255

        E 类 240.0.0.0 到 247.255.255.255

        IP 地址在全球范围中是唯一的,上述的 IP 分类的本质就是规定一个 IP 地址多少位为网络号,多少位为主机号。但是这种方案有其局限性。

        例如申请一个 B 类地址(网络号相同的子网)子网,其在该子网中可以允许有 65000+(16位主机号) 台主机,A 类地址的子网内允许存在的主机数量会更多。

        但是在实际的网络架设中,不会存在一个子网内有这么多的情况,因此,一个子网中有大量的 IP 地址被浪费。

        针对这种情况提出了新的划分方案,叫做 CIDR(Classless Inter-Domain Routing,无类域间路由)。

        CIDR 是通过可变长度的子网掩码(VLSM)实现 IP 地址的灵活分配,并支持路由聚合(Route Aggregation)减少路由表条目。

        用 “IP 地址 / 掩码长度”(如 192.168.1.0 /24)表示 IP 地址,掩码长度 n 表示该 IP 地址的前 n 位为网络号,后面的位为主机号。CIDR 支持任意长度的子网掩码(1 ~ 31位),灵活配置不同规模的网络。

        如上图例 1 所示,IP 地址为 140.252.20.68,子网掩码为 255.255.255.0,那么将 IP 地址和子网掩码进行与运算,得到的结果就是网络号(网络号的长度和子网掩码一样)140.252.20.0,则该子网的网络地址为 140.252.20.0 ~ 140.252.20.255,该返回的 IP 地址都表示是该子网中的主机,该子网的网络规模就是 254(第一个和最后一个有特殊用途) 台主机。 

        如例 2 所示,子网掩码为 140.252.20.240,用 16进制表示就是 FF FF FF F0,则用前 28 位作为网络号,则该子网的规模就是 14 台主机。

2.3 特殊的 IP 地址

        将 IP 地址中的主机地址全部设为 0,就成为了网络号,代表该局域网(子网)。

        将 IP 地址中的主机地址全部设为 1,就成为了广布地址,用于给同一个链路(子网)中相互连接的所有主机发送数据包。

        127.* 的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1。

2.4 IP 地址的数量限制

        IP 地址(IPv4)是一个 4 字节 32 的正整数。那么可以表示的 IP 地址大约 43 亿,而 TCP/IP 协议规定,每个主机都需要一个 IP 地址。那么全球一共最多只能有 43 亿的设备接入网络吗?答案是否定的。

        CIDR 技术只是提高了 IP 地址的利用率(减少 IP 地址的浪费),并没有对 IP 地址的绝对数量进行增加,所以 IP 地址对于现在的网络环境来说是不够用的,那么就诞生了三种方法来解决。

        (1)动态分配 IP 地址:只给接入网络的设备分配 IP 地址,因此同一个 MAC 地址的设备,每次接入互联网中得到的 IP 地址不一定是相同的。

        (2)NAT(Net Address Translation,网络地址转换) 技术:后续进行介绍。

        (3)IPv6:IPv6 并不是 IPv4 的升级版,这是两个互不相干的协议,彼此不兼容,IPv6 用 16 个字节 128 位来表示一个 IP 地址,但是目前 IPv6还没有普及。

2.5 私有 IP 和公网 IP

        如果一个组织(公司、学校等)组建局域网,IP 地址只用于局域网内的通信,而不是直接连到公网上,理论上使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP地址只能是以下三种:
        (1)10.*:前 8 位是网络号,共 16,777,216 个地址。

        (2)172.16.* 到 172.31.*:前 12 位是网络号,共 1,048,576 个地址。

        (3)192.168.*:前 16 位是网络号,共 65536 个地址。

        在上述范围中的 IP 地址都称为私有 IP,其余的都为公网 IP所以在全球范围中,IP 地址分为两个部分,一部分为私有 IP,一部分为 公网 IP,私有 IP 可以重复,公网 IP 不可以重复

        如上图所示,全球的网络就是由一个一个子网嵌套式的组成在一起,最后通过一个路由器连入广域网中(公网)。

        路由器有两个主要的功能,一是进行地址转换,二是构建子网

        一个路由器可以配置两个 IP 地址,一个是 LAN 口 IP(子网 IP),一个是 WAN 口 IP(上级网络 IP)。 

        一般家用的主机,都是通过网线连在路由器的 LAN 口上,这表示这个主机属于该路由器构建的子网当中。

        在路由器构建的子网当中,路由器的子网 IP 通常都是 192.168.1.1,子网内的主机 IP 地址不能重复,且网络号都为 192.168.0.0。但是不在同一子网的主机 IP 地址可以重复。

        每一个路由器在网络中叫做一个节点,运营商就可以将这些节点分成很多层级,最外层的路由器叫做进出口路由器,WAN 口 IP 就是一个公网 IP

        子网内的主机需要和外部网络进行通信时,路由器将 IP 协议首部中 IP 地址进行替换(将 LAN 口 IP 替换为 WAN 口 IP),这样逐级替换,最终内网发出的数据包中的 IP 地址就被替换成了一个公网 IP ,这种技术成为 NAT(网络地址转换)

        如果想要将自己实现的服务器程序在公网上被访问到,就需要把服务器程序部署在一台具有 公网 IP 的服务器上,这样的服务器可以在阿里云/华为云等云服务器厂商进行购买。

3. 路由

        路由:网络设备(路由器等)根据数据包的目标 IP 地址,查询路由表并选择最优路径转发数据的过程。其本质时解决数据包从哪来到哪去的路径规划问题。

        如上图,路由的过程就是一跳一跳问路的过程,所谓的“一跳”具体就是在以太网中从源 MAC 地址到目的 MAC 地址之间的数据帧传输区间。 

        当一个数据帧到达路由器时,路由器会对其进行解包,提取其中的 IP 数据包,路由器先查看目的 IP,判断该数据包时直接发给子网中的目标主机,还是发给子网外的主机。如果是发送给子网外的主机时,路由器替换其中的源 IP 地址,然后封装成数据帧发送给外部网络

        路由表可以使用 route 命令查看。

        如上图,这台主机有两个网络接口,一个网络接口连接到 192.168.10.0/24 网络,另一个网络接口连接到 192.168.56.0/24 网络。

        Destination 是目的网络地址,Genmask 是子网掩码,Getway 是下一条地址, Iface 是发送接口。U 标志表示此条目有效,G 标志标识此条目的下一跳是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经过路由器转发。

        (1)转发过程例1:发送的数据包的目的地址是 192.168.56.3

        将目的 IP 依次从上到下与子网掩码进行运算。跟第一行子网掩码运算得到 192.168.56.0,与第一行的目的网络地址不符合,再跟第二行子网掩码运算得到 192.168.56.0,和第二行的目的网络相符,因此数据包从 eth1 接口发送出去。由于 192.168.56.0/24 网络通过 eth1 接口与主机直接相连,因此可以直接发送到目的主机,不需要路由器转发。

        (2)转发过程例2:发送的数据报的目的地址是 202.10.1.2

        依旧将目的 IP 从上到下与子网掩码运算之后与目的网络进行匹配,这时发现与前 3 个条目都不符合,就按缺省条目(default)从 eth0 接口发出去,发往 192.168.10.1(构建 192.168.10.0/24 子网的路由器),然后由 IP 地址为 192.168.10.1 路由器根据它的路由表决定下一跳地址。

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

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

相关文章

【案例分享】KMDA-7611-S001--高性能嵌入式电脑助力双臂轮式人形机器人应用

智能制造时代,双臂轮式机器人需求浮出水面 随着制造业、物流业和电子商务的飞速发展,智能搬运机器人正成为行业降本增效的核心工具。它们不仅解决了传统物流中效率低、成本高、安全性差等痛点,更通过智能化与可扩展性设计,通过自主…

iOS App上线前的安全防线:项目后期如何用Ipa Guard与其他工具完成高效混淆部署

对大多数iOS开发者来说,安全并不是开发早期就能解决的问题。尤其在项目逐步进入上线准备阶段后,才开始集中考虑逆向破解、资源泄露等安全隐患的解决方案。这个阶段往往时间紧张、结构复杂,再要重构源码或引入大规模修改几乎不现实。因此&…

技术佃农时代:当云计算成为新型地主经济

技术佃农时代:当云计算成为新型地主经济 导语:当算力成为生产资料,云账单背后的「数字佃租」正悄然重塑IT生产关系——我们是否在用自己的代码为云厂商开垦数字荒地? 一、揭开云计算的「佃租算法」面纱 // 云经济体的核心收割逻辑 public class CloudLandlord {public sta…

23种设计模式图解

《设计模式:可复用面向对象软件的基础》是软件工程领域的经典著作,由四位顶尖专家(Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides,合称GoF)编写,首次系统化提出了23种设计模式,分为…

git新建一个分支到gitlab项目目录中

先向git确认身份 git config --global user.email "youexample.com"看一下当前在哪个分支上(没啥影响) git status lculation$ git status 位于分支 my_new_branch 您的分支与上游分支 origin/main 一致。 用origin/main分支来新建一个分支 …

云原生时代配置中心全景解读:从Spring Cloud Config到Nacos深度实践

摘要:在分布式系统和云原生架构中,配置管理已从简单的键值存储演进为核心基础设施组件。本文深入解析四大主流配置中心(Spring Cloud Config、Apollo、Nacos、Consul)的架构设计与实战应用,并分享生产环境下的最佳实践…

Vue3 defineModel 原理解析

1. 引言 在上一篇文章中探讨了v-model的实现原理🔗。本文将聚焦于Vue3.4版本新增的defineModel语法糖,它显著简化了组件中v-model的实现方式。我们将详细解析defineModel的工作原理,并与3.4版本之前实现组件v-model的方法进行对比。 2. Vue…

GRPO训练布局感知的强化学习多模态文档解析框架-Infinity-Parser

前期《文档智能》专栏详细中介绍了文档智能解析详细pipline链路技术方案,如下图: 现在来看一个新思路,指出pipline链路依赖大量标注数据、并且会出现错误传播问题,导致解析效果不佳,故提出一个基于布局强化学习&…

【超详细】讯飞智能车PC电脑烧录指南(高级系统部署与恢复)

本指南旨在详细指导您如何使用PC电脑上的瑞芯微开发工具,对讯飞智能车进行固件烧录、分区镜像烧写和设备擦除等高级操作。这些操作通常用于系统出现严重问题、需要全新部署固件或进行底层恢复时。 一、所需设备与工具 在开始操作之前,请确保您准备好以…

【亲测可用】html+css3+ajax+php文件夹拖放上传系统(保持文件结构上传)

文件夹拖放上传系统&#xff08;保持文件结构&#xff09; 下面是一个完整的HTML5CSS3AJAXPHP实现&#xff0c;支持拖放文件夹上传并保持原有文件结构的解决方案。 前端部分 (index.html) <!DOCTYPE html> <html lang"zh-CN"> <head><meta c…

什么是数据清洗?数据清洗有哪些步骤?

目录 一、数据清洗的定义和重要性 1. 数据清洗的定义 2. 数据清洗的重要性 二、数据清洗的前期准备 1. 明确清洗目标 2. 了解数据来源和背景 3. 制定清洗计划 三、数据清洗的具体步骤 1. 数据审计 2. 处理缺失值 3. 处理重复值 4. 处理异常值 5. 数据标准化 6. 数…

Vue3+TypeScript中v-bind()的原理与用法

在 Vue 3 的单文件组件&#xff08;SFC&#xff09;中&#xff0c;v-bind() 用于在 <style> 块中动态绑定 CSS 值到组件的响应式数据&#xff0c;实现了状态驱动样式的能力。下面详细讲解其原理和用法&#xff1a; 一、核心原理 CSS 变量注入 Vue 编译器会将 v-bind() 转…

2 geotools入门示例

1. 设置 Spring Boot 项目并集成 GeoTools 依赖 首先&#xff0c;你需要创建一个新的 Spring Boot 项目。你可以使用 Spring Initializr 来快速生成项目骨架。 选择以下依赖&#xff1a; Web: Spring Web (用于创建 REST API)Developer Tools: Spring Boot DevTools (可选&a…

深度解析String不可变性:从Java底层到设计哲学

一、String不可变性的直观理解 在Java中,String对象一旦创建,其内容就不可更改。任何看似"修改"String的操作,实际上都是创建了一个全新的String对象。这种设计是Java语言基础架构的重要部分,理解其底层原理对编写高效、安全的Java程序至关重要。 String str =…

C++并发编程-2.C++ 线程管控

参考&#xff1a;https://llfc.club/category?catid225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2Tuk4RfvfBC788LlqnQrWiPiEGW 1. 简历 本节介绍C线程管控&#xff0c;包括移交线程的归属权&#xff0c;线程并发数量控制以及获取线程id等基本操作。 2. 线程归属权 比如下面&#xff…

Qt面试常问

1.QT信号与槽的底层原理&#xff1f; 底层通过元对象系统和事件循环完成的&#xff0c;能够在运行期间动态处理信号槽之间的连接与断开&#xff0c;而不是像函数调用那样在编译期间就完全确定了。元对象系统包含&#xff1a;QObject类、Q_OBJECT宏定义、moc编译器当发送一个信…

【git】错误

【成功解决】开代理 unable to access ‘https://github.com/laigeoffer/pmhub.git/’: Recv failure: Connection was reset

什么是状态机?状态机入门

状态机&#xff1a;优雅管理复杂逻辑的Python实践 在软件开发中&#xff0c;状态机&#xff08;Finite State Machine, FSM&#xff09; 是管理多状态转换的利器。它将行为分解为离散的状态、事件和转移规则&#xff0c;大幅提升代码的可读性与可维护性。本文通过Python示例解析…

【Python打卡Day41】简单CNN@浙大疏锦行

可以看到即使在深度神经网络情况下&#xff0c;准确率仍旧较差&#xff0c;这是因为特征没有被有效提取----真正重要的是特征的提取和加工过程。MLP把所有的像素全部展平了&#xff08;这是全局的信息&#xff09;&#xff0c;无法布置到局部的信息&#xff0c;所以引入了卷积神…

MySQL中InnoDB存储引擎底层原理与MySQL日志机制深入解析

MySQL的内部组件结构如下&#xff1a; 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、…