OpenFlow1.3

OpenFlow1.3

1.OpenFlow端口

OpenFlow端口是OpenFlow處理進(jìn)程和網(wǎng)絡(luò)之間傳遞數(shù)據(jù)包的網(wǎng)絡(luò)接口。OpenFlow交換機(jī)之間通過OpenFlow端口在邏輯上相互連接。
OpenFlow的數(shù)據(jù)包從入口端口接收,經(jīng)過OpenFlow的流水線處理,可將它們轉(zhuǎn)發(fā)到輸出端口。輸入端口是數(shù)據(jù)包的屬性,貫穿整個(gè)OpenFlow流水線,代表數(shù)據(jù)包是從哪個(gè)端口接收的。在進(jìn)行報(bào)文匹配的時(shí)候會(huì)用到入端口。OpenFlow流水線可以決定數(shù)據(jù)包通過輸出行動(dòng)發(fā)送到輸出端口,它定義了數(shù)據(jù)包怎樣傳到網(wǎng)絡(luò)中。
OpenFlow交換機(jī)必須支持的三種類型的標(biāo)準(zhǔn)端口:物理端口,邏輯端口,保留端口。

1.1 物理端口

OpenFlow的物理端口為交換機(jī)的一個(gè)硬件接口。在一些部署中,OpenFlow交換機(jī)可以實(shí)現(xiàn)硬件的虛擬化,在這種情況下,OpenFlow物理端口可以代表一個(gè)與交換機(jī)硬件接口對(duì)應(yīng)的虛擬切片。

1.2 邏輯端口

OpenFlow的邏輯端口為交換機(jī)定義的端口,并不直接對(duì)應(yīng)一個(gè)交換機(jī)的硬件接口,是一個(gè)更高層次的概念,可能包括報(bào)文封裝,映射物理端口的功能,也可能是不使用的端口。相對(duì)于物理端口,邏輯端口的數(shù)據(jù)包中存在一個(gè)叫做隧道ID的額外的元數(shù)據(jù)字段與之關(guān)聯(lián);當(dāng)邏輯端口接收的分組被發(fā)送的控制器時(shí),其邏輯端口和相應(yīng)底層的物理端口都要報(bào)告給控制器。

1.3 保留端口

OpenFlow的保留端口,通常用作轉(zhuǎn)發(fā)動(dòng)作,如:發(fā)送到控制器,泛洪,或使用非OpenFlow的方法轉(zhuǎn)發(fā),即正常交換機(jī)處理方式。

OpenFlow交換機(jī)的保留端口可以分為“Required”(必備)和“Optional”(可選)兩種方式。

  • Required(必備)
動(dòng)作 內(nèi)容
ALL 轉(zhuǎn)發(fā)特定的數(shù)據(jù)包到所有端口(包括數(shù)據(jù)包的入端口)
CONTROLLER OpenFlow控制器的控制通道,作為出端口時(shí)進(jìn)行封裝數(shù)據(jù)包消息并使用OpenFlow協(xié)議發(fā)送。作為入端口時(shí),用來確認(rèn)控制器的數(shù)據(jù)包
TABLE OpenFlow流水線的開始,僅在輸出時(shí)有效
IN PORT 代表數(shù)據(jù)包的輸入端口,用于輸出時(shí),僅能通過入端口發(fā)送的數(shù)據(jù)包
ANY 用于未指定端口的OpenFlow指令
  • Optional(可選)
動(dòng)作 內(nèi)容
LOCAL 交換機(jī)的本地網(wǎng)絡(luò)堆棧和管理堆棧
NORMAL 代表傳統(tǒng)的非OpenFlow流水線,僅用于一個(gè)輸出端口
FLOOD 使用普通流水線處理進(jìn)行泛洪(發(fā)往所有端口但不包括入端口)

2.OpenFlow表

2.1 流水線處理

每個(gè)OpenFlow交換機(jī)的流水線包含多個(gè)流表,每個(gè)流表包含多個(gè)流表項(xiàng),OpenFlow的流水線處理頂一個(gè)數(shù)據(jù)包如何與那些流表進(jìn)行交互。OpenFlow交換機(jī)至少具有一個(gè)流表。

  • 流水線流程

OpenFlow交換機(jī)流表按標(biāo)號(hào)從0開始,且總是從第一個(gè)流表開始,數(shù)據(jù)包與流表0的流表項(xiàng)進(jìn)行匹配,其他的流表根據(jù)第一個(gè)表的匹配結(jié)果進(jìn)行調(diào)用。在對(duì)某個(gè)流表的流表項(xiàng)進(jìn)行匹配時(shí),如果匹配到了流表項(xiàng),則該流表項(xiàng)內(nèi)的指令集被執(zhí)行,這些指令可能包括指導(dǎo)數(shù)據(jù)包傳遞到另一個(gè)流表的Goto指令,在那里進(jìn)行同樣的處理(流水線處理只能前進(jìn),即goto指令只能指向比它大的流表)。流水線的最后一個(gè)表項(xiàng)可以不包括GOTO指令。當(dāng)數(shù)據(jù)包匹配到的流表項(xiàng)沒有GOTO指令時(shí),流水線處理停止,數(shù)據(jù)包將會(huì)進(jìn)行轉(zhuǎn)發(fā)操作。

若數(shù)據(jù)包在流表中沒有匹配到流表項(xiàng),這是一個(gè)table-miss行為,table-miss將會(huì)對(duì)數(shù)據(jù)包進(jìn)行丟棄或傳遞到另一個(gè)表中取決于table-miss流表的配置。或者根據(jù)數(shù)據(jù)包的信息轉(zhuǎn)發(fā)到控制器。

2.2 流表

一個(gè)流表中包含多個(gè)流表項(xiàng),每個(gè)流表項(xiàng)包含:

Match Fields Priority Counters Instructions Timeouts Cookie
內(nèi)容 說明
匹配字段 對(duì)數(shù)據(jù)包匹配,包括端口和數(shù)據(jù)包報(bào)頭,及前一個(gè)表指定的可選元數(shù)據(jù)
優(yōu)先級(jí) 流表項(xiàng)的匹配次序
計(jì)數(shù)器 更新匹配數(shù)據(jù)包的計(jì)數(shù)
指令 修改行動(dòng)集或流水線處理
超時(shí) 最大時(shí)間計(jì)數(shù)或流有效時(shí)間
cookie 由控制器選擇的不透明數(shù)據(jù)值??刂破饔脕磉^濾統(tǒng)計(jì)數(shù)據(jù),流改變和刪除

流表項(xiàng)通過匹配字段和優(yōu)先級(jí)決定,在一個(gè)流表中匹配字段和優(yōu)先級(jí)共同確定唯一的流表項(xiàng)。所有字段通配和優(yōu)先級(jí)為0的流表項(xiàng)為table-miss流表項(xiàng)。

2.3 匹配

  • 匹配流程
匹配流程.png

OpenFlow交換機(jī)在接收到一個(gè)數(shù)據(jù)包后,開始從第一個(gè)流表,并基于流水線的方式進(jìn)行查找。
數(shù)據(jù)匹配字段從數(shù)據(jù)包中提取,用于表查找的數(shù)據(jù)包匹配字段依賴于數(shù)據(jù)包類型,這些類型通常包括各種數(shù)據(jù)包的報(bào)頭字段,如:以太網(wǎng)源地址或IPV4地址。除了通過數(shù)據(jù)包報(bào)頭中進(jìn)行匹配,也可以通過入口端口和元數(shù)據(jù)字段進(jìn)行匹配。元數(shù)據(jù)可以用來在一個(gè)交換機(jī)的不同表里面?zhèn)鬟f信息。報(bào)文匹配字段標(biāo)識(shí)報(bào)文的當(dāng)前狀態(tài),如果在前一個(gè)表中使用Apply-Actions改變了數(shù)據(jù)包的報(bào)頭,那么這些變化也會(huì)在數(shù)據(jù)包匹配字段中反映。
數(shù)據(jù)包匹配字段中的值用于查找匹配的流表項(xiàng),如果流表項(xiàng)字段具有值得ANY,他就可以匹配報(bào)頭中的所有可能值。數(shù)據(jù)包與表進(jìn)行匹配,優(yōu)先級(jí)最高的表項(xiàng)必須被選擇,且與選擇流表項(xiàng)相關(guān)的計(jì)數(shù)器會(huì)更新,選定流表項(xiàng)的指令集也被執(zhí)行。若多個(gè)匹配的流表項(xiàng)有相同的最高優(yōu)先級(jí),所選擇的流表項(xiàng)被確定為未定義表項(xiàng)。

2.4 Table-miss

每一個(gè)流表必須能處理table-miss的流表項(xiàng)。table-miss表項(xiàng)指定在流表中如何處理與其他流表項(xiàng)未匹配的數(shù)據(jù)包。比如講數(shù)據(jù)包發(fā)送到控制器,丟棄數(shù)據(jù)包或直接將包扔到后續(xù)的表。

table-miss的流表項(xiàng)也有他的匹配字段和優(yōu)先級(jí),它通配所有匹配字段,且優(yōu)先級(jí)最低(0)。table-miss流表項(xiàng)的匹配可能會(huì)不屬于正常范圍內(nèi)流表支持的匹配,例如精確匹配會(huì)不支持在其他流表項(xiàng)中使用通配符,但必須支持table-miss的通配符流表項(xiàng)。table-miss流表項(xiàng)的行為在許多方面像任何其他流表項(xiàng),流表中不存在table-miss表項(xiàng),控制器可以在任何時(shí)候添加或刪除它,它也可能會(huì)超時(shí)失效。table-miss流表項(xiàng)能夠匹配其他流表項(xiàng)不能匹配的數(shù)據(jù),當(dāng)數(shù)據(jù)包與table-miss表項(xiàng)匹配時(shí),table-miss表項(xiàng)指令就會(huì)執(zhí)行。如果該table-miss表項(xiàng)直接將數(shù)據(jù)包通過CONTROLLER端口發(fā)送到控制器,那么報(bào)文中的信息必須與一個(gè)table-miss表項(xiàng)匹配。

2.5 流表項(xiàng)刪除

流表項(xiàng)可以通過兩種方式在流表中刪除,控制器的請(qǐng)求或交換機(jī)流超時(shí)機(jī)制。

2.6 組表

組表包括若干組表項(xiàng),這也是一種openflow轉(zhuǎn)發(fā)方法,就是若干流表項(xiàng)指向一組

Group Identifier Group Type Counters Action Buckets

每個(gè)組表項(xiàng)由組編號(hào)確定具體為:

內(nèi)容 說明
組編號(hào) 一個(gè)32位的無符號(hào)整數(shù),唯一標(biāo)識(shí)該組
組類型 確定組語義
計(jì)數(shù)器 當(dāng)報(bào)文被組表處理時(shí)更新數(shù)據(jù)
行動(dòng)桶 包含一組要執(zhí)行的動(dòng)作和參數(shù)
  • 組類型(Group Types)

組類型包括必備(Required)選項(xiàng)和可選(Optional)選項(xiàng)。

必備選項(xiàng)(Required)

內(nèi)容 說明
all 執(zhí)行組中所有行動(dòng)桶,用于多播或廣播的轉(zhuǎn)發(fā)
indirect 執(zhí)行組中定義的一個(gè)動(dòng)作桶,這個(gè)組只支持單一的動(dòng)作桶,允許多個(gè)流表項(xiàng)或組指向一個(gè)組編號(hào)

可選選項(xiàng)(Optional)

內(nèi)容 說明
select 執(zhí)行組中的一個(gè)動(dòng)作桶
fast failover 執(zhí)行一個(gè)活躍的動(dòng)作桶

2.7 計(jì)量表

一個(gè)計(jì)量表包含若干個(gè)計(jì)量表項(xiàng),確定每個(gè)流量的計(jì)數(shù),單位流量的計(jì)量可以使OpenFlow實(shí)現(xiàn)各種簡(jiǎn)單的QoS業(yè)務(wù),如:限速,并且可以結(jié)合每個(gè)端口隊(duì)列來實(shí)現(xiàn)復(fù)雜的QoS框架,如:DiffServ。

計(jì)量可以測(cè)試數(shù)據(jù)包的速率,使這些數(shù)據(jù)包可以實(shí)現(xiàn)速率控制。計(jì)量直接連接到流表項(xiàng)。任意的流表項(xiàng)可以在它的指令集中定義一個(gè)計(jì)量,計(jì)量測(cè)量和控制和它相連的所有流的速率,在同一個(gè)表中可以使用多個(gè)計(jì)量,但必須使用分離的流表項(xiàng)。

Meter Idertifier Meter Bands Counters

每個(gè)計(jì)量表項(xiàng)所含內(nèi)容及說明:

內(nèi)容 說明
計(jì)量的標(biāo)識(shí)符 一個(gè)32位的無符號(hào)整數(shù)唯一識(shí)別符
計(jì)量帶 無序列表,定義帶的速度和處理數(shù)據(jù)包的方式
計(jì)數(shù)器 報(bào)文被計(jì)量表項(xiàng)處理時(shí)更新
  • Meter Bands(計(jì)量表帶)
    每個(gè)計(jì)量表可能有一個(gè)或多個(gè)計(jì)量帶,每個(gè)計(jì)量帶指定適用的速率和數(shù)據(jù)被處理的方式。每個(gè)計(jì)量帶包括:
Band Type Rate Counters Type specific arguments

內(nèi)容和說明

內(nèi)容 說明
帶類型 定義了數(shù)據(jù)包怎樣被處理
計(jì)量率 選擇計(jì)量帶,定義了帶可以運(yùn)行的最低速率
計(jì)數(shù)器 當(dāng)數(shù)據(jù)包被計(jì)量帶處理時(shí)更新
類型參數(shù) 帶類型的可選參數(shù)

帶類型可選(Optional)參數(shù)

內(nèi)容 說明
drop 丟棄數(shù)據(jù)包,可以用來定義的速率限制帶
dscp remark 減少數(shù)據(jù)包的IP頭中的DSCP字段丟棄的優(yōu)先級(jí)??捎糜诙x一個(gè)簡(jiǎn)單的DiffServ策略

2.8 計(jì)數(shù)器

計(jì)數(shù)器可以進(jìn)行如下計(jì)數(shù):每一個(gè)流表,流量入口,端口隊(duì)列,組,動(dòng)作桶,計(jì)量表,計(jì)量帶。主要用于統(tǒng)計(jì)流量信息,例如活動(dòng)表項(xiàng),查找次數(shù),發(fā)送包數(shù)等。如下所示為OpenFlow規(guī)范中定義的計(jì)數(shù)器集:

  • Per Flow Table
Counter Bits
Reference count(active entries) 32 Required
Packet Lookups 64 Optional
Packet Matches 64 Optional
  • Per Flow Entry
Counter Bits
Received Packets 64 Optional
Received Bytes 64 Optional
Duration(second) 32 Required
Duration(nanoseconds) 32 Optional
  • Per Port
Counter Bits
Received Packets 64 Required
Transmitted Packets 64 Required
Received Bytes 64 Optional
Transmitted Bytes 64 Optional
Received Drops 64 Optional
Transmit Drops 64 Optional
Received Errors 64 Optional
Transmit Errors 64 Optional
Received Frame Alignment Errors 64 Optional
Received Overrun Errors 64 Optional
Receive CRC Errors 64 Optional
collisions 64 Optional
Duration(seconds) 32 Required
Druation(nanoseconds) 32 Optional
  • Per Queue
Counter Bits
Transmit Packets 64 Required
Transmit Bytes 64 Optional
Transmit Overrun Errors 64 Optional
Duration(seconds) 32 Required
Durqation(nanoseconds) 32 Optional
  • Per Group
Counter Bits
Reference Count(flow entries) 32 Optional
Packet Count 64 Optional
Byte Count 64 Optional
Duration(seconds) 32 Required
Durqation(nanoseconds) 32 Optional
  • Per Group Bucket
Counter Bits
Packet Count 64 Optional
Byte Count 64 Optional
  • Per Meter
Counter Bits
Flow Count 32 Optional
Input Packet Count 64 Optional
Input Byte Count 64 Optional
Duration(seconds) 32 Required
Durqation(nanoseconds) 32 Optional
  • Per Meter Band
Counter Bits
In Band Packet Count 64 Optional
In Band Byte Count 64 Optional

2.9 指令

每個(gè)流表項(xiàng)中包含一組指令,當(dāng)一個(gè)數(shù)據(jù)包匹配流表項(xiàng)時(shí)指令會(huì)被執(zhí)行,這些指令可以更改數(shù)據(jù)包,行動(dòng)組或流水線處理。

OpenFlow中包含的指令如下:

  • 可選(Optional)
內(nèi)容 說明
Meter meter id 直接將包計(jì)量后丟棄
Apply-Actions action 立即進(jìn)行指定的行動(dòng),而不改變行動(dòng)集,通常用來修改數(shù)據(jù)包
Clear-Actions 在行動(dòng)集中立即清除所有的行動(dòng)
Write-Metadata metadata/mask 在元數(shù)據(jù)區(qū)域記錄元數(shù)據(jù)
  • 必備(Required)
內(nèi)容 說明
Write-Actions action 將指定的行動(dòng)添加到正在運(yùn)行的行動(dòng)集
Goto-Table next-table-id 指定流水線處理進(jìn)程中下一張表的ID

2.10 行動(dòng)集

行動(dòng)集與每個(gè)報(bào)文相關(guān),默認(rèn)為空,一個(gè)流表項(xiàng)可以使用Write-Actions指令或者Clear-Action指令修改行動(dòng)集。行動(dòng)集在表間被累加。當(dāng)一個(gè)表項(xiàng)的指令集沒有包含Goto-Table指令時(shí),流水線處理就停止,報(bào)文行動(dòng)集被執(zhí)行。
行動(dòng)集包含所有的行動(dòng),無論他們以什么順序加入到行動(dòng)集中,行動(dòng)集的順序均按照下列順序執(zhí)行。如果行動(dòng)集包含組行動(dòng),那么行動(dòng)桶中的行動(dòng)也按照下列順序執(zhí)行,交換機(jī)可以通過Apply-Actions指令修改行動(dòng)執(zhí)行順序。

順序 內(nèi)容 說明
1 copy TTL inwards apply copy TTL inward actions to the packet
2 pop apply all tag pop actions to the packet
3 push-MPLS apply MPLS tag push action tothe packet
4 push-PBB apply PBB tag push action to the packet
5 push-VLAN apply VLAN tag push action to the packet
6 copy TTL outwards apply copy TTL outwards action to the packet
7 decrement TTL apply decrement TTL action to the packet
8 set apply all set-field actions to the packet
9 qos apply all QoS actions, such as set queue to the packet
10 group 如果指定了組行動(dòng),那么按照這個(gè)序列中的順序執(zhí)行組行動(dòng)存儲(chǔ)段里的行動(dòng)
11 output 如果沒有指定組行動(dòng),報(bào)文就會(huì)按照 output 行動(dòng)中指定的端口轉(zhuǎn)發(fā)

注:Output行動(dòng)最后執(zhí)行,如果行動(dòng)組和輸出行動(dòng)均存在,行動(dòng)組優(yōu)先級(jí)最高,兩個(gè)均不存在,報(bào)文被丟棄。

2.11 行動(dòng)列表

Apply-Actions指令和Packet-out消息中存在行動(dòng)列表,行動(dòng)效果累加,全部都會(huì)執(zhí)行。

2.12 行動(dòng)

  • 必備動(dòng)作
動(dòng)作 說明
Output 報(bào)文輸出到指定端口
Drop 丟棄
Group 用組表處理報(bào)文
  • 可選行動(dòng)
動(dòng)作 說明
Set-Queue 設(shè)置報(bào)文的隊(duì)列ID,為了Qos需求
Push-Tag/Pop-Tag
Set-Field 設(shè)置報(bào)文包頭的類型和修改包頭的值
Change-TTL 修改TTL值

3.OpenFlow通道

OpenFlow通道是交換機(jī)連接控制器的接口,通過這個(gè)接口,控制器可以對(duì)交換機(jī)進(jìn)行管理和配置,接收交換機(jī)信息并向交換機(jī)發(fā)送數(shù)據(jù)包。
消息被封裝為openflow協(xié)議中規(guī)定的格式在交換機(jī)和控制器之間傳輸,運(yùn)行在安全傳輸層協(xié)議和無保護(hù)的tcp連接上。

3.1 OpenFlow協(xié)議

OpenFlow協(xié)議支持三種消息類型:controller-to-switch,asynchronous(異步)和symmetric(對(duì)稱),三種消息類型又有多個(gè)子消息類型。

controller-to-switch消息由控制器發(fā)出,主要用于管理和獲取switch狀態(tài);asynchronous消息由switch發(fā)出,用于網(wǎng)絡(luò)事件和交換機(jī)狀態(tài)變化更新發(fā)送到控制器;symmetric消息可以由交換機(jī)或控制器發(fā)出。

  • controller-to-switch
內(nèi)容 說明
Features 建立傳輸安全會(huì)話時(shí),控制器發(fā)送給交換機(jī),交換機(jī)應(yīng)答交換機(jī)所支持的功能
Configuration 控制器用于設(shè)置或查詢交換機(jī)上的配置信息,交換機(jī)需應(yīng)答查詢信息
Modify-state 控制器管理交換機(jī)流表項(xiàng)和端口狀態(tài)
Read-state 控制器想交換機(jī)請(qǐng)求關(guān)于流或數(shù)據(jù)包的統(tǒng)計(jì)信息
Packet-out 控制器通過交換機(jī)向指定端口發(fā)送數(shù)據(jù)包
Barrier 控制器確保消息依賴滿足,接收完成操作通知
  • asynchronous
內(nèi)容 說明
Packet-in 數(shù)據(jù)包在交換機(jī)中沒有匹配項(xiàng)時(shí),通過Packet-in消息發(fā)送給控制器
Flow-removed 交換機(jī)的流表項(xiàng)因?yàn)槌瑫r(shí)或修改等原因被刪除掉,會(huì)觸發(fā)此消息
Port-status 交換機(jī)端口狀態(tài)發(fā)生變化時(shí)觸發(fā)
Error 交換機(jī)發(fā)生問題時(shí)觸發(fā)
  • symmetric
內(nèi)容 說明
Hello 交換機(jī)和控制器用于建立連接
Echo 交換機(jī)和控制器均可以發(fā)送Echo,接收者需回復(fù)Echo reply。用于測(cè)量延遲,是否保持連接
Vendor 交換機(jī)提供附加信息

3.2 建立連接

OpenFlow連接建立后,交換機(jī)和控制器必須先要發(fā)送OFPT_HELLO消息給對(duì)方,該消息攜帶雙方支持的最高版本號(hào),接收方將采用雙方都支持的最低協(xié)議版本進(jìn)行通信。發(fā)現(xiàn)共同支持的協(xié)議版本,則進(jìn)行連接,否則發(fā)送OFPT_ERROR消息,中斷連接。

3.3 加密

安全通道用TLS連接加密,交換機(jī)啟動(dòng)后通過6633端口進(jìn)行TCP連接,雙方交換證書進(jìn)行認(rèn)證。

3.4 中斷連接

連接異常時(shí),交換機(jī)嘗試去連接備份的控制器。當(dāng)多次連接失敗后,交換機(jī)進(jìn)入緊急模式,重置所有的TCP連接。此后,數(shù)據(jù)包匹配指定的緊急模式流表項(xiàng),刪除其他正常流表項(xiàng)。

3.5 多控制器

交換機(jī)可以與多臺(tái)控制器建立連接,進(jìn)行故障轉(zhuǎn)移和負(fù)載均衡。

3.5.1 Role

與多臺(tái)控制器建立連接時(shí),各個(gè)控制器具有名為Role(角色)的作用,Role可以分為:

  • EQUAL
  • MASTER
  • SLAVE

默認(rèn)的Role為EQUAL。當(dāng)為EQUAL時(shí),各個(gè)控制器具有相同的作用,也可以對(duì)OpenFlow交換機(jī)進(jìn)行完全訪問。EQUAL控制器可以對(duì)交換機(jī)發(fā)送Flow-Mod消息,變更交換機(jī)設(shè)置,在默認(rèn)設(shè)置中,OpenFlow交換機(jī)向EQUAL控制器發(fā)送所有的異步消息。

對(duì)于MASTER控制器,具有和EQUAL相同的權(quán)限,但是一個(gè)拓?fù)渲兄荒艽嬖谝粋€(gè)MASTER,一個(gè)OpenFlow交換機(jī)只能與一個(gè)MASTER控制器連接,同時(shí),其他的控制器被置為SLAVE。

當(dāng)交換機(jī)為SLAVE時(shí),OpenFlow控制器只能對(duì)OpenFlow交換機(jī)進(jìn)行Read-Only訪問,只要不指定異步消息,將不能向SLAVE發(fā)送除Port-Status消息之外的消息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容