最新资讯

  • 【网络】网络层协议-IP协议

【网络】网络层协议-IP协议

2025-04-27 22:02:20 3 阅读

网络层协议-IP协议

文章目录

  • IP协议
    • 1.网络层 & IP协议基本概念
    • 2.IP协议格式
      • 2.1报头各字段简介
      • 2.2IP如何将报头与有效载荷进行分离?
      • 2.3IP如何决定将有效载荷交付给上层的哪一个协议?
      • 2.4源IP与目的IP
      • 2.5八位生存时间
      • 2.6分片与组装
    • 3.网段划分
      • 3.1IP地址构成
      • 3.2DHCP协议
      • 3.3为什么要进行网段划分?
      • 3.4网段划分方案
    • 4.IP地址数量限制
    • 5.私有IP和公网IP
    • 6.路由器
    • 7.路由
      • 7.1路由的过程
      • 7.2具体过程

IP协议

我们之前在学习传输层协议Tcp协议的时候说过:Tcp协议保证数据传输的可靠性,而网络层协议IP协议在数据传输中扮演什么角色呢?

1.网络层 & IP协议基本概念

  • 网络层:负责在复杂的网络环境中确定一个合适的路径。

  • IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP体系中的网络层协议。

这种在网络环境中确定路径的行为被称为“路由”,所以网络层在数据传输的过程中提供让数据找到对方主机的一种能力,而传输层+网络层,即TCP协议+IP协议一起确保了数据能够可靠地发送给对端主机。

我们都见过IP地址,假设IP地址为 123.122.122.4 ,其实IP地址是由两部分构成的,即IP=目标子网+目标主机。对于这个IP地址来说,目标子网就是 123.122.122.0,目标主机就是 4,其实这样也很好理解,假设你要去 外地城市旅游,你一定是先乘坐某一种交通工具到达目的城市,然后再到达目的景点。

主机和路由器

  • 主机:配有IP地址,但是不进行路由控制的设备。但实际现在几乎不存在不进行路由控制的设备了,就连你的笔记本也会进行路由控制。
  • 路由器:既配有IP地址,又能进行路由控制。实际现在主流的路由器已经不仅仅具有路由的功能了,它甚至具备某些应用层的功能。
  • 节点:主机和路由器的统称。

2.IP协议格式

2.1报头各字段简介

  • 4位版本号(version):指定IP协议的版本(IPv4/IPv6),对于IPv4来说,就是4。
  • 4位首部长度(header length):表示IP报头的长度,以4字节为单位。
  • 8位服务类型(Type Of Service):3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择一个。比如对于ssh/telnet这样的应用程序,最小延时比较重要,而对于ftp这样的程序,最大吞吐量比较重要。
  • 16位总长度(total length):IP报文(IP报头+有效载荷)的总长度,用于将各个IP报文进行分离。
  • 16位标识(id):唯一的标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片对应的id都是相同的。
  • 3位标志字段:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。
  • 8位生存时间(Time To Live,TTL):数据报到达目的地的最大报文跳数,一般是64,每经过一个路由,TTL–,一直减到0还没到达,那么就丢弃了,这个字段主要是用来防止出现路由循环。
  • 8位协议:表示上层协议的类型。
  • 16位首部检验和:使用CRC进行校验,来鉴别数据报的首部是否损坏,但不检验数据部分。
  • 32位源IP地址和32位目的IP地址:表示发送端和接收端所对应的IP地址。
  • 选项字段:不定长,最多40字节。

IP报头在内核当中本质就是一个位段类型,给数据封装IP报头时,实际上就是用该位段类型定义一个变量,然后填充IP报头当中的各个属性字段,最后将这个IP报头拷贝到数据的首部,至此便完成了IP报头的封装。

2.2IP如何将报头与有效载荷进行分离?

与TCP相同,当IP获取到一个报文后,虽然IP不知道报头的具体长度,但IP报文的前20个字节是IP的基本报头,并且这20字节当中涵盖4位首部长度。

因此IP是这样分离报头与有效载荷的:

  1. 当IP从底层获取到一个报文后,首先读取报文的前20个字节,并从中提取出4位的首部长度,此时便获得了IP报头的大小 size。
  2. 如果 size 的值大于20字节,则需要继续从报文当中读取 size−20 字节的数据,这部分数据就是IP报头当中的选项字段。
  3. 读取完IP的基本报头和选项字段后,剩下的就是有效载荷了。

需要注意的是,IP报头当中的4位首部长度描述的基本单位与TCP报头当中的4位首部长度一样,都是以4字节为单位进行描述的,这也恰好是报文的宽度。

4位二进制的取值范围是0000 ~ 1111,因此IP报头的最大长度为15 × 4 = 60 15 imes 4=6015×4=60字节,因为基本报头的长度是20字节,所以IP报头中选项字段的长度最多是40字节。

如果IP报头当中不携带选项字段,那么IP报头的长度就是20字节,此时报头当中的4位首部长度字段所填的值就是20 ÷ 4 = 5,即0101。

2.3IP如何决定将有效载荷交付给上层的哪一个协议?

基于IP协议的传输层协议不止一种,因此当IP从底层获取到一个报文并对其进行解包后,IP需要知道应该将分离后得到的有效载荷交付给上层的哪一个协议。

在IP报头当中有一个字段叫做8位协议,该字段表示的就是上层协议的类型,IP就是根据该字段判定应该将分离出来的有效载荷交付给上层的哪一个协议的。该字段是发送方的IP层从上层传输层获取到数据后填充的,比如是上层TCP交给IP层的数据,那么该数据在封装IP报头时的8位协议填充的就是TCP对应的编号。

2.4源IP与目的IP

IP报头当中的32位源IP地址和32位目的IP地址,分别代表的就是该报文的发送端和接收端对应的IP地址。

网络传输的基本模式是请求与响应,那么报文就需要在网络通信的过程中始终明确我从哪里来(以便响应),我到哪里去(以便请求),源IP与目的IP解决的就是在网络世界中唯一标识主机。

理解socket编程

在进行socket编程的时候,当一端想要发送数据给另一端时,必须要指明对端的IP地址和端口号,也就是发送数据的目的IP地址和目的端口号。

其中这里的IP地址就是给网络层的IP用的,用于数据在网络传输过程中的路由转发,而这里的端口号就是给传输层的TCP或UDP用的,用于指明该数据应该交给上层的哪一个进程。

发送数据时我们不需要指明发送数据的源IP地址和源端口号,因为传输层和网络层都是在操作系统内核当中实现的,数据在进行封装时操作系统会自行填充上对应的源IP地址和源端口号。

2.5八位生存时间

报文在网络传输过程中,可能因为某些原因导致报文无法到达目标主机,比如报文在路由时出现了环路的情况,或者目标主机已经异常离线了,此时这个报文就成了一个废弃的游离报文。

为了避免网络当中出现大量的游离报文,于是在IP的报头当中就出现了一个字段,叫做8位生存时间(Time To Live,TTL)。8位生存时间代表的是报文到达目的地的最大报文跳数,每当报文经过一次路由,这里的生存时间就会减一,当生存时间减为0时该报文就会被自动丢弃,此时这个报文就会在网络中消散。

2.6分片与组装

MAC帧作为数据链路层的协议,它会将IP传下来的数据封装成数据帧,然后发送到网络当中。但MAC帧携带的有效载荷的最大长度是有限制的,也就是说IP交给MAC帧的报文不能超过某个值,这个值就叫做最大传输单元(Maximum Transmission Unit,MTU),这个值的大小一般是1500字节。

在Linux下使用ifconfig命令可以查看对应的MTU。

由于MAC帧无法发送大于1500字节的数据,因此IP层向下交付的数据的长度不能超过1500字节,这里所说的数据包括IP的报头和IP的有效载荷。

所以如果IP层要传输的数据大于1500字节,就需要先在IP层将该数据进行分片,然后再将分片后的数据交给链路层发送,对端网络层收到后会将数据进行组装。

数据的分片不是经常需要做的,实际在网络通信过程中不分片才是常态,即不建议分片。

之前我们在学习TCP协议时存在有一个滑动窗口的概念,当时我提出了一个疑问:为什么不能将滑动窗口中的数据一次性发送出去,而反而要将滑动窗口分为若干个小块,每次发送仅发送窗口中的一小块,实际上就是因为链路层MAC帧报文的最大传输单元问题。

以上策略其实就是为了防止IP层数据过大需要分片的情况,但是如果传输层还是将过大的数据交给了IP层,IP层就会对该部分数据进行分片,分片会有什么风险呢?

只有当接收端收到了全部的分片报文并将其成功组装起来,才认为该数据被对方可靠的收到了。但如果众多的分片报文当中有一个报文出现了丢包,就会导致接收端就无法将报文成功组装起来,这时接收端会将收到的分片报文全部丢弃,此时传输层TCP会因为收不到对方应答而进行超时重传。

假设在网络传输时丢包的概率是万分之一,如果将数据拆分为一百份进行发送,那么此时丢包的概率就上升到了百分之一。因为只要有一个分片报文丢包了也就等同于这个报文整体丢失了,因此分片会增加传输层重传数据的概率。

如何尽可能避免分片?

实际数据分片的根本原因在于传输层一次向下交付的数据太多了,导致IP无法直接将数据向下交给MAC帧,如果传输层控制好一次交给IP的数据量不要太大,那么数据在IP层自然也就不需要进行分片。

因此TCP作为传输控制协议,它需要控制一次向下交付数据不能超过某一阈值,这个阈值就叫做MSS(Maximum Segment Size,最大报文段长度)。

  • 通信双方在建立TCP连接时,除了需要协商自身窗口大小等概念之外,还会协商后续通信时每一个报文段所能承载的最大报文段长度MSS。
  • MAC帧的有效载荷最大为MTU,TCP的有效载荷最大为MSS,由于TCP和IP常规情况下报头的长度都是20字节,因此一般情况下 MSS = MTU - 20 - 20,而MTU的值一般是1500字节,因此MSS的值一般就是1460字节。

所以一般建议TCP将发送的数据控制在1460字节以内,此时就能够降低数据分片的可能性。之所以说是降低数据分片的可能性,是因为每个网络的链路层对应的MTU可能是不同的,如果数据在传输过程中进入到了一个MTU较小的网络,那么该数据仍然可能需要在路由器中进行分片。

注意:

  • 数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片。
  • 在分片的数据中,每一个分片在IP层都会被添加上对应的IP报头(因为每个分片都必须知道源目的IP和分片的具体信息,这些信息都在IP报头中),而传输层添加的报头只会出现在第一个分片中,因此网络中传输的数据包可能没有传输层的报头。
  • 数据的分片和组装都是在IP层完成的,上层的传输层和下层的链路层并不关心。

(1)具体分片过程

假设IP层要发送4500字节的数据,由于该数据超过了MAC帧规定的MTU,因此IP需要先将该数据进行分片,然后再将一个个的分片交给MAC帧进行发送。

IP报头如果不携带选项字段,那么其大小就是20字节,假设IP层添加的IP报头的长度就是20字节,并按下列方式将数据分片后形成了四个分片报文:

分片报文总字节数IP报头字节数数据字节数
11500201480
21500201480
31500201480
4802060

需要注意的是,分片后的每一个分片数据都需要封装上对应的IP报头,因此4500字节的数据至少需要分为四个分片报文进行发送。

分片报文到达对方的IP层后需要被重新组装起来,因此IP层在对数据进行分片时需要记录分片的信息,而IP报头当中的16位标识、3位标志和13位片偏移实际就是与数据分片相关的字段。

  • 16位标识:唯一标识主机发送的报文,如果数据在IP层进行了分片,那么每一个分片报文的16位标识是相同的。
  • 3位标志:第一位保留,表示暂时没有规定该字段的意义。第二位表示禁止分片,表示如果报文长度超过MTU,IP模块就会丢弃该报文。第三位表示“更多分片”,如果报文没有进行分片,则该字段设置为0,如果报文进行了分片,则除了最后一个分片报文设置为0以外,其余分片报文均设置为1。
  • 13位片偏移:分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值 × 8 得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。

为什么偏移字节数必须是 8的整数倍 ?

IP报文长度用 16位 表示,片偏移用 13 位标识,为了让 13位片偏移 能够表示总的报文长度,在填充片偏移字段时要对真实偏移量 / 8,即让真实偏移量 >> 3 ,未来在提取真实偏移量时,对 片偏移 * 8,即片偏移 << 3,由于偏移字节数必须是 8 的整数倍,所以真实偏移量的后三位一定是0,比如 111 1000 =120是8的整数倍,这样后三位为0,右移3位不会丢失精度。

由于上述四个分片同属一个报文,所以各片对应的16位标识都是一样的,假设四个分片报文的16位标识都是123,则这四个报文对应的16位标识、3位标志中的“更多分片”和13位片偏移分别如下:

分片报文总字节数IP报头字节数数据字节数16位标识“更多分片”13位片偏移
1150020148012310
215002014801231185
315002014801231370
48020601230555

分片报文2在原始数据开始处的偏移字节数是1480(去掉报头),其对应的13位片偏移的值就是1480 ÷ 8 = 185 。

(2)具体组装过程

MAC帧交给IP层的数据可能来自世界各地,这些数据可能是经过分片后发送的,也可能是没有经过分片直接发送的,因此IP必须要通过某种方式来区分收到的各个数据。

  • IP报头当中有32位源IP地址,源IP地址记录了发送端所对应的IP地址,因此通过IP报头当中的32位源IP地址就可以区分来自不同主机的数据。
  • IP报头当中有16位标识,未分片的数据各自的16位标识都是不同的,而由同一个数据分片得到的各个分片报文所对应的16位标识都是相同的,因此通过IP报头当中16位标识就可以判断哪些报文是没有经过分片的独立报文,哪些报文是经过分片后的分片报文。

因此IP可以通过IP报头当中的32位源IP地址和16位标识,将经过分片的数据各自聚合在一起,聚合在一起后就可以开始进行组装了。

对于各个分片报文来说:

  • 第一个分片报文中的13位片偏移的值一定为0。
  • 最后一个分片报文中的“更多分片”标志位一定为0。
  • 对于每一个分片报文来说,当前报文的13位片偏移加上当前报文的数据字节数 ÷ 8 所得到的值,就是下一个分片报文的所对应的13位片偏移。

根据分片报文的这三个特点就能够将分片报文合理的组装起来。

  • 先找到分片报文中13位片偏移为0的分片报文,然后提取出其IP报头当中的16位总长度字段,通过计算即可得出下一个分片报文所对应的13位片偏移,按照此方式依次将各个分片报文拼接起来。
  • 直到拼接到一个“更多分片”标志位为0的分片报文,此时表明分片报文组装完毕。

如果分片报文丢包,接收端有能力判断是否收到了全部分片报文,比如假设某组分片报文对应的16位标识值为x:

  • 如果分片报文中的第一个分片报文丢包了,那么接收端收到的分片报文中就找不到对应16位标识为x,并且13位片偏移为0的分片报文。
  • 如果分片报文中的最后一个分片报文丢包了,那么接收端收到的分片报文中就找不到对应16为标识为x,并且“更多分片”标志位为0的分片报文。
  • 如果分片报文中的其它分片报文丢包了,那么接收端在进行分片报文的组装时就会找不到对应13位片偏移为特定值的分片报文。

需要注意的是,未分片报文的“更多分片”标志位为0,最后一个分片报文的“更多分片”标志位也为0,但当接收端只收到分片报文中的最后一个分片报文时,接收端不会将其识别成一个未分片的报文,因为未分片的报文所对应的13位片偏移的值也应该是0,而最后一个分片报文所对应的13位片偏移的值不为0。

因此只有当一个报文的13位片偏移为0,并且该报文的“更多分片”标志位也为0时,该报文才会被识别成一个没有被分片的独立报文,否则该报文就会被识别成一个分片报文。

3.网段划分

3.1IP地址构成

IP地址由网络号和主机号两部分构成:

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

可以在IP地址的后面加一个 /,并在 / 后面加上一个数字,这就表示从头数到第几位为止属于网络标识。

例如,下图中路由器连接了两个网段。对于网络标识来讲,同一网段内主机的网络标识是相同的,不同网段内主机的网络标识是不同的。而对于主机标识来讲,同一网段内主机的主机标识是不同的,不同网段内主机的主机标识是可以相同的。

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

3.2DHCP协议

实际手动管理IP地址是一个非常麻烦的事情,当子网中新增主机时需要给其分配一个IP地址,当子网当中有主机断开网络时又需要将其IP地址进行回收,便于分配给后续新增的主机使用。

因此对于IP地址的分配和回收一般不会手动进行,而是采用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)技术。

DHCP通常被应用在大型的局域网环境中,其主要作用就是集中地址管理、分配IP地址,使网络环境中的主机动态获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。

DHCP是一个基于UDP的应用层协议,一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器。

当我们连接WiFi时需要输入密码,本质就是因为路由器需要验证你的账号和密码,如果验证通过,那么路由器就会给你动态分配了一个IP地址,然后你就可以基于这个IP地址进行各种上网动作了。

3.3为什么要进行网段划分?

当IP要将数据跨网络从一台主机发送到另一台主机时,其实不是直接将数据发送到了目标主机,而是先将数据发送到目标主机所在的网络,然后再将数据发送到目标主机。

因此数据在路由时的第一目的并不是找到目标主机,而是找到目标网络所在的网络,然后再在目标网络当中找到目标主机。

数据路由时之所以不一开始就以找目标主机为目的,因为这样效率太低了。

查询的过程本质是排除的过程,如果一开始就以找目标主机为目的,那么在查找的过程中一次只能排除一个主机。而如果一开始先以找目标网络为目的,那么在查找过程中就能一次排除大量和目标主机不在同一网段的主机,这样就可以大大提高检索的效率。

因此,为了提高数据路由的效率,我们对网络进行了网段划分。

3.4网段划分方案

过去曾经提出一种划分网络号和主机号的方案,就是把所有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。

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

  • 比如一些学校、公司、实验室等组织想要申请自己的局域网,由于A类地址的网络号只占7个比特位,因此A类地址可申请的网络只有 2^7 =128 个,于是大多数组织都选择申请B类地址。
  • 由于B类地址的主机号占16个比特位,因此理论上一个B类网络当中允许有65536台主机。
  • 但实际网络架设中,一般不会存在一个局域网当中有这么多主机的情况,也就意味着大量的IP地址实际都被浪费掉了。

为了避免这种情况,于是又提出了新的划分方案,称为CIDR(Classless Interdomain Routing):

  • 在原有的五类网络的基础上继续进行子网划分,这也就意味着需要借用主机号当中的若干位来充当网络号(这样就避免了IP地址被大量浪费),此时为了区分IP地址中的网络号和主机号,于是引入了**子网掩码(subnet mask)**的概念。
  • 每一个子网都有自己的子网掩码,子网掩码实际就是一个32位的正整数,通常用一串“0”来结尾。
  • 将IP地址与当前网络的子网掩码进行“按位与”操作,就能够得到当前所在网络的网络号。
  • 比如在某一子网中将IP地址的前24位作为网络号,那么该网络对应的子网掩码的32个比特位中的前24位就为1,剩下的8个比特位为0,此时子网掩码用点分十机制表示就是255.255.255.0。
  • 假设该子网当中有一台主机对应的IP地址是192.168.128.10,那么将这个IP地址与该网络对应的子网掩码进行“按位与”操作后得到的就是192.168.128.0,这就是这个子网对应的网络号。
  • 实际在用子网掩码与子网当中主机的IP地址进行“按位与”操作时,本质就是保留了主机IP地址中前24个比特位的原貌,将剩下的8个比特位的值清0了而已,也就是将主机号清0了,所以“按位与”后的结果就是该网络对应的网络号。

需要注意的是,子网划分不是只能进行一次,我们可以在划分出来的子网的基础上继续进行子网划分。

因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,这也就意味着IP地址当中的主机号的位数在不断减少。最终当数据路由到达目标主机所在的网络时,就可以在该网络当中找到对应的目标主机并将数据交给该主机,此时该数据的路由也就结束了。

特殊的IP地址

并不是所有的IP地址都能够作为主机的IP地址,有些IP地址本身就是具有特殊用途的。

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

也就是说,IP地址中主机号为全0的代表的是当前局域网的网络号,IP地址中主机号为全1的代表的是广播地址,这两个IP地址都是不能作为主机的IP地址的。因此在某个局域网中最多能存在的主机个数是 (2 ^ 主机号位数)- 2 。

本机环回

本机环回会将数据贯穿网络协议栈,但最终并不会将数据发送到网络当中,相当于本机环回时不会将数据写到网卡上面。

本机环回的目的就是将数据自顶向下贯穿协议栈,进行一次数据封装的过程的过程,然后再自底向上贯穿协议栈,进行一次数据的解包和分用,用于测试本地的网络功能是否正常

本机环回的基本原理:

  1. 当数据到达IP层需要继续向下交付时,如果是环回程序,那么IP输出函数会将该数据放入到IP输入队列当中,然后再由IP输入函数读取上去。
  2. 而IP输入函数将数据读取上去的本应该是链路层交付上来的数据,因此该数据后续就会被当作从网络中读取上来的数据看待,各层协议会对该数据依次进行解包和分用。
  3. 如果不是环回程序的话,那么接下来就会判断该数据对应的目的IP地址是否为广播或多播地址,或者目的IP地址是否与本主机的IP地址相同,如果是则也会将该数据放入到IP输入队列当中,等待IP输入函数将其读走。
  4. 只有判断程序不是环回程序,并且也不是广播或多播,或发给本主机的数据后,才会用ARP获取该数据目的主机的以太网地址并进行后续数据发送的操作。

4.IP地址数量限制

我们知道,IP地址(IPv4)是一个4字节32位的正整数,因此一共有 2^32 个IP地址,也就是将近43亿个IP地址。但TCP/IP协议规定,每个主机都需要有一个IP地址。

这意味着,一共只有43亿台主机能接入网络么?

实际上,由于一些特殊的IP地址的存在,数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址(比如跨子网的路由器需要两个网卡即两个IP)。

所以IP地址其实早就不够用了,CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加),仍然不是很够用。这时候有三种方式来解决:

  • 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的,避免了IP地址强绑定于某一台设备。
  • NAT技术:能够让不同局域网当中同时存在两个相同的IP地址,NAT技术不仅能解决IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
  • IPv6:IPv6用16字节128位来表示一个IP地址,能够大大缓解IP地址不足的问题。注意IPv6并不是IPv4的简单升级版,它们是互不相干的两个协议,彼此并不兼容。

5.私有IP和公网IP

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上使用任意的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)。

是不是感觉到192.168这串数字非常熟悉,没错这就是一般的家庭网络所使用的私网IP地址,这个IP地址并不是公网IP,该IP地址仅在你所处的局域网内有效。

如果你现在的手机连接的是家庭wifi,你可以看一下手机此时的IP地址:

电脑也是一样,在cmd窗口中输入ipconfig命令查看当前IP:

那再来看一下云服务器的IP地址情况:

很明显116开头的IP是公网IP地址。

通过ifconfig命令来查看我们这台机器的私网IP:

那我的设备想要发送数据给云服务器,目的IP是填云服务器的私网IP:192.168.0.59 么?

答案是否定的,因为私网IP仅在子网内有效,我与云服务器处于不同的子网内,想要发送数据给云服务器必须知道云服务器的公网IP,即 116.204.13.111。所以这一过程一定会跨子网,那如何跨越子网呢?

6.路由器

路由器可以完成数据转发,将数据从一个网络传输到另一个网络。

路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:

  • LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。
  • WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网。

我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP。

我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下:

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

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

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

由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,直到数据包中的源IP地址替换为一个公网IP,这种技术称为NAT(Network Address Translation,网络地址转换)

所以NAT技术在某种程度上缓解了IP地址不足的问题:通过路由器可以维护多个子网,子网内又可以维护多个设备,这样大量的个人设备使用私网IP即可,不占用有限的公网IP。

两个局域网当中的主机不能不跨公网进行通信

  • 两个局域网当中的主机理论上是不能不跨公网进行通信的,因为一个主机要将数据发送给另一台主机的前提是得先知道另一台主机的IP地址。
  • 即便现在这个主机知道了另一台主机的IP地址,但有可能这两台主机的IP地址是一样的,因为它们的IP地址都是私网IP地址。
  • 所以数据要从一个局域网发送到另一个局域网,如果不经过公网是基本上不可能的。我们在和别人聊天的时候,也不是直接将数据从一个局域网直接发送到了另一个局域网,而是先将数据经过公网发送到了服务器,然后再由服务器将数据经过公网转发到了另一个局域网。

但实际确实存在一些技术能够使数据包在发送过程中不进行公网IP的替换,而将数据正确送到目标主机,这种技术叫做内网穿透,也叫做NAT穿透。

运营商

可以看到一般我们使用网络都是处于某一子网内,而子网对外连接的渠道就是通过路由器,而家用路由器也是在更大型路由器维护的子网下的一个节点而已,这个更大型的路由器其实就是运营商提供的,所以我们一切的网络行为都绕不开运营商,我们访问服务器的数据并不是直接发送到了对应的服务器,而是需要经过运营商建设的各种基站以及各种路由器,最终数据才能到达对应的服务器。

也就是说,用户上网的数据首先必须经过运营商的相关网络设备,然后才能发送到互联网公司对应的服务器。因此所谓的网段划分、子网划分等工作实际都是运营商做的。

7.路由

7.1路由的过程

数据在路由的过程中,实际就是一跳一跳(Hop by Hop)的“问路”过程。所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。

IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。

路由器的查找结果可能有以下三种:

  • 路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
  • 路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
  • 路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。

7.2具体过程

每个路由器内部会维护一个路由表,我们可以通过route命令查看云服务器上对应的路由表。

字段解释:

  • Destination代表的是目标网络或主机的IP地址。如果这一列显示为default(或0.0.0.0),则表示这是一个默认网关,用于发送那些没有明确路由规则的数据包。
  • Gateway代表的是下一跳地址,如果目标是本地网络上的主机,则这一列通常显示为*,表示不需要通过网关。
  • Genmask代表的是子网掩码。
  • Flags代表的是标志位,用于表示路由的各种属性。常见的标志包括:U(路由是活动的)、H(目标是一个主机地址)、G(需要通过网关发送数据,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发)。多个标志可能同时出现,例如UG表示该路由既需要通过网关发送数据,又是活动的。
  • Iface代表的是发送接口。

当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。

如果没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。

数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了。

路由表生成算法

路由可分为静态路由和动态路由:

  • 静态路由:是指由网络管理员手工配置路由信息。
  • 动态路由:是指路由器能够通过算法自动建立自己的路由表,并且能够根据实际情况进行调整。

路由表相关生成算法:距离向量算法、LS算法、Dijkstra算法等。


博观而约取,厚积而薄发。 —苏轼

本文地址:https://www.vps345.com/3941.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 javascript 前端 chrome edge python MCP 进程 操作系统 进程控制 Ubuntu llama 算法 opencv 自然语言处理 神经网络 语言模型 ssh deepseek Ollama 模型联网 API CherryStudio harmonyos 华为 开发语言 typescript 计算机网络 ubuntu 数据库 centos oracle 关系型 安全 分布式 react.js 前端面试题 node.js 持续部署 Dell R750XS 科技 ai java 人工智能 个人开发 udp unity 网络 网络协议 rust http fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse pycharm ide pytorch numpy 阿里云 网络安全 macos adb nginx 监控 自动化运维 tcp/ip django flask web3.py github 创意 社区 RTSP xop RTP RTSPServer 推流 视频 flutter 笔记 C 环境变量 进程地址空间 智能路由器 dell服务器 windows golang 后端 IIS .net core Hosting Bundle .NET Framework vs2022 rabbitmq es jvm websocket php html 深度学习 经验分享 android docker oceanbase rc.local 开机自启 systemd 麒麟 ecm bpm elasticsearch jenkins AI 爬虫 数据集 conda 机器学习 c++ 深度优先 图论 并集查找 换根法 树上倍增 ddos ollama llm chatgpt 大模型 llama3 Chatglm 开源大模型 zotero WebDAV 同步失败 代理模式 ansible playbook vue.js audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 vim java-ee YOLO bash sql KingBase spring 银河麒麟 kylin v10 麒麟 v10 目标检测 计算机视觉 spring boot 面试 性能优化 jdk intellij-idea 架构 tomcat ESP32 LDAP nuxt3 vue3 实时音视频 filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 Docker Compose docker compose docker-compose 自动化 maven intellij idea .netcore dubbo 容器 运维开发 统信 国产操作系统 虚拟机安装 .net 低代码 gitlab 多线程服务器 Linux网络编程 pillow live555 rtsp rtp json html5 firefox kubernetes 学习方法 程序人生 c语言 vscode 代码调试 ipdb DeepSeek-R1 API接口 c# springsecurity6 oauth2 授权服务器 token sas Flask FastAPI Waitress Gunicorn uWSGI Uvicorn prometheus kvm 无桌面 命令行 串口服务器 Hyper-V WinRM TrustedHosts apache matlab YOLOv8 NPU Atlas800 A300I pro asi_bench 搜索引擎 Deepseek mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 蓝耘科技 元生代平台工作流 ComfyUI 电脑 go redis 开源 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 ESXi XFS xfs文件系统损坏 I_O error shell 磁盘监控 AI编程 前后端分离 jupyter 软件工程 web安全 服务器配置 生物信息学 openEuler VMware安装Ubuntu Ubuntu安装k8s k8s git gitea minio mysql离线安装 ubuntu22.04 mysql8.0 jar kylin qt arm 嵌入式硬件 大数据 FunASR ASR 佛山戴尔服务器维修 佛山三水服务器维修 file server http server web server ssl https 僵尸进程 策略模式 单例模式 集成学习 集成测试 Invalid Host allowedHosts vue 远程连接 rdp 实验 远程工作 fpga开发 Qwen2.5-coder 离线部署 负载均衡 hive Hive环境搭建 hive3环境 Hive远程模式 mysql gitee Wi-Fi Spring Security microsoft 黑客 计算机 腾讯云 ISO镜像作为本地源 flash-attention 报错 Dify mybatis 安装教程 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 学习 缓存 职场和发展 交换机 硬件 设备 GPU PCI-Express UOS 统信操作系统 yum SysBench 基准测试 transformer 游戏服务器 Minecraft MNN DeepSeek Qwen 信息与通信 ip 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 音乐服务器 Navidrome 音流 媒体 系统安全 Ubuntu Server Ubuntu 22.04.5 Linux 微信 远程桌面 gaussdb ffmpeg 音视频 xss 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 pip H3C 飞牛NAS 飞牛OS MacBook Pro AIGC pppoe radius 软件需求 arm开发 ocr 命令 AI agent 硬件架构 系统架构 思科模拟器 思科 Cisco 云服务 Reactor 设计模式 C++ kind 华为云 物联网 react next.js 部署 部署next.js QQ 聊天室 spring cloud 单片机 温湿度数据上传到服务器 Arduino HTTP 其他 银河麒麟服务器操作系统 系统激活 googlecloud muduo X11 Xming 小程序 弹性计算 虚拟化 KVM 计算虚拟化 弹性裸金属 博客 游戏程序 stm32 社交电子 EMQX MQTT 通信协议 远程登录 telnet 1024程序员节 Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 uni-app 漏洞 ios 安全威胁分析 vscode 1.86 SSH Xterminal c virtualenv MacOS录屏软件 Samba SWAT 配置文件 服务管理 网络共享 ruoyi 服务器繁忙 备选 网站 api 调用 示例 银河麒麟桌面操作系统 Kylin OS 国产化 DeepSeek行业应用 Heroku 网站部署 postman mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 hugo rpc 边缘计算 智能硬件 AutoDL IIS服务器 IIS性能 日志监控 田俊楠 国标28181 视频监控 监控接入 语音广播 流程 SIP SDP 交叉编译 嵌入式 mosquitto 消息队列 r语言 数据挖掘 数据可视化 数据分析 word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 多进程 TRAE 程序员 机器人 华为od 医疗APP开发 app开发 sqlite TCP服务器 qt项目 qt项目实战 qt教程 openssl 密码学 GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 5G 3GPP 卫星通信 模拟退火算法 kamailio sip VoIP 根服务器 clickhouse 数据库系统 kafka hibernate remote-ssh sqlserver junit Agent ukui 麒麟kylinos openeuler W5500 OLED u8g2 微服务 chfs ubuntu 16.04 云原生 ci/cd 框架搭建 宝塔面板 同步 备份 建站 企业微信 Linux24.04 deepin laravel ceph AI大模型 大模型入门 大模型教程 webrtc debian Nuxt.js 需求分析 规格说明书 豆瓣 追剧助手 迅雷 nas 内存 微信小程序 前端框架 WebUI DeepSeek V3 android studio unity3d springboot 火绒安全 飞书 孤岛惊魂4 aws 恒源云 tcp AD域 vSphere vCenter 软件定义数据中心 sddc RTMP 应用层 致远OA OA服务器 服务器磁盘扩容 express okhttp CORS 跨域 雨云 NPS open webui JAVA Java 单一职责原则 jmeter 软件测试 HCIE 数通 oneapi 大模型微调 重启 排查 系统重启 日志 原因 外网访问 内网穿透 端口映射 Headless Linux mongodb 计算机外设 XCC Lenovo asp.net大文件上传 asp.net大文件上传下载 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 测试工具 华为认证 网络工程师 移动云 MS Materials gateway Clion Nova ResharperC++引擎 Centos7 远程开发 FTP 服务器 embedding visualstudio zookeeper YOLOv12 SSL 域名 selete 高级IO firewalld 安全架构 AISphereButler LORA 大语言模型 NLP npm 驱动开发 硬件工程 嵌入式实习 WSL win11 无法解析服务器的名称或地址 微信分享 鸿蒙 Image wxopensdk eureka armbian u-boot pyqt 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 权限 EasyConnect Cline 编辑器 Linux PID RustDesk自建服务器 rustdesk服务器 docker rustdesk 黑客技术 流式接口 URL ftp ssrf 失效的访问控制 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 MI300x 交互 openwrt ux 多线程 vscode1.86 1.86版本 ssh远程连接 SSE zabbix excel LLM Web APP Streamlit hadoop big data opensearch helm xrdp string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap TrinityCore 魔兽世界 开发环境 SSL证书 sysctl.conf vm.nr_hugepages Python 网络编程 聊天服务器 套接字 TCP 客户端 Socket asm 数据结构 svn 崖山数据库 YashanDB HarmonyOS Next 源码剖析 rtsp实现步骤 流媒体开发 监控k8s集群 集群内prometheus uniapp Ubuntu 24.04.1 轻量级服务器 NFS redhat pdf 群晖 文件分享 CPU 主板 电源 网卡 odoo 服务器动作 Server action 雨云服务器 7z unix 银河麒麟操作系统 远程过程调用 Windows环境 av1 电视盒子 机顶盒ROM 魔百盒刷机 直播推流 服务器部署ai模型 rsyslog 3d 数学建模 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 网络结构图 毕设 Docker Hub docker pull 镜像源 daemon.json 微信公众平台 risc-v 中间件 C语言 远程 执行 sshpass 操作 ipython FTP服务器 v10 软件 联想开天P90Z装win10 DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 bootstrap ecmascript nextjs reactjs 向日葵 软考 ollama下载加速 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 minicom 串口调试工具 Cursor IDEA 统信UOS bonding 链路聚合 压力测试 tailscale derp derper 中转 网工 stm32项目 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 idm 课程设计 cursor MCP server C/S LLM windows日志 能力提升 面试宝典 技术 IT信息化 agi gpu算力 WSL2 pygame 小游戏 五子棋 iDRAC R720xd 命名管道 客户端与服务端通信 Unity插件 netty 图像处理 css3 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 alias unalias 别名 wsl sentinel 技能大赛 DevEco Studio cuda cudnn nvidia k8s集群资源管理 云原生开发 prometheus数据采集 prometheus数据模型 prometheus特点 ip命令 新增网卡 新增IP 启动网卡 iot RAGFLOW midjourney AI写作 相机 相差8小时 UTC 时间 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 烟花代码 烟花 元旦 AI-native Docker Desktop mcu 文件系统 用户缓冲区 源码 毕业设计 list 模拟实现 dba lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 混合开发 环境安装 JDK regedit 开机启动 bug fd 文件描述符 ros2 moveit 机器人运动 状态管理的 UDP 服务器 Arduino RTOS IM即时通讯 剪切板对通 HTML FORMAT devops 我的世界服务器搭建 基础入门 编程 加解密 Yakit yaklang 王者荣耀 mac postgresql selenium 干货分享 渗透测试 黑客工具 密码爆破 webgl web cocoapods xcode 大模型面经 大模型学习 技术共享 threejs 3D n8n dity make 我的世界 我的世界联机 数码 办公自动化 自动化生成 pdf教程 centos-root /dev/mapper yum clean all df -h / du -sh 考研 onlyoffice 在线office SenseVoice 京东云 流量运营 etcd 数据安全 RBAC 云电竞 云电脑 todesk yolov8 elk 阿里云ECS eclipse chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 dify 私有化 本地部署 Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 金融 BMC IPMI 带外管理 执法记录仪 智能安全帽 smarteye 影刀 #影刀RPA# 矩阵 线性代数 电商平台 gcc g++ g++13 图形化界面 pyautogui 游戏引擎 抗锯齿 MySql ui Erlang OTP gen_server 热代码交换 事务语义 firewall SSH 服务 SSH Server OpenSSH Server epoll glibc 远程控制 rustdesk trea idea visual studio code llama.cpp dns是什么 如何设置电脑dns dns应该如何设置 prompt 移动魔百盒 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 bot Docker USB转串口 CH340 Dell HPE 联想 浪潮 harmonyOS面试题 css less freebsd 邮件APP 免费软件 lio-sam SLAM cnn GoogLeNet iventoy VmWare OpenEuler cd 目录切换 测试用例 功能测试 .net mvc断点续传 AI作画 无人机 deepseek r1 Node-Red 编程工具 流编程 智能手机 apt 国内源 虚拟局域网 网络攻击模型 键盘 db tensorflow 个人博客 链表 政务 分布式系统 监控运维 Prometheus Grafana Windsurf xpath定位元素 iphone 代理服务器 edge浏览器 iftop 网络流量监控 windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 tcpdump gpt-3 文心一言 工业4.0 make命令 makefile文件 Open WebUI 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 显卡驱动 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK 端口 查看 ss grafana 网络用户购物行为分析可视化平台 大数据毕业设计 直流充电桩 充电桩 微信开放平台 微信公众号配置 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 具身智能 游戏开发 SEO hexo wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 鸿蒙系统 uv 序列化反序列化 显示管理器 lightdm gdm 安卓 wireshark 程序 阻塞队列 生产者消费者模型 服务器崩坏原因 AD 域管理 镜像 强化学习 网站搭建 serv00 jetty undertow Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 ROS 自动驾驶 NAS Termux 开机自启动 gradle easyui langchain 云服务器 裸金属服务器 弹性裸金属服务器 p2p linux环境变量 navicat 虚幻 实习 路径解析 线程 Netty 即时通信 NIO KylinV10 麒麟操作系统 虚拟机 Vmware P2P HDLC HTTP 服务器控制 ESP32 DeepSeek mamba Vmamba springcloud QT 5.12.12 QT开发环境 Ubuntu18.04 毕昇JDK Typore docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 游戏机 信号处理 性能分析 EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 micropython esp32 mqtt RAID RAID技术 磁盘 存储 iBMC UltraISO RAG 检索增强生成 文档解析 大模型垂直应用 vasp安装 查询数据库服务IP地址 SQL Server 金仓数据库 2025 征文 数据库平替用金仓 语音识别 半虚拟化 硬件虚拟化 Hypervisor 串口驱动 CH341 uart 485 linux驱动开发 bcompare Beyond Compare 模拟器 教程 code-server SVN Server tortoise svn 音乐库 飞牛 实用教程 算力 Radius wps pgpool mq rocketmq 业界资讯 nac 802.1 portal ABAP GCC Linux环境 银河麒麟高级服务器 外接硬盘 Kylin 物联网开发 outlook linux安装配置 rnn HAProxy EMUI 回退 降级 升级 rust腐蚀 Python基础 Python教程 Python技巧 做raid 装系统 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 知识库 RAGFlow 本地知识库部署 DeepSeek R1 模型 seatunnel CVE-2024-7347 VPS ue4 着色器 ue5 环境配置 Claude eNSP 网络规划 VLAN 企业网络 AnythingLLM AnythingLLM安装 中兴光猫 换光猫 网络桥接 自己换光猫 rag ragflow ragflow 源码启动 Kali iperf3 带宽测试 mariadb 深度求索 私域 网络穿透 ArkUI 多端开发 智慧分发 应用生态 鸿蒙OS dns log4j Ark-TS语言 单元测试 frp autodl anaconda 反向代理 腾讯云大模型知识引擎 OD机试真题 华为OD机试真题 服务器能耗统计 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm xml 换源 Debian can 线程池 echarts 传统数据库升级 银行 LLMs 智能音箱 智能家居 服务器数据恢复 数据恢复 存储数据恢复 北亚数据恢复 oracle数据恢复 cmos 元服务 应用上架 IPMITOOL 硬件管理 opcua opcda KEPServer安装 Xinference ros linux上传下载 健康医疗 互联网医院 wsl2 win服务器架设 windows server trae HiCar CarLife+ CarPlay QT RK3588 迁移指南 USB网络共享 VMware安装mocOS VMware macOS系统安装 crosstool-ng Playwright 自动化测试 繁忙 解决办法 替代网站 汇总推荐 AI推理 ssh远程登录 CDN 可信计算技术 鲲鹏 昇腾 npu deekseek 大数据平台 浏览器开发 AI浏览器 ssh漏洞 ssh9.9p2 CVE-2025-23419 bat wsgiref Web 服务器网关接口 flink nfs 信息可视化 网页设计 华为机试 skynet 多层架构 解耦 vmware 卡死 自定义客户端 SAS ardunio BLE linux 命令 sed 命令 Trae AI代码编辑器 webstorm etl IDE AI 原生集成开发环境 Trae AI GIS 遥感 WebGIS 分析解读 yaml Ultralytics 可视化 大大通 第三代半导体 碳化硅 回显服务器 UDP的API使用 状态模式 Windows ai工具 java-rocketmq ldap 服务器管理 配置教程 服务器安装 网站管理 LInux 信号 Kylin-Server Kali Linux 信息收集 h.264 自动化任务管理 项目部署到linux服务器 项目部署过程 小智AI服务端 xiaozhi TTS 服务器主板 AI芯片 jina 代理 WebRTC gpt web3 MacMini Mac 迷你主机 mini Apple rime 视觉检测 宠物 免费学习 宠物领养 宠物平台 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 perf open Euler dde 小艺 Pura X yum源切换 更换国内yum源 流水线 脚本式流水线 网卡的名称修改 eth0 ens33 双系统 cpp-httplib Linux find grep Google pay Apple pay composer IMM 产测工具框架 IMX6ULL 管理框架 adobe Linux的基础指令 IMX317 MIPI H265 VCU 环境迁移 开发 VMware创建虚拟机 视频编解码 milvus python3.11 dash 正则表达式 tidb GLIBC VR手套 数据手套 动捕手套 动捕数据手套 iis VSCode Logstash 日志采集 蓝桥杯 僵尸世界大战 游戏服务器搭建 远程看看 远程协助 输入法 知识图谱 HarmonyOS sqlite3 Anolis nginx安装 linux插件下载 cpu 实时 使用 ruby raid5数据恢复 磁盘阵列数据恢复 实时互动 keepalived 端口测试 sonoma 自动更新 ubuntu24.04.1 proxy模式 三级等保 服务器审计日志备份 架构与原理 chrome devtools chromedriver 工作流 workflow rclone AList webdav fnOS 多个客户端访问 IO多路复用 TCP相关API ArcTS 登录 ArcUI GridItem arkUI 软链接 硬链接 efficientVIT YOLOv8替换主干网络 TOLOv8 压测 ECS 实战案例 matplotlib camera Arduino 电子信息 主从复制 DenseNet 宕机切换 服务器宕机 Jellyfin IPv4 子网掩码 公网IP 私有IP SSH 密钥生成 SSH 公钥 私钥 生成 CrewAI 合成模型 扩散模型 图像生成 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors ShenTong 语法 safari 系统 DOIT 四博智联 防火墙 NAT转发 NAT Server Unity Dedicated Server Host Client 无头主机 超融合 历史版本 下载 安装 aarch64 编译安装 HPC OpenHarmony 真机调试 lua 捆绑 链接 谷歌浏览器 youtube google gmail 常用命令 文本命令 目录命令 树莓派 VNC GRUB引导 Linux技巧 图形渲染 ubuntu24 vivado24 thingsboard 黑苹果 域名服务 DHCP 符号链接 配置 sdkman sequoiaDB 性能测试 自动化编程 项目部署 西门子PLC 通讯 热榜 PX4 DNS 本地化部署 CentOS UDP 产品经理 MDK 嵌入式开发工具 论文笔记 sublime text arcgis searxng 网络药理学 生信 PPI String Cytoscape CytoHubba 渗透 玩机技巧 软件分享 软件图标 服务器时间 ping++ 运维监控 seleium 目标跟踪 OpenVINO 推理应用 figma leetcode 推荐算法 软负载 CLion uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 网络建设与运维 剧本 dock 加速 VS Code docker run 数据卷挂载 交互模式 AI Agent 字节智能运维 信创 信创终端 中科方德 粘包问题 嵌入式系统开发 curl wget deep learning 人工智能生成内容 grub 版本升级 扩容 conda配置 conda镜像源 拓扑图 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 C# MQTTS 双向认证 emqx nlp 大模型推理 openstack Xen 远程服务 车载系统 DBeaver Attention 大模型部署 minecraft 飞牛nas fnos 分布式训练 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 docker命令大全 x64 SIGSEGV xmm0 OpenSSH IO 存储维护 NetApp存储 EMC存储 嵌入式Linux IPC Cookie gnu kali 共享文件夹 内网服务器 内网代理 内网通信 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 Qwen2.5-VL vllm ubuntu20.04 开机黑屏 匿名管道 qemu libvirt hosts 网络爬虫 灵办AI 基础环境 多路转接 沙盒 系统开发 binder framework 源码环境 word spark HistoryServer Spark YARN jobhistory wpf Ubuntu共享文件夹 共享目录 Linux共享文件夹 论文阅读 neo4j docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 IO模型 网络搭建 神州数码 神州数码云平台 云平台 UOS1070e 风扇控制软件 rpa 数据仓库 kerberos visual studio CentOS Stream SRS 流媒体 直播 vr TCP协议 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 程序员创富 Linux的权限 搭建个人相关服务器 聚类 李心怡 MVS 海康威视相机 ai小智 语音助手 ai小智配网 ai小智教程 esp32语音助手 diy语音助手 docker部署Python xshell termius iterm2 数据库开发 database swoole Redis Desktop 内网环境 服务网格 istio js fast 大模型应用 离线部署dify TrueLicense triton 模型分析 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 企业网络规划 华为eNSP docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 增强现实 沉浸式体验 应用场景 技术实现 案例分析 AR Deepseek-R1 私有化部署 推理模型 欧标 OCPP 鸿蒙开发 移动开发 DocFlow PVE 虚幻引擎