网络层协议 —— IP协议

news2024/12/28 22:31:08

目录

0.前言

1.IP协议的格式

2.IP地址

2.1IP地址的划分

国际间IP地址的划分

公有IP

私有IP

特殊的IP地址

国内IP地址的划分

2.2IP地址不足问题

2.3IP地址的功能

2.4如何使用IP地址

2.5IP地址的构成

3.网段划分

以前的方案

现在的方案

4.认识宏观网络

5.路由

路由器

路由表

NAT技术

路由的过程

6.总结


0.前言

对于网络层IP协议的学习,我们不能局限于IP协议本身,而应通过学习IP协议建立对整个网络的宏观认识。

1.IP协议的格式

咱们先认识认识IP协议的格式:

各字段的简单说明:

4 位版本号:表明了IP协议的版本,对于 IPv4 来说,就是 4。

4 位首部长度:表明了IP协议报头的总长度。

  • 需要注意的是,首部长度只有四个比特位,能表示的最大值是15,但是协议报头中的固定长度都有20个字节,所以4位首部长度需要带上基本单位 —— 4字节。
  • 这样一来,4位首部长度能表示的最大值就是60字节了。

8 位服务类型:其中有3 位优先权字段(已经弃用),4 位 TOS 字段,和1 位保留字段(必须置为 0)。

  • 4 位 TOS 分别表示最小延时、最大吞吐量、最高可靠性、最小成本。这四者相互冲突, 只能选择一个。
  • 对于 ssh、telnet 这样的应用程序,最小延时比较重要,对于 ftp 这样的程序, 最大吞吐量比较重要。

16 位总长度:表明IP报文的总长度。

  • 包括报头和数据。

16 位标识:唯一的标识主机发送的报文。

  • 如果 IP 报文在数据链路层被分片了,那么每一个片里面的这个 id 都是相同的。

3 位标志字段:

  • 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到)。
  • 第二位置为 1 表示禁止分片,这时候如果报文长度超过 MTU(数据链路层所能传输的最大数据单元),IP 模块就会丢弃报文。
  • 第三位表示"更多分片",如果分片了的话,最后一个分片置为 0,其他是 1。类似于一个结束标记。

13 位分片偏移:表明分片相对于原始 IP 报文开始处的偏移。

  • 其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值除8
    得到的。
  • 因此,除了最后一个报文之外,其他报文的长度必须是 8 的整数倍(否则报文就不连续了)。

8 位生存时间:数据报到达目的地的最大报文跳数

  • 一般是64。每次经过一个路由,该值就会减1,如果报文中该值一直减到 0 还没到达,那么该报文就会被丢弃。
  • 这个字段主要是用来防止出现路由循环

8 位协议: 表示上层协议的类型。

  • IP协议根据8位协议表明将数据交给上层的哪个协议。

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

32 位源地址和 32 位目标地址: 表示发送端和接收端。

选项:用于表明一些特殊用途(不细谈哈)。

2.IP地址

在IP协议的报头中,我们可以很清楚的看到两个字段 —— 32位源IP地址和32位目的IP地址。可以说这两个字段是IP协议中最重要的两个字段了,需要重点学习。

2.1IP地址的划分

国际间IP地址的划分

公有IP

进行IP地址的划分首先要分配给各个国家,各个国家分配到的IP地址在国家之间使用。这些IP地址称为公有IP地址。通常是一段区间。

私有IP

如果一个组织内部组建局域网,需要使用私有IP地址,私有IP 地址只能用于局域网内的通信,而不直接连到因特网上。理论上 使用任意的 IP 地址都可以,但是 RFC 1918 规定了用于组建局域网的私有 IP 地址只能使用一下几种

  • 10.*:前 8 位是网络号,共 16,777,216 个地址。
  • 172.16.*172.31.*:前 12 位是网络号,共 1,048,576 个地址。
  • 192.168.*:前 16 位是网络号,共 65,536 个地址 

包含在这个范围中的,都称为私有 IP,其余的则称为全局 IP(或公网 IP)。

如果把IP地址比作一块大蛋糕的话,其中一部分被单独拿出去用于组件局域网了,剩下的才能被分配给各个地区和组织。 

特殊的IP地址
  • 将 IP 地址中的主机地址全部设为 0,就成为了网络号,代表这个局域网。
  • 将 IP 地址中的主机地址全部设为 1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包。
  • 127.*的 IP 地址用于本机环回(loop back)测试,通常是 127.0.0.1。

国内IP地址的划分

当我们国家从国际上分配到了一定区间的IP地址之后,需要分配给国内的各个地区和组织使用,下图为部分地区和组织分配到的IP地址。

2.2IP地址不足问题

我们都知道IP地址是32个比特位构成的数字,32个比特位所能表示数字大约是43亿个左右,而 TCP/IP 协议规定,每个主机都需要有一个 IP 地址,那是不是意味着世界上只有43亿台设备能够接入网络?实际上,由于一些特殊的 IP 地址的存在,数量远不足 43 亿。另外 IP 地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个 IP 地址。这也就必然导致IP地址不足的问题。

这时候有三种方式来解决:

  • 动态分配 IP 地址:只给接入网络的设备分配 IP 地址。因此同一个 MAC 地址的设备,每次接入互联网中,得到的 IP 地址不一定是相同的。
  • NAT 技术(后面谈)。
  • IPv6:IPv6 并不是 IPv4 的简单升级版。这是互不相干的两个协议,彼此并不兼容。IPv6 用 16 字节 128 位来表示一个 IP 地址,但是目前 IPv6 还没有普及。

2.3IP地址的功能

在我们的日常生活中,如果你想给你的朋友写信,你必须要知道并填写朋友的地址,只有这样,邮局在派发信件的时候才能有目的地进行派发,才能确保信件准确的送到朋友的手上。当然了,你写信的时候也需要表明自己的地址,只有这样,朋友才知道是谁给他发的信,未来,朋友想要回信的时候,才能填充你的地址。

在网络通信的世界中,信息的发送亦是如此。当两台主机需要通信的时候,发送方必须表明自己的地址和接收方的地址,只有这样才能确保信息发送到指定的主机上,接收方的主机才知道信息是哪台主机发给他的,才能进行准确的响应。这个地址就是IP地址。

所以IP地址的功能就是用来进行主机定位

2.4如何使用IP地址

问题来了,网络通信的过程中,发送方应该如何表明接收方的地址呢?

举个栗子:

当我们想要通过浏览器访问CSDN的时候,需要输入www.csdn.net,这时候浏览器就会将该域名解析为csdn服务端程序所在主机的IP地址和端口,假设是123.132.212.231:80,这时候我们不就表明了我们想要访问那一台主机上的哪一个服务了吗?也就是说,对方的地址我们是提前知道的。

从代码角度理解:

当我们使用socket编程接口编写客户端网络通信程序的时候,是不是要先填充一个叫做  struct sockaddr_in的结构体对象,该类型的对象中有一个sin_addr.s_addr的成员,其实这个成员的值就是目标主机的IP地址。

所以我们可以这样理解,当我们填充该成员的时候,其实就是在填充IP协议的32位目的IP,具体细节由操作系统自动完成了

说明一下:对于32位源IP地址的填充是属于通信的细节,对于通信的细节,操作系统为自动为我们实现,也就是说,32为源IP地址的填充是由操作系统自动完成的

2.5IP地址的构成

IP地址可以分为两个部分:网络号和主机号。

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

不同的子网其实就是把网络号相同的主机放到一起。
如果在子网中新增一台主机,则这台主机的网络号和这个子网的网络号必须一致,但是主机号绝对不能和子网中的其他主机重复 。

也就是说,网络号用来标识不同的子网,主机号用来标识不同的主机,网络号+主机号就可以标识一个子网中的一台主机

所以我们现在知道了,通过合理设置主机号和网络号,就可以保证在相互连接的网络中,每台主机的 IP 地址都不相同,才能保证数据准确的发送到指定的主机上。那么问题来了,如何管理子网内的IP地址呢?

  •  有一种技术叫做 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),能够自动的给子网内新增主机节点分配 IP 地址,避免了手动管理 IP 的不便。
  • 一般的路由器都带有 DHCP 功能,因此路由器也可以看做一个 DHCP 服务器。

3.网段划分

我们已经知道了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

随着 因特网 的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请 B 类网络地址, 导致 B 类地址很快就分配完了,而 A 类却浪费了大量地址。

例如,申请了一个 B 类地址,理论上一个子网内能允许 6 万 5 千多个主机,A 类地址的子网内的主机数更多。然而实际网络架设中,不会存在一个子网内有这么多的情况。因此大量的 IP 地址都被浪费掉了。

现在的方案

于是,针对上述情况提出了新的划分方案,称为 CIDR(Classless Interdomain Routing)。

  • 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号。
  • 子网掩码也是一个 32 位的正整数,通常用一串 "0" 来结尾。
  • 将 IP 地址和子网掩码进行 "按位与" 操作,得到的结果就是网络号。
  • 因此,网络号和主机号的划分与这个 IP 地址是 A 类、B 类还是 C 类无关。

举个例子:

可见,IP 地址与子网掩码做与运算可以得到网络号,主机号从全 0 到全 1 就是子网的地址范围。

IP地址和子网掩码还有一种更简洁的表示方法,例如 140.252.20.68/24,表示 IP 地址为
140.252.20.68,子网掩码的高 24 位是 1,也就是 255.255.255.0。

4.认识宏观网络

说明一下:网络的建设其实是运营商精心设计好的。运营商在设计上需要划分出一个个的子网。在行动上需要挖地道、铺光纤、甚至还需要帮你拉网线。

我们可以这样理解下面这张图:

最小的网络我们可以看做是家里的网络,同一网段下的主机之间是可以直接通信的,但是,要想和其他子网中的主机通信就需要通过路由器了,这里的路由器我们称之为家庭路由器。所以,路由器可以横跨两个网络。家庭路由器可以和家庭路由器连接,也可以和更大的主机(提供服务的主机)连接,此时它们之间就构成了更大的子网,更大的子网之间需要进行通信,需要通过功能更强大的运营商路由器进行连接。这些功能更强大的路由器连接的可能是市和市之间的网络,市和市之间的网络通过市间路由器连接又共同组成了省级别的网络,省级别的网络又通过省间路由器进行连接便构成了整个国家的网络,国家和国家之间的网络通过国际路由器进行连接便构成了全球的网络。

所以,网络通信的世界其实是由一个个的子网构成的。不同的子网之间通过路由器连接,路由器之间又可以构成更大的子网。当子网上升到一定程度就变成了公网。

所以不同子网的主机进行通信的时候,需要通过路由器进行路由转发,将信息送到指定的主机上。

5.路由

路由器

数据路由的过程需要依靠路由器来完成,路由器的主要工作是完成不同网络中数据的转发。

• 一个路由器需要横跨两个网络,所以需要配置两个 IP 地址,一个是 WAN 口 IP,一个是 LAN 口 IP(子网IP)。

• 路由器 LAN 口连接的主机,都从属于当前这个路由器的子网中。

• 不同的路由器,子网 IP 其实都是一样的(通常都是 192.168.1.1)。子网内的主机IP地址不能重复。但是子网之间的 IP 地址就可以重复了。

• 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点。这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN 口 IP 就是一个公网 IP 了。

路由表

路由器内部都会维护一个路由表,用来记录与该路由器相连的通信设备。

Destination:表示目的网络地址。

Genmask:表示子网掩码。

Gateway:表示下一跳的地址。

Iface:表示发送接口。

Flags:中的 U 标志表示此条目有效(可以禁用某些条目)。

G标志:表示此条目的下一跳地址是某个路由器的地址,没有 G 标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

NAT技术

子网内的主机需要和外网进行通信时,路由器将 IP 首部中的源IP地址进行替换,替换成 WAN 口 IP,这样逐级替换,最终数据包中的 源IP 地址成为一个公网 IP。这种技术称为 NAT(Network Address Translation,网络地址转换)。

通过NAT技术,局域网中的IP地址不会出现在公网上,也就是说,不同局域网中的IP地址可以重复,这样也就变相的增加了IP地址的数量。

注意:不同局域网中的IP地址可以重复,那么IP地址就不能唯一的标识全网中的一台主机,准确的说,应该是私有IP不能唯一的标识一台主机,但是公网IP是可以的。

路由的过程

所谓路由的过程其实就是发送方发送的数据在网络中发往目标主机的过程。

假如主机A需要向主机B发送消息,首先主机A会拿着自己的子网掩码和目的IP做按位与运算,发现目的IP的网络号不是自己所在的网络,于是将报文交给路由器,由路由器决定将该报文发给谁。

路由器怎么知道将数据发给谁呢?

这个时候,路由器就会查自己的路由表。具体就是,拿着目标IP地址和路由表中记录的子网掩码进行按位与操作,如果得到的网络号为该子网掩码对应的IP地址,就将报文转发给下一跳地址所对应的设备。如果查询完所有的子网掩码都没有找到对应的目标网络,则发送给缺省路由器,缺省路由器根据他自己的路由表决定数据发给谁,循环往复,直到数据交给目标主机。

在发送数据的过程中,路由器进行数据的转发的时候,会进行NAT转换技术,也就是将报文中的源IP地址更换成自己的WAN口IP。

整个路由的过程类似于问路的过程,报文不断的向路由器询问,我下一站怎么走,路由器就告诉他怎么走。

6.总结

不同主机进行网络通信时,需要能够找到对方,网络层的IP协议便提供了这种能力,主要依靠IP地址。

网络的世界是由一个个的子网组成的,子网是由一台台通信设备组成的,所以IP地址需要有能力标识不同的子网和子网中的主机,所以IP地址具有网络号和主机号。

为了划分IP地址的网络号和主机号,人们引入子网掩码,通过IP地址和子网掩码进行按位与操作,得到网络号,从而决定将数据发送给哪个网络,当然,这个过程是通过主机 or 路由器中的路由表来完成的。

对于子网的构建,IP地址中专门划分出了一批私有IP用来组建局域网,不同的局域网中的IP地址可以相同,这样就提高了IP地址数量的上限,解决了IP地址不足的问题,但是私有IP不能出现在公网上,这个时候就需要引入NAT技术进行路由转发时的地址替换。如果只是使用部分IP地址专门用来组建局域网,但是不提供NAT技术的话,IP地址不足的问题无法依旧无法解决。

数据路由的过程需要依靠路由器,路由器通过查找路由表决定数据应该交给谁,同时使用NAT技术避免私有IP出现在公网上。

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

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

相关文章

MySQL篇(事务 - 基础)

目录 一、简介 二、事务操作 1. 数据准备 2. 未控制事务 2.1. 测试正常情况 2.2. 测试异常情况 3. 控制事务 3.1. 控制事务一 查看/设置事务提交方式 提交事务 回滚事务 3.2. 控制事务二 开启事务 提交事务 回滚事务 3.3. 转账案例 四、事务的好处 五、事务四…

入门数据结构JAVA DS——二叉树的介绍 (构建,性质,基本操作等) (1)

前言 二叉树的概念和性质 二叉树的基本概念 二叉树的种类 二叉树的性质 二叉树的构建存储与遍历 存储 构建 遍历 前序遍历 后序遍历 中序遍历 层序遍历 二叉树的基本操作 获取树中结点个数 获取叶子结点个数 获取第K层结点的个数 获取二叉树的高度 检测值为v…

C++ —— vector 的模拟实现

目录 前言 1. vector深度剖析 2. 基础框架 3. 核心接口 3.1 reserve 3.2 push_back 和 pop_back 3.3 print 3.4 insert 3.5 erase 3.6 resize 4. 拷贝构造 4.1 构造与析构 4.2 拷贝构造 4.3 赋值重载 4.4 迭代器区间 5. 使用memcpy拷贝问题 前言 接:C —— 关于…

FX5 CPU模块和以太网模块的以太网通信功能

FX5 CPU模块和以太网模块的以太网通信功能的概要如下所示。 CPU模块的内置以太网端口的通信规格如下所示。 1、与MELSOFT的直接连接 不使用集线器,用1根以太网电缆直接连接以太网搭载模块与工程工具(GX Torks3)。无需设定IP地址,仅连接目标指定即可进行…

学习Java(一)类和对象

package demo.ceshi;public class Puppy {private int age;private String name;//构造器public Puppy( String name){this.name name;System.out.println("公主的名字叫:"name);}//设置age的值public void setAge(int age){this.age age;System.out.pr…

数值计算 --- 平方根倒数快速算法(中)

平方根倒数快速算法 --- 向Greg Walsh致敬! 1,平方根倒数快速算法是如何选择初值的?WTF中的神秘数字究竟是怎么来的? 花开两朵,各表一枝。在前面的介绍中,我们已经知道了这段代码的作者在函数的最后使用了NR-iteratio…

CVE-2024-46103

前言 CVE-2024-46103 SEMCMS的sql漏洞。 漏洞简介 SEMCMS v4.8中,SEMCMS_Images.php的search参数,以及SEMCMS_Products.php的search参数,存在sql注入漏洞。 (这个之前就有两个sql的cve,这次属于是捡漏了&#x1f6…

【MATLAB源码-第268期】基于simulink的永磁同步电机PMSM双闭环矢量控制系统SVPWM仿真,输出转速响应曲线。

操作环境: MATLAB 2022a 1、算法描述 永磁同步电机(PMSM)是目前工业领域中广泛使用的一种高效电机,其具有高功率密度、运行效率高、动态响应快等优点。在控制永磁同步电机时,通常采用矢量控制(也称为磁场…

新160个crackme - 060-snake

运行分析 需破解Name和Serial PE分析 32位,未知程序和壳 点击Scan/t按钮外部扫描,发现是C程序 静态分析&动态调试 ida搜索关键字符串,双击进入 发现无法反编译 选中该函数(地址:401048 - 401172)Edit -…

认识结构体

目录 一.结构体类型的声明 1.结构的声明 2.定义结构体变量 3.结构体变量初始化 4.结构体的特殊声明 二.结构体对齐(重点难点) 1.结构体对齐规则 2.结构体对齐练习 (一)简单结构体对齐 (二)嵌套结构体对齐 3.为什么存在内存对齐 4.修改默认对齐数 三.结构体传参 1…

PMP--二模--解题--51-60

文章目录 14.敏捷--术语表--完成的定义DoD--它是团队需要满足的所有标准的核对单,只有可交付成果满足该核对单才能视为准备就绪可供客户使用。51、 [单选] 在冲刺计划会议上,Scrum主管重申,如果在冲刺结束时敏捷项目团队正在构建的产品增量没…

五种IO模型和阻塞IO

文章目录 五种 IO 模型和阻塞 IO1、五种 IO 模型1.1、阻塞 IO1.2、非阻塞 IO1.3、信号驱动 IO1.4、IO 多路转接1.5、异步 IO1.6、总结 2、高级 IO 概念2.1、同步通信(synchronous communication)和异步通信(asynchronous communication&#…

第十五章:使用html、css、js编程制作一个网页版的下雪场景动画

背景:这是一个充满诗意的下雪场景代码。打开网页时,雪花轻轻飘落,覆盖住你的屏幕,仿佛置身于冬日的夜空下。背景音乐《我期待的不是雪》缓缓响起,伴随着雪花的飘动,仿佛心中的那份爱与温柔悄然绽放。 雪花的飘落是梦境般的存在,每一片雪花都是轻盈的告白,旋转着从天际…

使用GitHub Actions自动发布electron多端安装程序

GitHub Actions 是一个强大的自动化工具,可以帮助开发者在 GitHub 仓库中自动化构建、测试和部署工作流程。我们的客户端就是使用github action来打包项目发布的。 以下是关于 GitHub Actions 自动化构建的一些关键点和步骤: GitHub Actions 的基本概念…

go注册中心Eureka,注册到线上和线下,都可以访问

go注册中心Eureka,注册到线上和线下,都可以访问 本地通过127访问, 线上通过内网ip访问 package mainimport ("github.com/SimonWang00/goeureka""github.com/gin-gonic/gin""wbGo/controller""wbGo/task…

【工具变量】地市环保法庭试点城市DID数据集(2005-2023年)

数据简介:环保法庭是中国司法体系中专门处理环境资源案件的审判机构,其主要职责包括审理涉及自然环境污染、矿产资源保护、自然资源环境开发等环境资源民事纠纷案件,对不服下级人民法院生效裁判的环境资源民事案件进行审查,以及对…

Java_Se--方法

方法就是一个代码片段. 类似于 C 语言中的 "函数"。方法存在的意义(不要背, 重在体会): 1. 是能够模块化的组织代码 ( 当代码规模比较复杂的时候 ). 2. 做到代码被重复使用 , 一份代码可以在多个位置使用 . 3. 让代码更好理解更简单 . 4. 直接调用现有方法开…

cv中每个patch的关联

在计算机视觉任务中,当图像被划分为多个小块(patches)时,每个 patch 的关联性可以通过不同的方法来计算。具体取决于使用的模型和任务,以下是一些常见的计算 patch 关联性的方法: 1. Vision Transformer (…

IDA Pro-代码结构识别

Lab06-01.exe分析 1.由main 函数调用的唯一子过程中发现的主要代码结构是什么? if语句结构 找到main函数中唯一调用的函数,并进入 判断网络是否链接成功,如果返回0走右边未连接成功 2.位于0x40105F的子过程是什么? 将字符串压栈,猜测…

双非本 985 硕士,秋招上岸字节算法岗!

最近已有不少大厂都在秋招宣讲了,也有一些在 Offer 发放阶段。 节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新人如何快速入门算法岗、如何准备面试攻略、面试常考点、大模型项目落地经验分享等热门话题进行了深入的讨论。…