网络层之IP协议

在讨论传输层 时, 我们都只讨论了发送方和接收方 的问题, 而没有讨论中间的网络形态的问题. 也就是数据包如何从主机传送到主机的?

如图, 主机B发送数据到主机C, 发送报文需要进行路径选择, 主机B-> F-> G-> H-> C-> D -> 主机C 这条路径是如何被选择出来的?

IP协议

IP协议 是网络层最重要的协议, 它具备一种能力 : 在复杂的网络环境确定 一个合适的路径将数据从主机发送给主机. 而TCP协议提供的一种策略: 将数据可靠传输的策略. 而这些策略要落地和执行, 都是要由IP协议执行的.

一. 基本概念

主机: 配有IP地址, 但是不进行路由控制的设备(其实也可以进行路由控制);

路由器: 即配有IP地址, 又能进行路由控制;

节点: 主机和路由器的统称

IP地址: 目标网络(网络号) + 目标主机(主机号)

任何一台主机一定都是存在于某一个子网之中的, 数据包经过转发到了不同的子网, 最后到达了目标网络中的目标主机.

在学习网络时要时刻意识到, 网络不是凭空产生的, 而是有人为我们专心精心设计过的, 如同OS一样.

二. IPV4协议头格式

提到协议格式, 就要提到两个问题:

4位头部长度 和 16位总长度

1.如何进行报文和有效载荷的分离? 这里4位头部长度16位总长度就解决了这个问题.

类似TCP, IP报头也有4位首部长度, 且单位也是 4 字节. 因此IP报头的大小为 [0, 15] * 4 = [0, 60], 标准的报文长度是 20 (不加选项) .

16位总长度 = 报头长度 + 有效载荷长度, 由于报头长度已知, 所以有效载荷长度也知道了, 分离问题解决.

8位协议号

8位协议表示上层协议的类型, 如TCP/UDP等

第二个问题是: 报文如何向上交付(分用)? 这就很容易解释了, 发送方如果是基于TCP通信那就会在协议字段填TCP, 接收方在IP层解包向上分用时, 根据发送方填入的协议号分用给特定的传输层协议即可.

4位版本号

4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4; 而IPv6是 6.

IPv4地址为4字节, IPv6地址为16字节. 由于全球 IP 地址增长迅速, IPv4 地址已趋于 耗尽, 因此后来引入了 **IPv6.**IPv6在中国的发展最好, 但是由于与IPv4的兼容性不好没有被广泛使用.

8位服务类型

这个字段了解, 知道TOS字段的四个选项即可.

3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0).

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

8位生存时间

TTL表示报文在路径转发的过程中, 经历的路由器的最大报文跳数. 一般是64. 每次经过一个路由, TTL -= 1, 一直减到 0 还没到达, 那么报文就会被丢弃了.

当网络中存在路由环路时, 数据包可能会一直在网络中循环转发, 造成资源浪费甚至网络拥塞. 这个字段主要是用来防止数据包在路由环路中无限转发的.

16位首部校验和

16位头部校验和 使用CRC循环冗余码进行校验, 来鉴别头部是否损坏, 因为:

  1. IP 是无连接, 尽力而为的协议, 只负责将数据包从源 IP 传输到目标 IP,

2.数据完整性检查由上层协议(如 TCP/UDP)负责, 避免重复校验.

32位源地址 和 32位目标地址

这两个地址用于**标识通信的两端主机.**不用多说

16位标识, 3位标志 和 13位分片偏移

这三个字段专门用于进行 IP报文分片操作. 先来说说分片是什么? 为什么要分片?

  1. 报文有可能需要分片是因为数据链路层协议 限定的单帧有效载荷不能超过最大传送单元(MTU), 大部分是1500字节. 通过 ifconfig 可以查看到:
  1. 而网络层的数据是传输层 提供的, 因此这就可以解释为什么TCP的滑动窗口中的报文不能一次性全部发出去, 而是需要以 MSS (MSS = MTU - IP 头部 - TCP 头部) 为单位分批发出去. 这样做的好处是 避免 IP 层的分片, 提高网络效率.

3.IP分片是不好的, 而且应该成为网络通信的小概率事件, 因为如果报文的一个分片丢失, 接受方就会丢弃整个报文, 即使其它分片被成功接收也没用, 所以分片就相当于增加了报文重传的概率, 潜在地降低网络效率. 于是传输层的 MSS 也可以解释为TCP为了可靠传输进行的一个隐性策略.

  1. 上面只是为了避免分片的策略, 但还是要有策略去应对分片的,如果TCP就给了IP一个超过MTU的报文, MAC桢协议又没法处理, IP就需要分片.

  2. 既然有分片那就有重组 , 分片 只能由当前主机的IP协议来做, 重组只能由对等层实体来做.

那么如何进行分片呢? 这就需要这三个字段了.

(1) 16位标识: 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的. 用于重组的时候去识别该报文分片.

(2) 3位标志

  • 第一位为保留位, 不使用且为0。
  • 第二位为 1 表示禁止分片, 若此时报文长度超过MTU, 则IP会丢弃报文. 若为 0 表示允许分片, IP正常分片即可
  • 第三位表示更多分片, 对于一个TCP报文的分片, 最后一个分片该位为0, 其他均为1. 主要用来识别该分片是否是最后一个分片

(3) 13位片偏移

  • 如果分片, 那么表示分片的有效数据部分相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置 . 由于单位是8字节, 所以是由实际数据大小/8得到的. 因此, 除了最后一个报文之外 , 其他报文的长度必须是8的整数倍 (否则报文就不连续了)
  • 若不分片, 对应报文在原始报文的偏移量为0

举个例子:

假设TCP向IP传输了一个 2980 字节的报文, 报头为标准报头(20字节)

IP给TCP报文加上自己的标准报头(20字节), 发现IP报文总长为3000字节, 超过了MTU的1500字节, 需要分片.

每个分片都是需要一个IP报头的, 因此:

第一片:IP报头20字节, 有效载荷1480字节, 1480字节中还包括TCP的报头, 总长度1500字节.

第二片:IP报头20字节, 提取后面的有效载荷1480字节, 总长度1500字节.

第三片:最后剩下有效载荷20 字节,再加上IP报头20字节,总长度40字节.

了解了分片之后, 关于重组也有几个问题:

  1. 接收方怎么知道一个报文被分片了?
  • a. 如果分片标志位为1, 表示该报文被分片过
  • b. 如果分片标志位为0, 若片偏移大于0, 表明该报文是分片的最后一个, 否则没有分片

2.同一个报文的分片怎么全部识别出来的?

每一组分片的报文的16为标志(ID)都相同, 对比ID即可

3.报文如何排序,如何得知报文有没有收全

  • a. 第一个报文的偏移量为0, 更多分片为 1
  • b. 最后一个报文的偏移量大于0, 更多分片为 0
  • c. 对于中间报文, 前一个报文的偏移量 + 其自身长度 = 后一个报文中偏移量, 然后按 片偏移 进行升序排列即可

IP分组就介绍到这.

总结

综上, 我们可以看到TCP和IP在格式上有点像, 都采用了 **固定格式的头部(20字节) + 可选选项 +数据部分.**此外,

  • 都有"源和目的"字段
  • 都包含"首部长度"和"校验"字段

都属于 TCP/IP 协议族, 宗旨都是为了保证网络的核心能力, 把数据可靠地从A主机发送到B主机.


理解IP报文在系统中向下交付

当报文从传输层向下交付给网络层时, 发送了两步关键操作:

  1. 移动data指针添加ip报头,

  2. 将报文从TCP 发送队列 -> IP 发送队列:

三. 网段划分

举个例子, 通俗解释为什么要网段划分? 假如小明在学校捡到一张学生证, 上面只有他的学号信息, 如果想要归还给失主, 遍历学校的每个人(单个排除法)查找效率太低下, 而学号是唯一的, 其一般的格式为: 学院专业信息+个人标识, 因此就要想办法提高查找效率, 而查找的本质是排除, 所以就可以利用学号的格式制定高效的排除策略.

学校(网络)中有很多学院(子网), 假设每个学院都有各自的负责人(路由器), 负责人存储了学院每个学生的信息(路由表), 且他们之间也有彼此的联系方式, 于是小明把学生证先交给自己学院的负责人, 负责人通过比对发现不是自己学院的学生, 于是就一次性排除了此学院的一群人, 而负责人通过学号去定位目标学院(目的网络), 又排除了**好几群人,**目的学院的负责人再进行排除, 最终找到了失主(目的主机).

放到IP协议中也是一样, 学号可以看作IP地址. 各学院可以看作子网, 每个院的负责人可以看作路由器, 负责人的群可以看作公网, 丢失钱包的人可以看作目标主机. 为了跨网络高效的数据传输, 所以要进行子网划分, 以群为单位进行高效定位**.**

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

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

不同的子网其实就是把网络号相同的主机放到一起 . 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致 , 但是主机号 必须不能 和子网中的其他主机重复 , 其中路由器的主机号通常是 1, 综上还可以看出路由器的主要功能 之一是进行路由选择和路由转发.

那么子网的构建是谁来作的呢? 是路由器.

谁来管理子网中的IP地址呢? 也是路由器 , 因为手动管理子网内的IP, 是一个相当麻烦的事情, 所以路由器一般都带有DHCP功能, 自动的给子网内新增的主机节点分配IP地址, 因此路由器也可以看做一个DHCP服务器.

管理肯定是涉及到程序的, DHCP是一种应用层协议, 所以路由器也具有应用层的功能.

此外, 路由器还支持其它的应用层协议比如http, 路由器背面一般有 IP 和 账号密码, 浏览器输入IP即可进入管理界面, 进行一些设置.

因此路由器虽然主要工作在网络层, 但是其功能不仅限于网络层, 还有应用层.

介绍完IP格式和路由器功能后, 现在正式介绍网段划分:

1.早期分类模式

最早, IP地址分为五类, 因为IP是有限的, 也是一种需要竞争的资源, 所以IP的划分是有多种划分依据的, 比如特定的组织机构, 或根据当地人口密度和基建情况, 因此这是要把IP进行分类的一种理由.

  • A类:IP的第一个比特位为0, 后面7个比特位为网络号, 剩余24位为主机号. 最多能构建2的7次方个网络, 每个网络最多可容纳2的24次方个主机(0.0.0.0到127.255.255.255)
  • B类:IP的前两位固定位10, 后面14个比特位为网络号, 剩余16位为主机号. 最多能构建2的14次方个网络, 每个网络最多可容纳2的16次方个主机.(128.0.0.0到191.255.255.255)
  • C类:IP的前三位固定110, 后面21个比特位为网络号, 剩余8位为主机号. 最多能构建2的21次方个网络, 每个网络最多可容纳2的8次方个主机.(192.0.0.0到223.255.255.255)
  • D类和E类只需知道前三个和前四个比特位为1, 后一个为0, 能够构建的网络更多, 每个网络能容纳的主机数更少.(D类224.0.0.0到239.255.255.255,E类240.0.0.0到247.255.255.255)

随着Internet的飞速发展, 这种划分方案的局限性 很快显现出来, 大多数组织都申请B类网络地址 , 因为C类容纳的主机比较少, 而A类网络号又太少, 所以B类更适合被一般的组织申请. 这导致B类地址很快就分配完了, 而A类却浪费了大量地址(因为一个网络通常容不下这么多主机)

补充: 申请ABC类IP地址的角色并不是个人组织, 而是运营商, 他们在进行网络基础建设时需要使用.

2. CIDR

针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):

这里引入子网掩码 (subnet mask)来区分网络号和主机号:

  • 子网掩码也是一个32位的正整数.
  • 将IP地址和子网掩码进行 "按位与 " 操作, 得到的结果就是网络号;
  • 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关

以一个C类网的IP格式为例, 它正常来说子网掩码是255.255.255.0, 假如将子网掩码设置为 255.255.255.192, 则相当于抽出了一部分主机号去充当网络号, 这样在一个子网中又划分出四个子网, 但是每个子网的主机更少了, 且实际的IP总量没变.

经过这样的划分之后, 可以通过子网掩码去控制子网数量和主机数量的需求平衡, 提高了IP地址的利用率, 减少浪费.

3.IP地址数量不足的现状

CIDR正式能提高了IP地址利用率, 但是IP地址的绝对数量并没有增加, 仍然处于严重不足的状态

这时候人们又提出了三种新的技术解决这个问题:

  • 动态分配IP地址: 只给接入网络的设备分配IP地址, 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的. 也就是说IP地址可以被复用, 但这种方案也只是杯水车薪.
  • NAT技术: 后面会重点介绍
  • IPv6: IPv6用16字节128位来表示一个IP地址, 这样就大大增加了IP地址的数目, 从根本上解决了问题. 它由中国发明并完善, 而且在国内我们很多计算机都已经使用了IPv6. 但IPv4还是国际主流, 再加上IPv4早已被编入主流操作系统中, 所以目前IPv6的推行还有很大困难.

4.特殊的IP地址

  • 主机号全零: 主机号为全0的IP代表网络号, 如192.168.128.0, 这个IP地址代表这个局域网,
    不能绑定主机.
  • 主机号为1: 如192.168.128.1代表当前子网的默认路由器(入口路由器), 所以这个IP地址也不能绑定主机.
  • 主机号为全1: 如192.168.128.255表示广播地址, 表示把数据发到本网络中的所有的主机上, 同样不可绑定主机
  • 127.0.0.1: 表示本地环回,数据不会发送到网络上,而是经过网络的分层处理再被本主机接收,以前用过很多次了。

5. 运营商

我们已经知道, 通过家用路由器可以管理一个局域网内主机的IP, 而家用路由器还连着**运营商路由器,**运营商是做什么的? 在现实中, 我们的网段划分都是经过设计的, 所以说互联网是一个被设计过的世界. 那么设计者是谁呢?

互联网的设计者, 主要是全球的通信运营商, 在中国, 主要由移动、电信、联通三大运营商主导, 其他国家也有各自的运营商(如美国的 AT&T、Verizon,欧洲的 Vodafone 等)

上网的背后, 都是由大量的网络基础设置建设来支撑的, 而运营商就负责提供**网络基础设施,**包括:

  • 骨干网建设:大规模光纤网络、海底光缆、基站等。
  • IP 地址分配:网络资源划分,保证不同地区、不同用户能够连接互联网。
  • 数据传输与流量管理:优化网络流量,提高网络稳定性和效率。

这些工作的特点是前期投入高、回报周期长, 涉及大量基础设施建设, 因此往往需要政府的政策支持, 使其具备一定的行业垄断性.

回顾历史, 21 世纪初 , 随着**智能手机的兴起,**移动互联网逐步发展:

  • **早期, 网络资费高昂,**由于基础设施尚未完善, 流量资费对普通用户来说较贵, 限制了互联网的普及
  • 运营商降低资费, 推动普及, 为了扩大市场规模, 运营商逐步降低资费, 推出各种流量套餐**,**让更多人负担得起网络费用
  • 互联网产业随之繁荣**,** 当用户规模足够大时, 互联网服务行业(如电商、社交媒体、云计算等)蓬勃发展, 从而形成了今天的数字经济生态.

由此我们可以知道, 我们主机发送和收到的报文, 都必须经过运营商. 既然我们用户是运营商的客户, 那么反过来, 互联网公司也是运营商的客户, 也需要向运营商付费.

所以我们如果欠费了, 运营商就可以拦截我们的报文, 不允许接收和发送报文; 既然运营商能拦截报文, 也就可以通过"无形的墙"拦截非法目的地址的请求, 那么我们使用魔法的行为是在 cheat yys.

6. 私有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);

比如云服务器通过ifconfig查看ip, 查询到的是内网(私有)IP:

windows下ipconfig, 也能查到内网IP:

依着这个图继续说.

WAN口IP和LAN口IP

每个路由器 通常都连接两个不同的网络, 因此它需要配置 **两个IP地址,**分别用于管理各自的网络接口:

  1. **WAN口IP(**广域网 IP): 用于连接上一级网络 (例如, 运营商或上级路由器)

  2. **LAN口IP(**局域网 IP): 用于管理和提供本地网络 (如家庭或企业局域网)

以上图家庭路由器为例:

LAN口 IP:192.168.1.1/24 , 这是 家庭局域网的网关地址, 通常用于分配内网 IP 并管理家庭设备的通信, 该网段(192.168.1.0/24)下的设备, 例如手机、电脑,会被分配 IP 192.168.1.X

WAN口 IP:10.1.1.2/24 , 这是连接运营商/ 上级路由器的 IP**,** 属于运营商内部网络/ 公网, 该 IP 地址是由上一级网络(ISP 或更高层网络设备)分配的, 这个地址用于**NAT 转换,**将家庭内网设备访问互联网的数据进行地址转换.

那么是否报文从家用路由器出去后, 就到了公网去了?

不是, 而是到了一个由运营商组织的更大的内网之中, 因此真实的网络情况 是, 公网+私网 (家用网络和运营商私网)构建的网络拓扑环境.

  • 私网中, 一个子网中所有节点的IP地址都不能相同, 要具有唯一性. 但不同子网中的IP地址可以相同.
  • 公网中, IP地址必须具有唯一性, 不论属于哪个子网.
NAT 转换

NAT转换是解决IP地址绝对数量的关键技术, 而且现在依然在使用, 理解NAT就能理解 公网+私网网络拓扑体系了.

假设, 我们现在要用我们的电脑给服务器发送一条数据, 我电脑的内网IP地址为192.168.1.201/24,服务器的公网IP地址为 122.77.241.3/24。

如果将192.168.1.201/24作为源IP, 122.77.241.3/24作为目的IP填入报头且传输过程中不做更改, 就会发生下面的问题:

电脑会把报文发送给默认网关, 路由器进行路由选择之后选择出来一条发送路径:

但服务器对数据做处理并将处理后的数据放入IP报文内, 并将目的IP设为192.168.1.201/24, 这是一个内网地址, 而内网地址是可以在不同的子网中重复使用的, 所以当数据发到运营商路由器那里时, 运营商路由器维护的子网下会有很多这样的IP, 无法进行路由选择. 此时报文有来无回!

为了解决公网和内网的通信问题 , 我们引入了**NAT(**网络地址转换)技术

内网中的主机需要和公网进行通信时, 路由器会自动将IP报头中的源IP替换成该路由器的WAN口IP:

接着, 我们看看数据的接收:

服务器将处理后的数据经过封装, IP报头中的源IP是一个公网IP122.77.241.3/24, 目的IP是一个公网IP122.77.241.4/24. 由于两个地址都是公网IP, 它们在公网内具有唯一性. 所以, 发送到广域网后是可以到达运营商路由器的. 但该数据到达运营商路由器后, 由于此时报文的 目的IP 是运营商路由器的WAN口IP. 那么, 运营商路由器怎么知道哪份数据应该发送给哪个主机呢?

这个问题就需要用到数据链路层去解释了.

四. 路由

在复杂的网络拓扑结构中找出一条通往终点的路线称为路由, 数据从一个节点传递到另一个节点称为一跳.

首先我们需要明确**, 当IP数据报到达路由器以后:**

  • 如果目的IP在本网段内直接将数据发送给目标主机.
  • 如果不在本网段内, 就要查路由表, 选择一个端口发送出去, 给它上一层网络的路由器.

那么路由器是如何判断当前这个IP数据报该发送到哪里呢? 也就是路由表具体应该怎么查呢?

在Linux上, 使用route指令可以查看当前机器上的路由表, 可见我们的计算机也有路由选择功能, 不过这里只可以选择本子网内和外部两个方向:

  • 路由表的Destination表示目的IP地址, Gateway是下一跳的IP地址, Genmask是子网掩码. Iface是发送接口, 通过网线和对应网络相连. 这台主机有两个网络接口(Iface),一个网络接口eth0连到192.168.10.0/24网络,另一个网络接口eth1连到192.168.56.0/24网络。
  • Flags中的 U 表示此条目有效 , G 标志表示此 条目 的下一跳地址是某个路由器 的地址, 比如上图的第一条目默认路由; 没有 G 的条目表示目的网络地址是与本机接口直接相连的网 络, 不必经路由器转发, 比如上图第二条表示本地子网路由
  • default表示缺省网段, 图中为0.0.0.0, 此条目是在查过路由表中其它条目后发现目的网络都不匹配, 那么就会把报文转发给 default 这行的 gateway 网关. default设置为0.0.0.0, 且Genmask设置为0.0.0.0, 所以任何IP地址 & 0.0.0.0 得到的网段都是0.0.0.0, 保证了此条目最终一定能被匹配到.

以下面这个路由表举个例子, 看看路由是如何工作的:

当一个报文来到节点后,会经过四步完成数据报文的发送:

  • 遍历路由表
  • 目的IP和路由表中的每一行的子网掩码按位与, 得到目的网段.
  • 目的网段与Destination进行对比, 如果比对成功则通过Iface接口发出报文, 否则就继续比对, 最后一定能与默认路由相匹配.

例一: 如果要发送的数据的目的IP是 192.168.56.3

首先, 目的IP会跟第一行的子网掩码 255.255.255.0 得到网络号192.168.56.0, 结果与第一行的目的网络地址不符, 然后和第二行的目的网络地址比对相符, 因此该节点将会把数据从eth1接口发送出去。

由于192.168.56.0/24正是与eth1接口直接相连的网络, 因此节点可以在该网络中查找目的IP是否有主机占用, 如果有主机使用该IP地址, 节点会把数据发送到该主机上。

例二:如果要发送的数据包的目的地址是 202.10.1.2

数据依旧从第一行到倒数第二行通过子网掩码进行按位与运算,并与路由表前几项的网络号进行对比。我们发现它们都不匹配,说明该数据不应该发送到该节点的网段。

所以, 数据会按最后一行的缺省路由, 从eth0接口发往IP地址为192.168.10.1的路由器, 由IP地址为192.168.10.1的路由器根据它的路由表决定下一跳的地址.

路由表生成算法

上面我们是用现成的路由表去模拟路由选择的过程, 路由表是要经过一定的算法来生成的.

路由表可以由网络管理员手动维护(静态路由), 也可以通过一些算法自动生成(动态路由), 暂不介绍.

相关推荐
Waitccy1 小时前
护网期间监测工作全解析:内容与应对策略
网络·安全·web安全·网络安全·信息与通信
小镇敲码人1 小时前
PCRE2 站内搜索引擎项目
linux·网络·c++·搜索引擎
网络安全-老纪1 小时前
网络安全工程师逆元计算 网络安全逆向
linux·服务器·web安全
文档加密Ping321 小时前
什么是网络准入?十种常见的网络准入解决方案分享!
大数据·网络·安全
Forevermoremo1 小时前
uniapp页面列表,详情返回不刷新,新增或编辑后返回刷新
java·服务器·uni-app
隔壁小查2 小时前
【计算机网络】网络编程
网络·计算机网络
矛取矛求2 小时前
理解操作系统(一)冯诺依曼结构和什么是操作系统
linux·运维·服务器
狼头长啸李树身2 小时前
今日春分节气,是旅游旺季的起点
网络·旅游·媒体
Ronin-Lotus3 小时前
嵌入式硬件篇---蓝牙模块
网络·嵌入式硬件·c·蓝牙
浪淘沙jkp3 小时前
在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问
运维·服务器·ubuntu·wsl2·视频教育网