【网络原理】IP协议的地址管理和路由选择

系列文章目录

【网络通信基础】网络中的常见基本概念

【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序(万字博文)

【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法)

【网络原理】TCP协议的相关机制(确认应答、超时重传)

【网络原理】TCP协议的连接管理机制(三次握手和四次挥手)


目录

系列文章目录

IP协议

1. IP协议的协议头格式(报文结构)

2. 地址管理

2.1 IP地址的数量限制 

a. 动态分配地址

b. NAT机制(网络地址转换)

c. IPv6 

2.2 网段划分

2.3 特殊的IP地址

3. 路由选择 


IP协议

网络这个模块中,已经介绍了传输层中的两个非常重要的协议,UDP协议和TCP协议。这次介绍网络层中最基础的协议——IP协议(以下出现的IP协议指的都是IPv4协议)。

TCP/IP协议族是一套整个网络体系最基础也是最核心的协议。IP协议作为TCP/IP协议族中的一部分,类似于TCP,IP协议也非常复杂。

作为后端开发的程序员,大概率会直接和TCP打交道,而IP协议是从事路由器、网关,防火墙等相关网络设备开发的人员更应该关注的,因此这里介绍的是IP协议比较基础的部分(后面的数据链路层也一样)主要从两方面进行介绍:

  1. 地址管理:分配和管理 IP 地址,确保每个设备在网络中具有唯一的标识。
  2. 路由选择:确定数据包从源到目的地所经过的路径。

1. IP协议的协议头格式(报文结构)

先认识IP协议的报头,再分别介绍地址管理和路由选择的内容。

基本结构如下: 

4位版本号: 标识IP协议的版本号,取值只有两种。在IPv4中,这个字段的值是4,IPv6中,则为6。

4位头部长度: 和TCP的类似,表示IP头部的长度,表示有多少个4字节。

8位服务类型: 用于指定数据包的优先级和处理方式,实际上只有4位有效。

  • 前3位是优先权字段,已被标记为弃用;接下来4位是服务类型字段,分别表示最小延迟、最大吞吐量、最高可靠性和最小成本,在同一时刻,只能选择这四种状态之一;最后一位是保留字段,必须置为0。

16位总长度: 表示整个IP数据包的总长度,包括头部和数据部分。

  • 看到这个字段,就想到和前面UDP一样有64KB的限制了,那如果构造一个非常大的TCP数据,IP是否就传输不了了?
  • 虽然IP自身确实有长度限制,但是IP提供了拆包和组包这样的功能。因此,即使数据很大,在IP这一层会自动拆成多个IP数据包,每个IP数据包来携带一部分数据。但是,其实IP数据包的拆包并不是因为达到64K,而是在数据链路层还有限制(后面再说)。
  • 拆包和组包,则和接下来的三个字段有关联。

16位标识:用于标识一个IP数据包及其片段。当一个大数据包被拆分成多个小数据包时,这些小数据包的16位标识都是相同的,这样接收端就可以根据这个标识将它们正确重组起来。

3位标志位:控制数据包的分片和重组。只有两位有效,其中1位标识这个包是否拆包了,还有一位表示最后一个拆的包的位置,即指示了结束位置。

13位片偏移:表示数据包片段在原数据包中的位置。这样,在接收端进行组包时,就可以根据这个位置顺序将小数据包正确重组起来,还原成原始的大数据包。

8位生存时间(TTL):指定数据包在网络中的最大存活时间,防止数据包无限制在网络中循环和传输。

  • 需要注意的是,此处的单位并不是真正的时间单位,而是一个整数,表示“次数”。
  • 每当一个数据包经过一个路由器或者节点时,TTL的值就会-1。如果TTL的值减到0了,那么该数据包就会被丢弃。
  • 比如,如果指定的接收方IP地址,是一个错误的IP地址,就不能让这个数据包无限循环和传输下去,找到一定程度还没找到,就应该丢弃了。TTL在操作系统中的设置值都有所不同,例如,Linux通常为64或255,Windows通常是128,Windows 98则为32。
  • 这些数值看起来都不大,实际上传输到地球的任何地方都够用了。因为路由转发的过程采用了高效的路由算法和路由表结构。通过Windows的一个命令 tracert,就可以看到当前网络通信的路径是怎样的。此处通过访问巴西政府官网来看当前网络通信的路径情况:

这里显示最多30个跃点跟踪,好像并没有访问到巴西政府官网,但是我们可以通过IP地址查询工具,看看每次到达哪个位置了。其中“请求超时”是因为有些设备关闭了“ICMP功能”,看不到详情,但是不影响tracert的执行。当看到延时较高可能就是已经出镜了,这里查询几个IP地址看看:

 可以看到,第12次就已经到美国了,第15次就到达巴西。

8位协议:指示数据包承载的传输层协议,如TCP、UDP等。

16位头部校验和:用于验证头部的完整性。这里只针对IP的头部进行校验,是因为封装的过程中,IP数据包的数据部分是TCP/UDP数据包,它们都自带了校验和。

32位源IP地址和32位目的IP地址:即表示发送方的IP地址,和接收方的IP地址。

可选字段: 长度可变,允许附加额外信息。

数据部分: 可变长度,包含传输的实际数据。 

2. 地址管理

IP地址(IPv4)本质上就是一个 32 位的整数,为了方便,就以点分十进制的方式表示。通过3个点,分成4个部分(十进制数)。每个部分 8 位,即一个字节,每个部分的取值范围是 0 到 255。

IP地址的存在,目的就是为了能够区分网络上的不同设备,希望每个网络设备都有唯一的一个IP地址。

但是,IPv4 地址的格式和长度(32位整数),就决定了其能够表示的唯一 IP 地址数量,即约为 42 亿个。

这个数字看起来很大,但是随着互联网的发展和普及,这个数量已经远远不够满足需求了,尤其是考虑到每个人都可能拥有多个设备连接到互联网。

IP地址不够用的问题,就显得十分严峻了。这一问题,早在互联网发展初期就被意识到,但在20世纪90年代末和21世纪初变得更加显著。解决这一问题也有了多种方案。

2.1 IP地址的数量限制 

a. 动态分配地址

考虑到全世界的设备,并不会同一时刻都在上网,管理机构就可以通过重新分配,和回收未使用的IPv4地址来延长IPv4地址池的使用寿命。

但是这只是权益之计,并不能根本上解决问题。

b. NAT机制(网络地址转换)

先把IP地址分成两个大类:

  1. 私网IP(局域网IP):IP地址以 10.*,172.16-172.31.*,192.168.*,这三类都是数据私网(局域网)地址,这些地址在局域网内部是唯一的。
  2. 公网IP(广域网IP):上述剩下的就都是公网IP了。公网IP则是在全球范围内都是唯一的。

由于上述设定,就有一些重要的限制:

  1. 公网设备访问公网设备,可以直接访问。
  2. 局域网设备访问同一个局域网的设备,也可以直接访问。
  3. 局域网设备访问不同局域网的设备,不允许直接访问。
  4. 局域网设备访问公网设备,需要对局域网设备的IP地址进行地址转换。
  5. 公网设备访问局域网设备,需要对公网IP地址进行地址转换

NAT机制的主要作用就是实现私有网络地址与公网地址之间的转换。

  • 当局域网内的设备需要访问Internet上的资源时,NAT机制会将私有IP地址转换为公网IP地址,以便设备能够与Internet上的其他设备进行通信。同时,当Internet上的设备访问局域网内的设备时,NAT机制也会将公网IP地址转换为私有IP地址,以确保数据能够正确地路由到目标设备。

NAT机制的实现通常依赖于路由器或NAT服务器等设备。

  • 这些设备会维护一个映射表,记录私有IP地址与公网IP地址之间的映射关系。当数据包从内网发送到外网时,路由器会修改数据包的源IP地址,将其替换为路由器的公网IP地址;当数据包从外网发送到内网时,路由器会根据映射表将目的IP地址转换为相应的私有IP地址。

总的来说,NAT机制通过地址转换和映射关系的建立,有效地解决了IP地址不足的问题。同时,NAT机制也增强了网络的安全性,因为外部设备无法直接访问内部网络的私有IP地址。

c. IPv6 

IPv6是用于替代IPv4的下一代IP地址,它从根本上解决了IPv4地址不足的问题。

  • IPv4 使用 4 个字节(32位)表示IP地址,能提供约为42亿9千万个IP地址.
  • IPv6 使用 16 个字节(128位)表示IP地址,能提供约340 亿亿亿亿个IP地址.

IPv6能为地球每一粒沙子提供IP地址,这句话已经很熟悉了,只要人类还在地球生存,IPv6是一定够用的。

尽管 IPv6 已经存在多年,但是 IPv4 仍然是互联网最广泛使用的协议,而 IPv6 要广泛应用还需要一些时间,原因主要有以下几个方面:

  1. 兼容性问题:IPv4和IPv6并不兼容(报头结构也存在区别),这意味着IPv6无法直接替换IPv4。因此,要想升级到IPv6则需要更换支持IPv6的设备。
  2. IPv6的设备和软件成本较高:IPv6的部署需要新的设备和软件,这些设备和软件的成本较高,对于大多数企业来说,是一个较大的阻碍。
  3. IPv4仍然可用:IPv4仍然是目前互联网的主要协议,因此,许多组织并没有足够的动力去升级到IPv6。

综上,就导致当前IPv6的推进节奏非常缓慢。尽管如此,我国对IPv6的普及率还是很高的。截至2023年5月,我国IPv6的活跃用户数量达到7.63亿,用户占比达到71.51%。

为了推动IPv6的普及和应用,我国政府出台了一系列政策和措施。例如,政府要求基础电信企业加快IPv6规模部署,提升IPv6网络服务质量,推动IPv6在各个领域的应用。此外,政府还鼓励企业加强IPv6技术创新和应用研发,推动IPv6产业链的发展。

这点还是很容易验证的,打开一些应用程序,如淘宝/支付宝等,它们的首页的最下面就会有一行小字:支持IPv6协议。

国家如此大力推动IPv6的发展,除了是为我国的互联网发展提供更好的基础和支持外,还有一部分政治原因,具体的原因,真诚建议大家一定一定去看看下面这个视频,里面也有大量介绍计算机网络相关的基础知识:

电子监听、全国断网,棱镜门背后,中国如何从末路狂奔到世界之巅icon-default.png?t=N7T8https://www.bilibili.com/video/BV1i14y157YV/?spm_id_from=333.337.search-card.all.click&vd_source=a3aa6ca18f9b64b%E2%80%A6

2.2 网段划分

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

  • 网络号:保证相互连接的两个网段具有不同的标识。
  • 主机号:同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号。

在同一个局域网内,网络号(前半部分)都是相同的,主机号(后半部分)都是不同的。

通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址都不相同。

但是手动配置IP地址,是一件相当麻烦的事。并且我们也能发现,我们从来没有手动配置过IP地址,但是仍然能够上网。

  • 这其实得益于一个技术,叫做DHCP,能够自动的帮我们配置局域网的IP地址。
  • 一般的路由器都带有DHCP功能,因此路由器也可以看做是一个DHCP服务器。

哪些部分是网络号,哪些部分是主机号,则是通过子网掩码的方式来区分的。

子网掩码和IP地址一样,也是一个32位的二进制数,子网掩码中,1表示对应的IP地址位是网络号,0表示对应的IP地址位是主机号。子网掩码总是前面一段全是1,后面一段全是0,不会出现1和0交替出现的情况。

例如,子网掩码为255.255.255.0,则表示前3个字节是网络号,后1个字节是主机号,这也是家用宽带默认的子网掩码。

注意几点: 

  • 在同一个局域网中,网络号一定是相同的,如果主机号相同,是无法上网的。
  • 如果该局域网的一个设备,网络号和路由器的网络号不相同,同样是无法上网的。
  • 两个相邻的局域网,网络号不能相同。原因是相邻的局域网如果使用相同的网络号,那么它们会被视为同一个网络,导致通信混乱和数据传输错误。

子网掩码是现在使用的网段划分方案,过去使用的网段划分方案则把所有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

随着互联网的飞速发展,这种划分方案的局限性也很快显现出来,大多数组织申请B类网络地址,导致B类地址很快就分配完了。

而A类地址的主机号有24位,就导致A类地址的局域网能容纳的设备数量约 2^32。实际上没有这么大的局域网,能包含这么多主机,因此大量的IP地址就都被浪费了。

针对这种情况,大佬们提出了新的划分方案,称为CIDR(Classless Interdomain Routing),也就是前面所说的通过子网掩码的方式进行网段划分。

2.3 特殊的IP地址

  • 127.* 的IP地址都是环回地址,用于本机环回测试,通常使用127.0.0.1。
  • IP地址的主机号(主机地址)为全0,表示“这个网段”,也就是该局域网。
  • IP地址的主机号(主机地址)为全1,表示“广播地址”,使用广播地址发送信息,局域网中的所有设备都会收到(必须使用UDP协议,TCP不支持广播)。

这里的主机号全1或者全0,指的是二进制比特位。例如最后一个字节表示主机号的情况,错误示例:192.168.0.111;正确示例:192.168.0.255。

除去这两种情况后,最后一个字节表示主机号,实际能分配的最多为254个。但是这里还有例外,很多路由器,在配置的时候,会有一个配置项,分配IP地址的范围,实际可用的主机号还会更少。

3. 路由选择 

路由选择:确定数据包从源到目的地所经过的路径(规划路线)。

网络结构非常复杂,每个路由器无法掌握全局的信息,会根据当前网络状态等进行路由选择。因此,路由器规划出来的线路,是一个“较优解”,并不是绝对最优解。

例如,使用现在的导航软件进行导航,导航软件会给出多种方案,在这种情况下,最优解也是取决于多种因素的:

  1. 最快路线:导航软件可能会提供一条被认为是最快的路线,根据实时交通状况和历史数据计算得出。然而,这条路线可能并不是最适合你的需求,因为它可能会经过拥堵区域或高速公路收费站。

  2. 最短路线:另一方面,导航软件可能会提供一条被认为是最短的路线,即使这条路线可能需要经过一些小路或者交通相对繁忙的地区。

  3. 景观路线:有时,导航软件可能会提供一条风景优美的路线,虽然它可能比其他路线慢一些,但能够为你提供更愉悦的驾驶体验。

IP数据包的传输过程和问路是类似的:

  • 当IP数据包,到达路由器时,路由器会先查看该数据包的目的IP;
  • 路由器判断这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器:
  • 依次反复,知道到达目的IP地址.

判定当前这个数据包要发送到哪里的依据,就是依靠每个路由器或交换机内部维护的一个路由表。这是路由器或交换机等网络设备上的一个重要的数据结构,它存储了网络中可达目的地的信息以及如何到达这些目的地的路由信息。

一个路由表通常包含:目的网络地址,下一跳地址,出跳口等内容。

路由表可以由网络管理员手动配置并维护(静态路由),也可以通过一些路由表生成算法自动生成(动态路由)

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

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

相关文章

LeetCode LCR 179. 和为s的两个数字

原题链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode) 题目的意思:通过给定的数组,找出两个值,相加并等于目标值。 第一种思路,暴力枚举,伪代码如下: for (…

关于智慧校园,你知道多少?

智慧校园是指运用现代信息技术,如物联网(IoT)、大数据、云计算、人工智能(AI)等,对传统校园进行智能化改造和升级,旨在创建一个高度集成、信息共享、服务全面的校园生态系统。智慧校园不仅仅是技…

python web开发开源规范

Hello , 大家好。首先在五一假期给所有劳动者创造者们送上祝福, 本文聊聊我对python web开源相关的规范 PEP 8 Python编程风格指南:PEP 8是Python编程的官方风格指南,提供了关于代码格式、命名规范、注释等方面的建议。遵循PEP 8可以使代码更易于阅读和…

Gateway结合Nacos使用!!!

一、本地结合使用 1. 引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> 2. bootstarp.yml配置文件 如果Nacos中配置使用yaml格式&…

Dockerfile部署LNMP

目录 一、项目模拟 1. 项目环境 2. 服务器环境 3. 任务需求 二、Linux系统基础镜像 三、Nginx 1. 建立工作目录 2. 编写Dockerfile脚本 3. 准备nginx.conf配置文件 4. 生成镜像 5. 创建自定义网络 6. 启动镜像容器 7. 验证nginx 四、Mysql 1. 建立工作目录 2. …

19 做好微服务间依赖的治理和分布式事务

在前两讲里&#xff0c;分别从微服务的对外接口、消息消费以及微服务自身的相关编码规范上阐述了“防备上游、做好自己”这两个准则如何落地。 在本讲里&#xff0c;将会讲解为什么要“怀疑下游”&#xff0c;以及有哪些手段可以落地此条准则。此外&#xff0c;还会介绍在进行…

基于springboot实现迪迈手机商城设计系统项目【项目源码+论文说明】

基于springboot实现迪迈手机商城设计系统演示 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。…

Java面试重点之反射机制

一、 反射是什么&#xff1f; 允许程序在运行时查询和操作对象的类型信息。通过反射&#xff0c;程序能够在运行时获取对象的类定义信息&#xff0c;如类的名称、方法、字段、注解等&#xff0c;并且可以动态地调用对象的方法或访问其字段&#xff0c;而无需在编译时具体知道对…

编写你的第一个 golang 的应用程序

进行你的第一个golang的程序 当你把程序都安装好以后 环境变量配置 好 vscode 插件下载好以后 1. 创建一个test.go 的文件 //主包&#xff0c;可执行文件所在包 package main//导入包 import "fmt"//主函数&#xff0c;入口函数 func main() { }2.解释 需要导入包 …

WPF之border标签边框控件、设置弧度、图片

border标签在WPF中承担着边框的角色又称之为边框标签&#xff0c;使用嵌套的方法去给一些标签添加边框&#xff0c;border标签包裹目标标签(border不能有多个子元素)。一般在给标签添加弧度时可以使用border。 常用属性 CornerRadius边框拐角的弧度&#xff0c;当宽高是一样的…

Alibaba Cloud Linux 3.2104 LTS 64位安装mysql 8.0报错

问题描述 Alibaba Cloud Linux 3.2104 LTS 64位安装mysql 8.0提示 Error&#xff1a; GPG check FAILED 问题原因 官方 MySQL 存储库的 GPG 密钥已过期&#xff0c;无法安装或更新 MySQL 包 mysql官网也提交了该bug&#xff1a; https://bugs.mysql.com/bug.php?id106188 …

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…

Pandas Series的运算原来这么简单

Series的运算主要包括加法、减法、乘法和除法等基本算术运算。这些运算通常是按照索引对应计算的&#xff0c;如果两个Series的索引不同&#xff0c;则结果中对应位置将填充为NaN&#xff08;空值&#xff09;。 需要注意的是&#xff0c;在进行Series运算时&#xff0c;需要确…

【linux】进程(深入理解linux进程状态)

开始之前先说一个与本文无关的小知识&#xff0c;chdir命令可以更改当前进程的工作目录哦。 目录 linux具体进程状态&#xff1a;R && S&#xff1a;T && t&#xff1a;D&#xff1a;僵尸进程 && 孤儿进程&#xff1a; OS的理论线&#xff1a;运行&…

讯饶科技 X2Modbus 敏感信息泄露

讯饶科技 X2Modbus 敏感信息泄露 文章目录 讯饶科技 X2Modbus 敏感信息泄露漏洞描述影响版本实现原理漏洞复现修复建议 漏洞描述 X2Modbus是一款功能很强大的协议转换网关&#xff0c; 这里的X代表各家不同 的通信协议&#xff0c;2是To的谐音表示转换&#xff0c;Modbus就是最…

Ps:应用智能锐化滤镜

智能锐化 Smart Sharpen滤镜具有“USM 锐化”滤镜所没有的锐化控制功能。不仅可以设置不同的锐化算法&#xff0c;还可以分别控制在阴影区域和高光区域中进行的锐化量。 ◆ ◆ ◆ 一般使用方法与步骤 1、根据模糊的原因选择“移去”算法&#xff0c;默认是“高斯模糊”。 2、…

制作场景资源的Prefab

制作骨骼模型的Prefab 现在游戏内的使用骨骼模型是通过老版的Animator去实现控制的&#xff0c;所以需要将模型切换为Animator 第一步&#xff0c;动画类型设置为Generic&#xff0c;创建Avatar 模型里面会有对应的Avatar文件 我们还需要一个Controller文件&#xff0c;用于…

Go 语言基础(二)【数组、切片、指针、map、struct】

1、数组 特别需要注意的是&#xff1a;在 Go 语言中&#xff0c;数组长度也是数组类型的一部分&#xff01;所以尽管元素类型相同但是长度不同的两个数组&#xff0c;它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

ArrayList知识点详解

目录 1.简介 2.ArrayList的使用 &#xff08;1&#xff09;如何实例化ArrayList&#xff1f;&#xff08;如何创建&#xff1f;&#xff09; &#xff08;2&#xff09;如何构造使用&#xff1f; &#xff08;3&#xff09;为什么ArrayList的无参构造可以添加数据 &#…

rust疑难杂症

rust疑难杂症解决 边碰到边记录&#xff0c;后续可能会逐步增加&#xff0c;备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁&#xff0c; 有时vscode中项目比较多&#xff0c;如果其中某些库应用有问题&…