超越LAN之外——Internetworking

基本上我们前面所接触的都是在LAN的范围﹐但时至今日的网络﹐尤其是 Internet 的蓬勃发展﹐我想也很少网络会独立在局域之内吧﹐所以了解一下网路和网路之间的通讯是势在必行的了。

在某些定义来看﹐一个 LAN 就好像一台放大比例的电脑﹐只不过更加複杂而已﹔那麽在 LAN 和 LAN 之间组建网路﹐我们称之为 internetworking 。其应用非常广泛,比如﹕

  • 图书馆可以通过它安排联网借还
  • 可以将各医院的病人记录集中管理
  • 银行可以通过它进行转帐
  • 报馆之间可以进行新闻交换
  • 旅行社可以为客人预定全世界的机票和座位

可以说 internetworking 所带来的便利远超过我们能够想象的。

Internetworking设备

增益器(Repeater)
我们已经在前面讲述过 repeater 的功能了﹕它是用来放大传输信号的。当我们的网路线路过长的时候﹐信号会因为损耗而减弱甚至丢失﹐这样的话﹐repeator 就可以在中间帮我们将信号接收下来﹐然后把它放大重新继续传送以达到我们预定的距离。
准确来讲﹐repeater 不能算是 internetworking 的设备﹐仅可以算是网路的延伸设备﹐基本上它做到的只是重复它所收到的信号而已。如下图:
集线器(Hub)
Hub 和 Repeater 都是 OSI 中第一层(Physical) 的设备。在技术上差不多是同一样的动西,只不过在早期的 physical bus topology 上,我们称之为 repeater :通常有两各 port 分别连接两个 segment (一个 segment 就是一个无需借助 Internetworking 设备连接的彼此相邻的电脑群体)。而 Hub 则常见于 physical star topology 上,有多各 port ,分别连接主机/设备或是其它 Hub 。功能上,两者都是一样的:将信号放大,再重送一遍。或许,我们可以简单的将 hub 的每一各 port 都视为 repeater 就是了。
桥接器(Bridge)
        它是一个硬体或软体用来连接不同的网路区段(segment)的设备。例如﹐您可以用一个 bridge 来连接两个 Ethernet segment﹑或连接一个 Token Ring segment 到一个 Ethernet segment﹑或连接一个 Mac segment 到一个 PC segment。
只要网路间使用相同的传输协定(如 IPX 或 TCP/IP )﹐bridge 就可以成功的将任何网路连接到其它网路﹐它们之间的沟通就无需理会对方使用的是何种网路硬体了。一个 bridge 的资料传输主要有三个步骤﹕

  1. Discovery﹐就是 bridge 的任意一端是否有资料到达
  2. Filtering﹐接著 bridbe 过滤(filter)资料,并决定是否需要传送到另一端
  3. Forwarding﹐然后 bridge 将资料传送(forward)给目的端位址,若使用的格式不一致,则同时进行转换。

其实 bridge 是很简单的﹐就像一座桥架于不同的网路之间﹐您可以将它想象成两个国家之间的边境桥梁﹐而两国都使用著自己各自的语言﹕一边说 Token 语﹔另一边说 Ether 语。由于两国过从甚密﹐然语言又互不相通﹐所以他们就聘请了一个传译员坐在桥中间﹐再另外聘两个跑腿各站两边。当说 Token 语的跑腿来告诉传译员他们有信息传到另一边﹐传译员首先将地址翻译成 Ether 语﹐再将信息重新装进 Ether 国的信封﹐然后叫说 Ether 语的跑腿将信送到该地址去。传译员一点也不在乎信是从哪边过来的﹐他只关心的是地址之准确性就行。

另外﹐bridge 除了是一个传译员之外﹐它还可以充当交通警察。当我们发现网路过于繁忙的时候﹐那麽我们就可以将网路分成两个或多个 segment﹐而 bridge 就可以帮助网路更好的管理交通和解决瓶颈问题了。事实上,我们也经常用 bridge 将一个相同类型的大 segment 切成多个小 segment ,利用其 filtering 的功能将网路广播降下来,以提高整体网路的传送能力。请大家复习一下 CSMA/CD 就知道 bridge 的好了:

若没有 bridge 的 segment 中(或是用 repeater 连接两个 segment),当任意一台主机在传送资料的时侯,其它主机就要等(CS)﹔若是两台主机在同时进行传送,就会发生碰撞而导致重送(CD)。如下图:
若在中间部署一台 bridge 的话,因为 bridge 的 filter 能力,让不同 segment 的信号互不干绕(除非两端跨 segment 传送)。因此,对 CS 与 CD 都有很大提升,当节点越多的时侯,bridge 的好处就更明显:
交換器(Switch)
        当您了解 Repeater 与 Bridge 的差异之后,您大概也能理解 Hub 与 Switch 的差别:我们知道 hub 就好比一个多 port 的 repeater ,那么 switch 大概就是一个多 port 的 bridge 而已。当然了,现在的 switch 除了拥有自己的 switch table 而做到类似 bridge 的过滤功能外,还有自己的 CPU 与 Memory ,提供不同的 queue(队列)及运算能力,在整体上提高整个网路的传送速度。在 switch 上所采用的传送方式,大致分 store & forward 及 cut through 两种技术(通常同时提供)。再加上全双工(full duplex ) 的设计,避免了共享单一传送媒体所导致的冲突(collision ),在某一程度上,将 CSMA/CD 的弊端作了最大的化解(甚至有人认为连 CSMA/CD 都不存在了)!
通常来说,Switch 是用来建构高速以太网( fast ethernet,最低为 100Mbps ) 的设备,不太可能用 hub(repeater) 来连接的。在我们的应用中,switch 也可以工作于 OSI 模型中的不同层级:L2、L3、L4、L7 等。不同的层级,在封包的处理能力上也大大不同,若没有特别指明,一般是指 L2 Switch 。就算是同层级的 Switch,不同 的功能其价格上也差异很大,比方说,是否能切割 VLAN 、是否可作 Truncking(集群)、是否支援 SNMP、CPU/RAM/演算法、等等… 总之,一分钱一分货就对了!只是要看钱是否花得其所而已。
路由器(Router)
        和 bridge 差不多﹐router 是一个用来将资料从一个网路主机传送到其它网路主机的硬体或软体设备。
在使用 bridge 的时候﹐它的工作较累,就算是同一国度裡面的人民相互分享资料﹐传译员也要先检查一下﹐确定是否要进行翻译传递。就算真的不需传递,bridge 也要进行判断。这方面﹐router 比 bridge 聪明些﹐也不像 bridge 那样劳碌。在 router 上面,如果资料是传递到相同的国度里去﹐router 就根本无需理会﹐而让资料按其正常的方法传递﹐就如根本没有 router 存在一样。只有那些需要翻译的资料﹐router 才会理会。因为在 routing 的层面来说,每一台主机在将封包丢出去之前,就已自行判断了该封包是否需要传给 router ﹔但在低层的硬体传输层面来说,信号是以广播方式在共享媒体上传输,bridge 必需比较完两端的实体位址才能决定是否要 filter/forward,因此bridge是工作在较低的数据链路层,而router工作在L3网络层 。从 OSI 层级来分﹕bridge 属于第二层,只要上层的传输协定是一致的,那 bridge 就能让不同的硬体 segment 沟通。而 router 则是第三层的设备,它所负责的是传输协定本身的沟通。换句话说,bridge 跟本不必操心也读不懂传输协议的罗辑位址(IP地址)长甚麽样子,它只读得懂底层的硬件位址(MAC地址)﹔反过来,router 只需读懂罗辑位址就行,而跟本不需要知到硬体位址如何,因为, router 在判断完罗辑位址后,真正的传输工作,则往下交给底层的设备完成。这需要您对 OSI 模型非常了解才能理解,若现在不是很清楚,没关系,等我们日后讲完 OSI 再回来温习就好。还要一种叫做Brouter(我也不知道如何翻译)的设备﹐可以应用于不同的传输协定上面﹐它揉合了bidge 和 router 的优点所在﹕既可以使用不同的上层协定﹐也可以直接将数据以最快的路径传递。当然﹐它的问题是比较昂贵﹐而且安装也是件非常头疼的事情﹕它需要对每一个不同的网路进行细致的调校。如果您有一个比较复杂的具有多种平台的大型网路环境﹐使用 brouter 通常可以获得最佳的效能﹐尽管安装比较困难﹐但一旦设好了﹐自是受益非浅。然而,由于 Switch 的应用技术越来越广,或许今天很难找到 Broter 设备了,通常可见的,多半是 L3 Swtich 了吧?
网关(Gateway)
        Gateway 可以说是 internerworking 的最终极设备了﹐它通常是一些硬卡跑著一些软体﹐专门是设计给两个完全不同的网路结构(比如 PC 网路和 SNA Mainframe)之间进行沟通的。因为, gateway 的工作囊括了整个 OSI 的七个层级。
如若 bridge (工作于第二层) 和 router (工作于第三层) 所使用的传译员仅能够翻译语言﹐gateway 这个更高级的翻译却能完全的将各自不同的交流模式进行翻译﹐并能让对方可以理解﹐不管他们使用的是画画还是跳舞。

Bridge 的使用

正如刚才提到 bridge 的时候﹐已经知道它的主要功能就是过滤(filter)和传递(forward)﹐当 bridge 接到一个封包的时候﹐它就得问自己﹕“这个封包究竟是留在这个区段内﹐还是应该传递到下一个区段呢﹖”

让我们先假设在两个 Ethernet 区段之间架设了一个 bridge ﹐您有一个资料想从区段甲的节点 A 送到区段乙的节点 B﹐其过程有的像这样﹕当节点 A 送出的封包抵达 bridge 的时候﹐bridge 会先检查封包的来源地和目的地﹐如果是寄往同一区段的其它节点的话(在 bridge 的同一边)﹐桥就不会向区段乙进行传送了﹐我们称这功能为过滤(filter)﹐这样区段乙就减少了无必要的交通﹐参考下图﹕

但是﹐如果封包的来源地与目的地不一个区段的﹐或是一个 Layer 2 层级的广播封包,那么 bridge 就将封包向另外一边传送﹐这动作我们称之为传递(forwarding)

        Bridge 通常是独立协议之外的﹐可以同时支持多个协议﹐它只关心封包的来源和目的位址﹐不管双方使用的封包是 IPX 还是 TCP/IP﹐bridge 都毫不理会。只要它读得懂来源和目的位址﹐就能够判定要对封包进行过滤还是传递。

一般的 bridge 都有一种 learning 能力,会保持一个表格记录哪些位址属于哪个区段﹐每次有封包在网路中传递的时候﹐bridge 都会参考记录检查其封包位址﹐并进行必要的更新。但并不是所有 bridge 都会这样做﹐有些比较低档的 bridge 就不管三七二十一﹐凡是接到封包就给它传递出去﹐我们称这样的 bridge 为forward-only bridge﹐请参考下图﹕


Learning Bridge: 只对不同区段的封包进行传递。
        有些 bridge 或会连接两个以上的区段﹐当有广播封包(就是给所有节点的封包)要发送的时候﹐由于它是要传递给网路上所有节点的﹐bridge 就会将它传递给所有连接上来的区段﹐我们称这样的情形为 flooding(泛洪。越多这样的广播封包﹐flooding 的出现也就越频繁﹐网路也就越慢﹕

那究竟我们如何避免 flooding呢﹖下面有两个选择﹕

  • 如果您需要使用一个 bridge 来连接多个区段﹐确定您购买的是 learning bridge﹐也就是能够追踪每个节点位址的bridge。
  • 您还可以购买half-bridge﹐也就是使用一对 bridge 将过滤和传递工作分开。见图﹕

Half-bridge 也有被称做 remote bridge ﹐通常是配对的用来连接两个区段﹐而各自只负责一半处理。例如﹐有一个封包要由区段甲的节点 A 送到区段乙的节点 B ﹐先会到达区段甲的 half-bridge ﹐这个 half-bridge 只会记著自己所连接的区段之内的位址﹐如果位址不是在此区段﹐那么就将封包传给另外一个 half-bridge ﹔当另外的 half-bridge 收到封包之后﹐看看位址是否属于它所属的区段﹐如果不是的话﹐这个封包就会被忽略﹐也不会被重发。这样﹐网路的交通就会被限制在最低的情况之下了。

如果您的网路扩展到一定范围的时候﹐您就要考虑增加 bridge 了。然而﹐当使用多个 bridge 的时候﹐您就会有风险遇到broadcast storm 的问题。这通常发生在当区段之间有超过一个路径的时候﹕

       如上图所示﹐当区段甲的节点 A 对本区段进行广播(在 Layer 2 上的广博)﹐有两个 bridge 接收到信息﹐因为是广播的关系,皆认为可以向区段乙传递。但是,当其中一个 bridge 将信号 forward 到另一个 bridge 的时侯,这个广播会让 bridge 再 forward 一次(回到区段甲)﹔然后又送到另一个 bridge ,再重复 forward 下去,因而造成一个无穷回迴圈(loop)。

不过可以告诉大家的是﹐bridge looping 只会在 Ethernet 逻辑形态和 Bus 物理形态上面出现﹐若使用 802.5 的 Token Ring 网路,对它是免疫的。

Bridge 的标准

由于 bridge 只有很低的处理能力﹐如果网路交通太忙的话﹐有可能出现封包丢失的情形。为了解决这样的问题﹐一些 bridge 的标准相继的被开发出来﹐通常有两个标准是比较广泛被接受的﹐它们是﹕spanning tree(生成树) source-route bridging(源路由桥接) 标准。而且﹐这些标准都可以解决 looping 和 flooding 的问题﹗不错哦~~

Spanning Tree Standard(生成树标准)
        此标准里面﹐网路会有一个 root bridge ﹐然后其下还有一些 child bridge ﹐这个 root bridge 会决定目的封包要传递给哪一个 child bridge。由于上级 bridge 只会将封包传递给包含该目的位址的下级 bridge ﹐因而也就避免了产生 looping 的可能性。
       Spanning Tree 是由 Digital Equipment Corporation (DEC) 开发的﹐是专门给 802.3 (逻辑 bus 或 Ethernet ) 和 802.4( token bus )网路使用的。给 802.5 的 Token Ring 使用的是下个要说的标准。
Source-route Bridging Standard(源路由桥接标准)
        在 Source-rout Bridging 标准里面﹐发送端节点要先判定哪个传送路径是最佳的﹐再将封包传给 bridge ﹐然后再传给目的地的 bridge。这时候 bridge 可以当成网关(gateway)一样。它们的连接如下图﹕
       当一个 bridge 判定了两个节点之间的最佳路径之后﹐就会永远地使用此一路径﹐就算以后还有更佳路径的出现也不会被考虑的了。如果您想您的 bridge 能够适应不同的网路交通层次﹐并能报告出进行桥接过程的错误信息﹐那么您需要的并非 bridge ﹐而是 router 了。

Router 的使用

Router 有那些功能呢﹖先让我们先将它和 bridge 做一个透视比较﹕

  • Router 可以在节点间进行多工处理
  • Router 可以直接和使用者设备沟通
  • Router 可以协助管理网路交通
  • 不像 bridge﹐router并不会阅读所有在网路上面的封包﹐只会阅读那些需要进行路由的封包
  • 由于 router 是用来连接不同网路的﹐所以他们并不能独立协之外

为了更好的了解 router 的功能﹐您最好先要明白 router 是如何工作的﹐以及它和 bridge 的分别。它们主要的分别是它们如何看待所连接上来的区段﹕当使用 bridge 连接两个网路的时候﹐它们仅属于同一网路之内的两个区段﹔如果使用 router 来连接两个网路﹐它们是各自独立的网路。

如下图所见﹕当网路 1 的节点 A 要传送一个封包网路 6 的节点 B﹐节点 A 会先将封包传给连接到网路 1 的 router 1。当 router 1 接到封包的时候﹐他就得要判定哪条是最佳的传递给网路 6 的路径,也就是下一站是谁?通常,最佳的路由路径会在好几个不同的 router 之间换来换去的﹐但无论如何﹐在 router 将送出封包之前﹐都会根据当前情况而选择最佳的路径。Router 具备这种搜索路径的能力是非常有用的﹐不过这要基于它能否看到其它 router 的能力而定。

        由于 Router 1 分别连接到 Router 2﹑3﹑4﹐它会知道它们有多忙以及它们和哪些网路连接著﹐这样﹐当 Router 1 有封包要传递到其它网路的时候﹐它就会看看哪条路径在当时是最快的。由于 router 2 和 4 都比较忙﹐所以 router 1 也就选取了没那么忙的 router 3 为路径了。

每次当封包从一个 router 传到另一个 router 的过程﹐我们称之为“hop”(跳),许多较为简单的路由演算法会以最少 hop 数为成本,然后成本最低的就是最佳路迳条。然而,封包所经的路径通常会在中游就会被改变,以补偿网路交通的变化。例如下图中﹐在网路 1 的节点 A 有一个封包要送到网路 4 的节点 B﹐必需经过 router 1﹑2﹑3 和 4 ﹐您可以从下图看到初始路径的选择﹕

        然而﹐当封包从 Router 1 移到 Router 2 的时候﹐Router 2 或许会说﹕“嗯~~ 我可以将这个封包传给 Router 3 ﹐不过~~ Router 3 现在看起来挺忙的﹐我想封包如果经由 Router 5 ﹐然后到 6 ﹐再到 7 ﹐再到 4 或许比较快些咧﹐因为 5﹑6﹑7 好像比较清闲。”这条路径就会改变成下图那样了﹕

       虽然这路径要经的 hop 数目更多﹐但它依然是比经由繁忙的 router 3 要快。单纯以 hop 数为依据的路由协议属于 distance vactor routing protocol(距离矢量路由协议) ,例如 RIP (Routing Information Protocl )﹔更复杂的,更据连线状态进行调整的称为 link stat routing protocol(链路状态路由协议),例如 OSPF (Open Shortest Path First)——开放式最短路径优先。大多数的 router 都支持这两类的路由协定。

当封包在进行路由的时候﹐有两组位址是 router 必需追踪的﹕封包的罗辑位址(来源跟目的)﹐以及硬件位址(来源和目的)。而一个单一的罗辑位址通常是这样的一个组合﹕网路位址和节点位址。罗辑个位址(IP地址)在路由的任何过程中都不会改变,除非经过刻意修改硬体位址(MAC地址)则记录著封包”当时”所经的两个 router 的界面位址﹐而且每次跳站都有所不同。透过一个接力的方式,一站传一站,将封包最终送抵目的地。您可以从下图看到这过程是如何工作的﹕

        正如您所见到的﹐router 和 router 之间必需相互认识才能让路由工作正常。更重要的是﹐对使用者而言﹐所有工作站只须知道它们直接连到哪个(些) router 去。若有一个 router 加入到网路中的时候﹐它都会向 WAN 上面的其它 router 广告自己的位址和其所连接的网路﹕

        当其它 router 接收到这样的广播信息之后﹐就会将资料加入本身的路由表(routing table)去﹐如果越多 router 加入﹐那么路由表也就越大。至于路由表的格式则视乎所使用的路由协议而定﹐这些协议都会规定出诸如﹕如何产生路由表﹑如何对建构的表格进行追踪﹑要保存什么样的资料﹑以及每个 router 如何和别的 router 进行沟通等细节。其中有一个比较简单的路由协议叫做Routing Information Protocol (RIP),该协议属于距离矢量路由协议

当您开启一个 RIP router 的时候﹐它会先建立好自己的路由表﹕首先﹐它向所有它连接的网路广播自己位址﹐并广告其它在 WAN 上面的 router 这些信息。然后大约每隔一分钟﹐router 就会对资料进行更新﹐在其余时间﹐它会倾听其它 router 的广告信息﹐如何将所有新信息加进自己的路由表。这里的最重要字眼是 — 新。每次当 router 的状态或连接发生改变的时候﹐它都会广播这些信息﹐让其它 router 将旧信息删除掉﹐换成新的信息。这样﹐如果 WAN 上面有一个 router 工作不良的话﹐其它 router 就会知道﹐而不会再将封包传送给它了。

您可以把 RIP router 看成是极度信任别人的一伙﹕它们之间不断地相互交谈﹐但永远只相信最后告诉它们的 router 所说的。不过﹐这样有一个潜在的问题﹐如果其中一个 router 有一个错误的关于别的 router 的信息﹐然后将这不实信息在 WAN 上传播开﹐其它 router 接收到信息后就会更新它们的路由表﹐而不实的路由表会导致封包的传送速度变慢。其情形就如下图一样﹕

       为了绕过这个问题﹐许多新的路由协议都只会广播其直接连的网路信息﹐也就增加了资料的可信性了。

Gateway 的使用

Gateway 的工作比 bridge 和 router 都要复杂许多﹕Bridge 只是简单的看看封包资料的来源和目的位址﹐然后将资料传递到正确的地方﹔Router 则会看看封包资料然后把封包传给其它 router ﹐一路的改变硬件来源和目的位址﹐但并不改变封包里面的资料﹔但是 Gateway 却实际上可以有效地将资料从一种协议标准转换成另一种协议标准﹐它在处理使用完全不同协议的网路间的数据传输过程中﹐可以使用两种方法﹕tunneling(挖隧道)和terminal emulation(终端仿真)。

Tunneling
        这是最常用﹐而且也是处理器耗费最少的方法。使用 tunneling ﹐gateway 会先使用第一个网路的格式传送封包﹐并将之包裹在双方都容易理解的格式﹐然后在另外一个网路中﹐使用另一种格式进行传送。概念上﹐tunneling 和邮局系统差不多﹕如果您使用公司内部便条传一个 memo 给同办公室的同事﹐只要填上发信人和收信人﹐然后交由秘书就可以﹔但如果要经过邮局寄信给分公司的某经理的话﹐则不能使用这样的格式了。因为邮局不知道如何处置这便条才好﹐所以您必须将便条装进邮局标准信封(也就是所谓的双方都容易理解的格式)里面﹐然后邮局将信件传(路由)到分公司经理﹐然后他把邮局信封(路由信封)撕掉﹐就可以得到您的便条了﹔假如便条是用英文写的﹐而那经理却只识中文﹐那么就要找秘书给翻译(数据转换)了。

比如说﹐我有一个 Novell IPX 封包要从我的 PC 送给在 AppleTalk 网路上面的 Mac ﹐而 Netware 和 AppleTalk 都可以理解 TCP/IP。这样﹐我就可以进行资料传输了﹕PC 将封包装进一个 TCP/IP“信封”里面﹐然后将封包发送出去﹐当抵达 Mac 之后﹐将 TCP/IP 信封撕掉而得到真正的封包﹐但此时 Mac 依然是读不懂封包内容的﹐它还的做些数据转换工作才能看的懂 PC 的数据。不过﹐数据转换却不是 gateway 的问题哦﹐一旦数据从 PC 网路抵达 Mac 网路﹐gatewate 的任务就大功告成了。如果您记不起前面讨论 TCP/IP 时候的图示﹐现在也可以重温一下﹕

Terminal Emulation
       另一种 gateway 方法是使用 terminal emulation。比方说,Mainframe 原本在设计上并不是和 PC 沟通的﹐它们是使用 dumb terminal 进行通讯的。这样﹐当一台 PC 要和 mainframe 通讯的时候﹐它在转换过程中就得将自己当成终端才行。通常有两种方法可以进行终端模拟﹕终端模拟卡和终端模拟软件﹐同时﹐也有两个途径来成功地执行终端模拟﹕

PC Emulation Card﹐或称为 gateway card﹐您可以将它插进每一台需要连接 mainframe 的 PC。不过这通常都很费劲才能将之调整正确﹐因为这比较容易引起资源冲突或是系统不稳定等问题。您可以从下图看到这样的配置﹕
然而﹐使用 Emulation Card 进行终端模拟都会有下面的不利因素﹕

  • 比较昂贵﹐您必须购买额外的硬件和软件来让您的 PC 和 mainframe 沟通。
  • 额外的软件和硬件也容易引起更多的设备冲突。
  • 比较慢﹐每次您要由一个作业系统要求另外一个系统﹐都需要时间。

针对那些问题﹐您或许会考虑使用gateway server﹐不过您依然还是会碰到这些问题的﹐只不过将问题集中在一台机器而不是在所有机器而已﹐而且那些使用软件的工作站还依然可能会碰到软件上面的麻烦。

Gateway Server﹐您可以专门指定一台 PC 为工作站处理所有的模拟工作﹐这样的 PC 就成为 gateway server 了。模拟卡只需安装在这台机器之上就可以﹕

       这样所有工作站都使用模拟软体连接到 gateway server ﹐再通过模拟卡和 mainframe 沟通。

 

小結

至此为止﹐相信您也已经有一定的概念去如何使用各种不同的设备将您的 LAN 连到 WAN 上面了吧。如果您管理的是一个小办公室﹐那您很有可能是邀请外面的商家帮您连接您的 LAN。然而﹐当您的网路成长的时候﹐对各种 WAN 设备的需求也会显得越来越重要了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注