网络层IP协议

IP协议介绍

TCP作为传输层控制协议,保证的是数据传输的可靠性和传输效率,但TCP提供的只是输出传输策略,负责数据传输的是网络层和链路层。进行网络通信时,发送的数据并不是直接从一方的传输层到另一方的传输层,需要向下传输,经过封装到网卡发送出去,对方网卡接收到信息向上处理,进行拆包操作得到数据。

网络层有能力将数据发送到对端,网络层不能保证数据是否成功送达,所以就需要有传输层来定制策略保证数据送到对端。

网络层解决了将数据从一台主机到另一台主机,数据进行网络传输一般是跨网络的,因此数据在进行跨网络传输时一定要经过多个路由器。

路由器就像方向标一样,到达一个路由器,就会找到最近一个能快速到达终点的路由器,然后一个一个的路由器跳转到达目的地。

确定数据路由的目的地后,数据就可以在网络中进行路由了,而数据在路由过程中无法进行路径选择,这个数据本身是无法自动找路的,是需要路由器来寻路的,而路由器是知道路的,路由器会把同一个子网中的所有路由器位置都记录了,路由器有进出口,可以接收并吐出,将数据带到一个有一个子网,数据会经过一个有一个"圈子"到达目的地。

主机和路由器

主机配有IP地址,但是不会进行路由

路由器有IP地址,也可以进行路由,现在的路由器具有应用层模块。

节点:主机和路由器统称

IP协议格式

4位版本号:指定IP协议版本,IPv4和IPv6。

4位首部长度:表示IP报头的长度,以4字节为单位

8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和一位保留字段(必须设置为0)。4为TOS字段表示了最小延时,最大吞吐量,最高可靠性,最小成本。这四个只能选择一个。

16位总长度:IP报文(报头+有效载荷)的总长度,用于将各个IP报文进行分离。

8位生存时间TTL:防止IP数据包在网络中无限循环,数据包可能在网络中不断的转发,导致拥塞和资源浪费,TTL限制了数据包的生存时间,确保数据包不会在路由器中反复转发

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

3位标志字段:第一位保留暂时没有使用,第二位表示进制分片,表示如果报文超过长度MTU,IP模块就会丢弃该报文。第三位表示更多分片,如果报文没有进行分片,则该字段设置为0,进行分片就设置为1,分片中排序最后的字段设置为0,其余都是1。

16位标识:唯一标识主机发送的报文,如果在网络层数据分片了,则每一个分片对应的16位标识一样。

13位偏移:分片相对于原始位置起点的偏移,表示当前分片在原数据中的偏移位置,这里偏移量的单位是一位八个字节,所以分片的长度必须是8字节的整数倍,因为片偏移的单位是8个字节,如果片长度不是8的整数倍,下一次分片时,偏移量就无法准确表示,如9个字节大小字节除于8还余一个字节,所以就要8倍才能准确表示偏移量,最后一个数据可以不是8的倍数,位于最后位置就需要考虑。

在链路层最大只能发MTU(1500字节)大小的数据,超过就会分片,IP报文可能进行分片与组装,分片组装只有网络层自行组装,与上下层无关。任何一个分片丢失都表示这个报文整体丢失,分片过多会导致在网络通信中丢包概率。滑动窗口一个一个发送而不是打包发送就是避免分片,保证不超过MTU大小。3位标志位,这个字段为1且偏移量为0就说明这个分片是第一个,字段为0且偏移量不为0就是报文大小就是最后一个,而中间报文可以根据,后一个分片的偏移量是前一个分片的偏移量+报文大小,先升序分片按照偏移量,然后按照这个规律去判断缺失了哪一个,就可以重发报文过来。

选项:可以提供额外的功能,如时间戳,记录路由等

TTL 的工作原理

  • 初始值:当一个 IP 数据包被创建时,发送方会设置一个初始 TTL 值。这个值通常由操作系统设置,不同的操作系统可能有不同的默认值(常见的是 64、128 等)。

  • 跳数限制:每经过一个路由器,TTL 值会减 1。如果 TTL 减少到 0,则数据包会被丢弃,并且通常会向发送方发送一个 ICMP 超时报文,通知发送方数据包因 TTL 超时而被丢弃。

IP报文封装过程

定义IP报头结构体,内核中会先定义一个结构体来表示IP报头,结构体的每个字段对应IP报头中的一部分,例如版本,首部长度,总长度,表示,标志,片偏移等,需要封装一个IP数据包时,内核会创建一个结构体实例,根据要发送的数据包的特征来填写各个字段值,接着将填充好的IP报文结构体拷贝到实际的数据包的首部位置,这样数据包就有了IP报头,完成封装。

网段划分

IP地址由网络号和主机号构成,网络号是保证相互连接的两个网段具有不同的标识,主机号是在同一网段内,主机之间具有相同的网络号,但必须由不同的主机号

IP地址后面+/,/后面跟一个数字,表示数字从头数到第几位为止是属于网络标识。

下图有两个网段,路由器要进行路由就会有两个网段。同一个网段下的主机网络标识是相同的,不同网段内主机的网络标识是不同的,主机标识不一样,同一网段内的主机标识是不同的,不同网段内主机的主机标识是可以相同的。

不同的子网就是把网络号相同的主机放到一起

DHCP协议

手动管理IP地址很麻烦,当子网中新增主机需要分配一个IP地址,子网中有主机断开的网络又要将IP地址回收,给后续主机使用。

DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,路由器就可以看成一个DHCP服务器,可以自动分配IP地址

连接wife时,本质就是路由器验证账号和密码,验证通过了,那么路由器就会动态分配一个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地址属于什么类型,需要看前面的值,A第一只有一位0,E类最后有五位四个一,这里是有规律的,每个类型的值是不一样的。

但是这样划分有缺陷,就是当中类型被申请太多了,导致单中类型不够用,而其它类型很多,而且如A类的主机号有24位,如果不是很多人就会空出很多主机号位置,浪费了资源。子网划分的出现解决了问题。

子网划分

用一种新的划分方案CIDR

在原有的五类网络基础上继续进行子网划分,需要接用主机号来作为网络号,为了知道是否被借位了就应用了子网掩码。

每一个子网都有自己的子网掩码,子网掩码实际就是一个32位正整数,通常用一串"0"结尾。将IP地址与当前网络的子网掩码进行按位与(&)操作,就能得到当前的网络的网络号。

一个网络被划分一个更小的子网,通过子网划分,子网IP中的IP地址对应的主机号就短了,子网中可以用的IP地址就越来越少了,避免了资源的浪费。

一个数据路由时,数据因路由不断进入更小的子网,网络号的位数不断在变换,网络号的位数不断在增加,因为在进入更小的子网,意味着子网掩码为一的部分越来越多。

子网划分就是把原来的IP地址的主机部分借位,因为IP地址是一段完整的,如果借位就会多了一位,那么完整0和完整1就是两个子网,都是完整的中的一个。主机地址加上两个特殊地址就和子网的范围是一样的。

在子网划分中,两个子网是由原网络通过子网掩码的调整划分出来的,它们都被包含在原网络的IP地址范围内。

  • 对于原网络`192.168.1.0/24`,其IP范围是`192.168.1.0`到`192.168.1.255`。

  • 当使用子网掩码`/25`将其划分为两个子网时:

  • **子网1**:`192.168.1.0/25`,IP范围是`192.168.1.0`到`192.168.1.127`。

  • **子网2**:`192.168.1.128/25`,IP范围是`192.168.1.128`到`192.168.1.255`。

这两个子网都属于原`192.168.1.0/24`网络的IP地址范围,因此它们被原网络所包含。

判断两个地址是否在同一个子网

两个IP地址与同一个子网掩码进行位与运算后得到的网络地址相同时,它们就属于一个子网。

在位与运算中,子网掩码保留了IP地址的网络部分,舍弃了主机部分。

特殊IP地址

并不是所有的IP地址都可以作为主机地址,有些IP地址本身就是有特殊用途的。将IP地址中的主机地址全部设为0,就是网络号,代表这个局域网。将IP地址的主机地址全部设为1,就是广播地址,用于给同一个链路层中相互连接的所有主机发送数据包。

IP数量限制

IP地址IPv4是一个4个字节的32位正整数,就会有2^32个IP地址,将近43亿个地址,TCP协议规定每个主机都需要有一个IP地址。

而现在IP地址是不够用的,因此需要CIDR方案对以及划分好的五类网络进行子网划分,来是资源被利用的更加合理,IP地址的数量是没有改变的。

分配地址是按网民数量,IP地址是资源,运营商会存储IP地址资源。

私网IP地址和公网IP地址

一个组织内部建立局域网,IP地址只用于局域网内的通信,而不能直接连接到Internet上。

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

在上面的范围内,都是私网IP,其余的都是公网IP。内网不能出现在公网上,因为公网里面都是唯一的,而内网在不同子网内是可以重复的,也就说当内网的数据发送到公网,而公网应答报文是无法回到准确的内网的IP地址的。

运营商

实际通信的基础设施设备都是运营商搭建的,访问服务器的数据并不是能直接发送对应的服务器,而是需要经过运营商建设的各种基站以及各种路由器,最终才能达到对应的服务器。

因为运营商提供了通信的设备,交网费就像买一个许可。

路由

数据进行网络传输一般是跨网络的,路由器就是连接多个网络的硬件设备,数据在进行跨网络传输时需要路由器作为跳板的。

确定了目的地后,数据就会在网络中路由了,但数据时无法自主进行路径选择的,数据就像迷路的人一样,需要到处的问路,而路人就是'路由器'。每一个路人可能不会给出准确的路,但是它们不会说不知道,如果不知道就会说另一边的一个人知道,这个人就是这一批次中的默认人,你在这个范围问路,都不知道就会说让你去找这个人。每一个路人都会把自己群内的人记住,记录在自己的路由表上,默认人也叫缺失路由。缺失路由会告诉一个可能的地方给你,到达新地方后,在询问这一圈的人,重复操作就会到达目的地。

路由表构成:

路由器中的路由表就像路人的闹钟的地图,路由表包含多个条目,每个条目包含以下信息:

目标网络地址:指明该条目所指向的网络

下一跳地址:数据包要达到目标网络需要经过的下一个路由器IP地址。每一个数据到路由器后会根据路由表到下一跳的地址,也就说每一个路由器的下一个地方都是指定的。

出口接口:数据包从路由器哪一个接口发出。路由器比成网络,负责将信件(数据包)发送到不同的目的地,邮局有邮筒,每一个邮筒通向不同的区域(市内,国内,国际),这些邮筒就像是路由器的不同出口接口。

路由器补充

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

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

不同的路由器,子网IP其实都是一样的,IP地址不能重复,子网之间的IP地址就可以重复了。

每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样运营商路由器就可能会有很多级,最外层的运营商路由器,WAN口IP就是公网IP。子网内的主机需要和外网进行通信时,路由器将IP地址进行替换,替换为WAN口IP,最终将数据包中的IP地址变为一个公网IP,这种技术就叫NAT。

希望自己实现的服务器程序,能够在公网上被访问到,就需要程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云,腾讯云等进行购买。

内网IP不会出现在公网上,因为会出现应答不知道如何返回,因为公网内是唯一,而返回的话会有迷惑,因为每个内网可能都有一样的地址和网络号。

三层对应作用

传输层

传输层,协议负责将应用层的数据进行分段,确保数据的可靠传输。

网络层

IP协议在这一层负责传输层的段进行分片,并将每个分片封装成IP数据包,然后进行路由发送和转发。

数据链路层

在数据链路层。IP数据包被封装成帧,进行在子网内通信。

下面ai解释

要理解子网划分过程并确定子网范围,需要将IP地址和子网掩码转换为二进制形式进行分析。以下是具体过程:

将IP地址和子网掩码转换为二进制

  • **IP地址**:`5.1.16.0`

  • 二进制表示:

```

00000101.00000001.00010000.00000000

```

  • **子网掩码**:`/20` 表示子网掩码的前20位是1,其余位是0。对应的二进制形式为:

```

11111111.11111111.11110000.00000000

```

即点分十进制表示为 `255.255.240.0`。

确定网络地址

将IP地址的二进制形式与子网掩码的二进制形式进行逐位"与"运算:

```

IP地址(二进制): 00000101 . 00000001 . 00010000 . 00000000

子网掩码(二进制): 11111111 . 11111111 . 11110000 . 00000000


"与"运算结果: 00000101 . 00000001 . 00010000 . 00000000

```

"与"运算结果即为网络地址 `5.1.16.0`。

确定子网范围

  • **主机部分位数**:子网掩码 `/20` 表示前20位是网络部分,后12位是主机部分。

  • **主机数量**:主机部分有12位,可以表示 \(2^{12} = 4096\) 个地址。减去网络地址和广播地址后,每个子网有4094个可用的主机地址。

  • **子网范围**:从网络地址 `5.1.16.0` 开始,到广播地址 `5.1.31.255` 结束:

  • **网络地址**:`5.1.16.0`

  • **可分配主机地址范围**:`5.1.16.1` 到 `5.1.31.254`

  • **广播地址**:`5.1.31.255`

将二进制转换为十进制

  • **网络地址**:`5.1.16.0`

  • 二进制:`00000101.00000001.00010000.00000000`

  • **广播地址**:`5.1.31.255`

  • 二进制:`00000101.00000001.00011111.11111111`

通过以上步骤,可以看出子网划分的关键在于确定网络部分和主机部分的分界点。这需要将IP地址和子网掩码转换为二进制形式,进行逐位"与"运算,以确定网络地址,进而确定子网的范围。
子网范围和主机可分配范围是否相同,取决于是否包括网络地址和广播地址这两个特殊地址:

子网范围

  • **定义**:子网范围是指一个子网中所有可能的 IP 地址的集合,包括网络地址、主机地址和广播地址。

  • **示例**:对于子网 `5.1.16.0/20`,其子网范围是从 `5.1.16.0` 到 `5.1.31.255`。

主机可分配范围

  • **定义**:主机可分配范围是子网中可以分配给主机使用的 IP 地址的集合,即子网范围中除去网络地址和广播地址后的部分。

  • **示例**:对于子网 `5.1.16.0/20`,其可分配主机地址范围是从 `5.1.16.1` 到 `5.1.31.254`。

特殊地址

  • **网络地址**:每个子网的起始地址,用于标识该子网,不能分配给主机。对于子网 `5.1.16.0/20`,网络地址是 `5.1.16.0`。

  • **广播地址**:每个子网的结束地址,用于向子网中的所有主机发送广播消息,也不能分配给主机。对于子网 `5.1.16.0/20`,广播地址是 `5.1.31.255`。

总结

| 名称 | 起始地址 | 结束地址 | 说明 |

|---------------------|-------------|---------------|------------------------------------------|

| 子网范围 | `5.1.16.0` | `5.1.31.255` | 包括网络地址、主机地址和广播地址的完整范围 |

| 主机可分配范围 | `5.1.16.1` | `5.1.31.254` | 实际可分配给主机使用的地址范围 |

通过上述表格可以清晰地看出,子网范围包括了网络地址、主机地址和广播地址,而主机可分配范围仅包括实际可以分配给主机使用的地址。

解释关于云服务器内网IP地址是虚拟

云服务器的内网 IP 是虚拟的

当你在云平台上(比如阿里云、腾讯云或 AWS)创建一台云服务器时,这台服务器实际上运行在一个大型的数据中心里。云平台使用虚拟化技术,将物理服务器的资源(如 CPU、内存、存储和网络)分割成多个虚拟机(VM)。每个虚拟机都分配了一个内网 IP 地址,这个内网 IP 是虚拟的,用于在云平台的内部网络中标识这台云服务器。

内网 IP 和公网 IP 的转换

云服务器的内网 IP 用于在云平台的内部网络中通信,但它不能直接与互联网上的其他设备通信。为了让云服务器能够访问互联网或让互联网上的用户能够访问云服务器,云平台使用了一种叫做网络地址转换(NAT)的技术。

源 NAT(SNAT)

当你的云服务器需要主动访问互联网(比如下载文件、更新软件等),云平台会使用源 NAT(SNAT)技术。SNAT 的作用是将云服务器的内网 IP 地址转换为一个公网 IP 地址。具体过程如下:

  1. **云服务器发起请求**:假设你的云服务器的内网 IP 是 `10.0.0.1`,它需要访问互联网上的一个网站(比如 `example.com`)。

  2. **SNAT 转换**:云平台的路由器或网关设备会将这个请求的源 IP 地址从 `10.0.0.1` 转换为一个公网 IP 地址(比如 `203.0.113.1`)。这个公网 IP 是云平台分配给你的,或者是一个共享的公网 IP。

  3. **互联网响应**:目标网站收到请求后,会将响应数据发送回这个公网 IP 地址。

  4. **SNAT 反转**:云平台的路由器收到响应后,会将目标 IP 地址从公网 IP 转换回云服务器的内网 IP `10.0.0.1`,并将数据包转发给云服务器。

目的 NAT(DNAT)

当互联网上的用户需要访问你的云服务器(比如访问你部署的网页应用或 API 服务),云平台会使用目的 NAT(DNAT)技术。DNAT 的作用是将公网 IP 地址转换为云服务器的内网 IP 地址。具体过程如下:

  1. **互联网用户发起请求**:假设你的云服务器的公网 IP 是 `203.0.113.1`,一个用户访问这个 IP 地址。

  2. **DNAT 转换**:云平台的路由器或网关设备会将这个请求的目标 IP 地址从 `203.0.113.1` 转换为云服务器的内网 IP 地址(比如 `10.0.0.1`)。

  3. **云服务器处理请求**:云服务器收到请求后,处理并返回响应。

  4. **DNAT 反转**:云服务器的响应数据包会通过云平台的路由器,路由器将源 IP 地址从内网 IP `10.0.0.1` 转换为公网 IP `203.0.113.1`,并将数据包发送回互联网用户。

举例说明

假设你在云平台上创建了一台云服务器,用于运行一个简单的网页应用。以下是详细的流程:

  1. **云服务器创建**:你在阿里云上创建了一台云服务器,云平台分配给它一个内网 IP `10.0.0.1` 和一个公网 IP `203.0.113.1`。

  2. **互联网用户访问你的网页应用**:

  • 一个用户在浏览器中输入 `http://203.0.113.1`。

  • 用户的请求到达云平台的路由器。

  • 路由器使用 DNAT 将目标 IP 地址从 `203.0.113.1` 转换为云服务器的内网 IP `10.0.0.1`。

  • 云服务器收到请求,处理并返回响应。

  • 云服务器的响应通过路由器,路由器使用 SNAT 将源 IP 地址从 `10.0.0.1` 转换为 `203.0.113.1`。

  • 用户收到响应,看到网页内容。

为什么使用内网 IP 和 NAT?

  1. **节省公网 IP 资源**:公网 IP 地址是有限的资源(特别是 IPv4),通过使用 NAT,云平台可以将一个公网 IP 地址映射到多个云服务器,从而节省公网 IP 的使用。

  2. **安全性**:内网 IP 地址隐藏了云服务器的实际网络位置,增加了安全性。外部攻击者只能看到公网 IP,而不知道云服务器的实际内网 IP。

  3. **灵活性**:云平台可以灵活地管理内部网络,方便地调整云服务器的网络配置,而不需要频繁更改公网 IP 地址。

总结

云服务器的内网 IP 是虚拟的,由云平台通过虚拟化技术分配。通过 NAT 技术,云服务器能够在内部网络中使用内网 IP,同时通过公网 IP 与互联网进行通信。这种机制既节省了公网 IP 资源,又提高了安全性和网络管理的灵活性。

相关推荐
段帅龙呀19 分钟前
Redis构建缓存服务器
服务器·redis·缓存
乌鸦不像写字台1 小时前
【docker部署】在服务器上使用docker
服务器·docker·容器
牧以南歌〆2 小时前
在Ubuntu主机中修改ARM Linux开发板的根文件系统
linux·arm开发·驱动开发·ubuntu
Antonio9153 小时前
【音视频】HLS简介与服务器搭建
运维·服务器·音视频
夜月yeyue3 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
kfepiza4 小时前
Debian的`/etc/network/interfaces`的`allow-hotplug`和`auto`对比讲解 笔记250704
linux·服务器·网络·笔记·debian
无妄-20244 小时前
软件架构升级中的“隐形地雷”:版本选型与依赖链风险
java·服务器·网络·经验分享
R.X. NLOS4 小时前
VS Code远程开发新方案:使用SFTP扩展解决Remote-SSH连接不稳定问题
运维·服务器·ssh·debug·vs code
cuijiecheng20185 小时前
Ubuntu下布署mediasoup-demo
linux·运维·ubuntu
群联云防护小杜5 小时前
构建分布式高防架构实现业务零中断
前端·网络·分布式·tcp/ip·安全·游戏·架构