成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一文讀懂HTTP/2 及 HTTP/3特性

BlackMass / 3221人閱讀

摘要:谷歌推出,才算是正式改造協(xié)議本身。將請求和響應(yīng)數(shù)據(jù)分割為更小的幀,并且它們采用二進(jìn)制編碼。每個(gè)數(shù)據(jù)流都以消息的形式發(fā)送,而消息又由一個(gè)或多個(gè)幀組成。多個(gè)幀之間可以亂序發(fā)送,根據(jù)幀首部的流標(biāo)識(shí)可以重新組裝。

前言

HTTP/2 相比于 HTTP/1,可以說是大幅度提高了網(wǎng)頁的性能,只需要升級(jí)到該協(xié)議就可以減少很多之前需要做的性能優(yōu)化工作,當(dāng)然兼容問題以及如何優(yōu)雅降級(jí)應(yīng)該是國內(nèi)還不普遍使用的原因之一。

雖然 HTTP/2 提高了網(wǎng)頁的性能,但是并不代表它已經(jīng)是完美的了,HTTP/3 就是為了解決 HTTP/2 所存在的一些問題而被推出來的。

想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客

一、HTTP協(xié)議

HTTP協(xié)議是HyperText Transfer Protocol(超文本傳輸協(xié)議)的縮寫,它是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。伴隨著計(jì)算機(jī)網(wǎng)絡(luò)和瀏覽器的誕生,HTTP1.0也隨之而來,處于計(jì)算機(jī)網(wǎng)絡(luò)中的應(yīng)用層,HTTP是建立在TCP協(xié)議之上,所以HTTP協(xié)議的瓶頸及其優(yōu)化技巧都是基于TCP協(xié)議本身的特性,例如tcp建立連接的3次握手和斷開連接的4次揮手以及每次建立連接帶來的RTT延遲時(shí)間。

二、HTTP/1.x的缺陷

連接無法復(fù)用:連接無法復(fù)用會(huì)導(dǎo)致每次請求都經(jīng)歷三次握手和慢啟動(dòng)。三次握手在高延遲的場景下影響較明顯,慢啟動(dòng)則對大量小文件請求影響較大(沒有達(dá)到最大窗口請求就被終止)。

HTTP/1.0傳輸數(shù)據(jù)時(shí),每次都需要重新建立連接,增加延遲。

HTTP/1.1雖然加入keep-alive可以復(fù)用一部分連接,但域名分片等情況下仍然需要建立多個(gè)connection,耗費(fèi)資源,給服務(wù)器帶來性能壓力。

Head-Of-Line Blocking(HOLB):導(dǎo)致帶寬無法被充分利用,以及后續(xù)健康請求被阻塞。HOLB是指一系列包(package)因?yàn)榈谝粋€(gè)包被阻塞;當(dāng)頁面中需要請求很多資源的時(shí)候,HOLB(隊(duì)頭阻塞)會(huì)導(dǎo)致在達(dá)到最大請求數(shù)量時(shí),剩余的資源需要等待其他資源請求完成后才能發(fā)起請求。

HTTP 1.0:下個(gè)請求必須在前一個(gè)請求返回后才能發(fā)出,request-response對按序發(fā)生。顯然,如果某個(gè)請求長時(shí)間沒有返回,那么接下來的請求就全部阻塞了。

HTTP 1.1:嘗試使用 pipeling 來解決,即瀏覽器可以一次性發(fā)出多個(gè)請求(同個(gè)域名,同一條 TCP 鏈接)。但 pipeling 要求返回是按序的,那么前一個(gè)請求如果很耗時(shí)(比如處理大圖片),那么后面的請求即使服務(wù)器已經(jīng)處理完,仍會(huì)等待前面的請求處理完才開始按序返回。所以,pipeling 只部分解決了 HOLB。


如上圖所示,紅色圈出來的請求就因域名鏈接數(shù)已超過限制,而被掛起等待了一段時(shí)間。

協(xié)議開銷大: HTTP1.x在使用時(shí),header里攜帶的內(nèi)容過大,在一定程度上增加了傳輸?shù)某杀?,并且每次請求header基本不怎么變化,尤其在移動(dòng)端增加用戶流量。

安全因素:HTTP1.x在傳輸數(shù)據(jù)時(shí),所有傳輸?shù)膬?nèi)容都是明文,客戶端和服務(wù)器端都無法驗(yàn)證對方的身份,這在一定程度上無法保證數(shù)據(jù)的安全性

三、SPDY 協(xié)議

因?yàn)镠TTP/1.x的問題,我們會(huì)引入雪碧圖、將小圖內(nèi)聯(lián)、使用多個(gè)域名等等的方式來提高性能。不過這些優(yōu)化都繞開了協(xié)議,直到2009年,谷歌公開了自行研發(fā)的 SPDY 協(xié)議,主要解決HTTP/1.1效率不高的問題。谷歌推出SPDY,才算是正式改造HTTP協(xié)議本身。降低延遲,壓縮header等等,SPDY的實(shí)踐證明了這些優(yōu)化的效果,也最終帶來HTTP/2的誕生。

SPDY 協(xié)議在Chrome瀏覽器上證明可行以后,就被當(dāng)作 HTTP/2 的基礎(chǔ),主要特性都在 HTTP/2 之中得到繼承。

四、HTTP/2 簡介

2015年,HTTP/2 發(fā)布。HTTP/2是現(xiàn)行HTTP協(xié)議(HTTP/1.x)的替代,但它不是重寫,HTTP方法/狀態(tài)碼/語義都與HTTP/1.x一樣。HTTP/2基于SPDY3,專注于性能,最大的一個(gè)目標(biāo)是在用戶和網(wǎng)站間只用一個(gè)連接(connection)。

HTTP/2由兩個(gè)規(guī)范(Specification)組成:

Hypertext Transfer Protocol version 2 - RFC7540

HPACK - Header Compression for HTTP/2 - RFC7541

五、HTTP/2 新特性 1.二進(jìn)制傳輸

HTTP/2 采用二進(jìn)制格式傳輸數(shù)據(jù),而非 HTTP 1.x 的文本格式,二進(jìn)制協(xié)議解析起來更高效。 HTTP / 1 的請求和響應(yīng)報(bào)文,都是由起始行,首部和實(shí)體正文(可選)組成,各部分之間以文本換行符分隔。HTTP/2 將請求和響應(yīng)數(shù)據(jù)分割為更小的幀,并且它們采用二進(jìn)制編碼。

接下來我們介紹幾個(gè)重要的概念:

流:流是連接中的一個(gè)虛擬信道,可以承載雙向的消息;每個(gè)流都有一個(gè)唯一的整數(shù)標(biāo)識(shí)符(1、2…N);

消息:是指邏輯上的 HTTP 消息,比如請求、響應(yīng)等,由一或多個(gè)幀組成。

幀:HTTP 2.0 通信的最小單位,每個(gè)幀包含幀首部,至少也會(huì)標(biāo)識(shí)出當(dāng)前幀所屬的流,承載著特定類型的數(shù)據(jù),如 HTTP 首部、負(fù)荷,等等

HTTP/2 中,同域名下所有通信都在單個(gè)連接上完成,該連接可以承載任意數(shù)量的雙向數(shù)據(jù)流。每個(gè)數(shù)據(jù)流都以消息的形式發(fā)送,而消息又由一個(gè)或多個(gè)幀組成。多個(gè)幀之間可以亂序發(fā)送,根據(jù)幀首部的流標(biāo)識(shí)可以重新組裝。

2.多路復(fù)用

在 HTTP/2 中引入了多路復(fù)用的技術(shù)。多路復(fù)用很好的解決了瀏覽器限制同一個(gè)域名下的請求數(shù)量的問題,同時(shí)也接更容易實(shí)現(xiàn)全速傳輸,畢竟新開一個(gè) TCP 連接都需要慢慢提升傳輸速度。

大家可以通過 該鏈接 直觀感受下 HTTP/2 比 HTTP/1 到底快了多少。

在 HTTP/2 中,有了二進(jìn)制分幀之后,HTTP /2 不再依賴 TCP 鏈接去實(shí)現(xiàn)多流并行了,在 HTTP/2中:

同域名下所有通信都在單個(gè)連接上完成。

單個(gè)連接可以承載任意數(shù)量的雙向數(shù)據(jù)流。

數(shù)據(jù)流以消息的形式發(fā)送,而消息又由一個(gè)或多個(gè)幀組成,多個(gè)幀之間可以亂序發(fā)送,因?yàn)楦鶕?jù)幀首部的流標(biāo)識(shí)可以重新組裝。

這一特性,使性能有了極大提升:

同個(gè)域名只需要占用一個(gè) TCP 連接,使用一個(gè)連接并行發(fā)送多個(gè)請求和響應(yīng),消除了因多個(gè) TCP 連接而帶來的延時(shí)和內(nèi)存消耗。

并行交錯(cuò)地發(fā)送多個(gè)請求,請求之間互不影響。

并行交錯(cuò)地發(fā)送多個(gè)響應(yīng),響應(yīng)之間互不干擾。

在HTTP/2中,每個(gè)請求都可以帶一個(gè)31bit的優(yōu)先值,0表示最高優(yōu)先級(jí), 數(shù)值越大優(yōu)先級(jí)越低。有了這個(gè)優(yōu)先值,客戶端和服務(wù)器就可以在處理不同的流時(shí)采取不同的策略,以最優(yōu)的方式發(fā)送流、消息和幀。


如上圖所示,多路復(fù)用的技術(shù)可以只通過一個(gè) TCP 連接就可以傳輸所有的請求數(shù)據(jù)。

3.Header 壓縮

在 HTTP/1 中,我們使用文本的形式傳輸 header,在 header 攜帶 cookie 的情況下,可能每次都需要重復(fù)傳輸幾百到幾千的字節(jié)。

為了減少這塊的資源消耗并提升性能, HTTP/2對這些首部采取了壓縮策略:

HTTP/2在客戶端和服務(wù)器端使用“首部表”來跟蹤和存儲(chǔ)之前發(fā)送的鍵-值對,對于相同的數(shù)據(jù),不再通過每次請求和響應(yīng)發(fā)送;

首部表在HTTP/2的連接存續(xù)期內(nèi)始終存在,由客戶端和服務(wù)器共同漸進(jìn)地更新;

每個(gè)新的首部鍵-值對要么被追加到當(dāng)前表的末尾,要么替換表中之前的值

例如下圖中的兩個(gè)請求, 請求一發(fā)送了所有的頭部字段,第二個(gè)請求則只需要發(fā)送差異數(shù)據(jù),這樣可以減少冗余數(shù)據(jù),降低開銷

4.Server Push

Server Push即服務(wù)端能通過push的方式將客戶端需要的內(nèi)容預(yù)先推送過去,也叫“cache push”。

可以想象以下情況,某些資源客戶端是一定會(huì)請求的,這時(shí)就可以采取服務(wù)端 push 的技術(shù),提前給客戶端推送必要的資源,這樣就可以相對減少一點(diǎn)延遲時(shí)間。當(dāng)然在瀏覽器兼容的情況下你也可以使用 prefetch。
例如服務(wù)端可以主動(dòng)把JS和CSS文件推送給客戶端,而不需要客戶端解析HTML時(shí)再發(fā)送這些請求。

服務(wù)端可以主動(dòng)推送,客戶端也有權(quán)利選擇是否接收。如果服務(wù)端推送的資源已經(jīng)被瀏覽器緩存過,瀏覽器可以通過發(fā)送RST_STREAM幀來拒收。主動(dòng)推送也遵守同源策略,換句話說,服務(wù)器不能隨便將第三方資源推送給客戶端,而必須是經(jīng)過雙方確認(rèn)才行。

六、HTTP/3 新特性 1.HTTP/3簡介

雖然 HTTP/2 解決了很多之前舊版本的問題,但是它還是存在一個(gè)巨大的問題,主要是底層支撐的 TCP 協(xié)議造成的。

上文提到 HTTP/2 使用了多路復(fù)用,一般來說同一域名下只需要使用一個(gè) TCP 連接。但當(dāng)這個(gè)連接中出現(xiàn)了丟包的情況,那就會(huì)導(dǎo)致 HTTP/2 的表現(xiàn)情況反倒不如 HTTP/1 了。

因?yàn)樵诔霈F(xiàn)丟包的情況下,整個(gè) TCP 都要開始等待重傳,也就導(dǎo)致了后面的所有數(shù)據(jù)都被阻塞了。但是對于 HTTP/1.1 來說,可以開啟多個(gè) TCP 連接,出現(xiàn)這種情況反到只會(huì)影響其中一個(gè)連接,剩余的 TCP 連接還可以正常傳輸數(shù)據(jù)。

那么可能就會(huì)有人考慮到去修改 TCP 協(xié)議,其實(shí)這已經(jīng)是一件不可能完成的任務(wù)了。因?yàn)?TCP 存在的時(shí)間實(shí)在太長,已經(jīng)充斥在各種設(shè)備中,并且這個(gè)協(xié)議是由操作系統(tǒng)實(shí)現(xiàn)的,更新起來不大現(xiàn)實(shí)。

基于這個(gè)原因,Google 就更起爐灶搞了一個(gè)基于 UDP 協(xié)議的 QUIC 協(xié)議,并且使用在了 HTTP/3 上,HTTP/3 之前名為 HTTP-over-QUIC,從這個(gè)名字中我們也可以發(fā)現(xiàn),HTTP/3 最大的改造就是使用了 QUIC。
QUIC 雖然基于 UDP,但是在原本的基礎(chǔ)上新增了很多功能,接下來我們重點(diǎn)介紹幾個(gè)QUIC新功能。

2.QUIC新功能

0-RTT

通過使用類似 TCP 快速打開的技術(shù),緩存當(dāng)前會(huì)話的上下文,在下次恢復(fù)會(huì)話的時(shí)候,只需要將之前的緩存?zhèn)鬟f給服務(wù)端驗(yàn)證通過就可以進(jìn)行傳輸了。0RTT 建連可以說是 QUIC 相比 HTTP2 最大的性能優(yōu)勢。那什么是 0RTT 建連呢?

這里面有兩層含義:

1.傳輸層 0RTT 就能建立連接。

2.加密層 0RTT 就能建立加密連接。

上圖左邊是 HTTPS 的一次完全握手的建連過程,需要 3 個(gè) RTT。就算是會(huì)話復(fù)用也需要至少 2 個(gè) RTT。

而 QUIC 呢?由于建立在 UDP 的基礎(chǔ)上,同時(shí)又實(shí)現(xiàn)了 0RTT 的安全握手,所以在大部分情況下,只需要 0 個(gè) RTT 就能實(shí)現(xiàn)數(shù)據(jù)發(fā)送,在實(shí)現(xiàn)前向加密的基礎(chǔ)上,并且 0RTT 的成功率相比 TLS 的會(huì)話記錄單要高很多。

多路復(fù)用

雖然 HTTP/2 支持了多路復(fù)用,但是 TCP 協(xié)議終究是沒有這個(gè)功能的。QUIC 原生就實(shí)現(xiàn)了這個(gè)功能,并且傳輸?shù)膯蝹€(gè)數(shù)據(jù)流可以保證有序交付且不會(huì)影響其他的數(shù)據(jù)流,這樣的技術(shù)就解決了之前 TCP 存在的問題。

同HTTP2.0一樣,同一條 QUIC連接上可以創(chuàng)建多個(gè)stream,來發(fā)送多個(gè)HTTP請求,但是,QUIC是基于UDP的,一個(gè)連接上的多個(gè)stream之間沒有依賴。比如下圖中stream2丟了一個(gè)UDP包,不會(huì)影響后面跟著 Stream3 和 Stream4,不存在 TCP 隊(duì)頭阻塞。雖然stream2的那個(gè)包需要重新傳,但是stream3、stream4的包無需等待,就可以發(fā)給用戶。


另外QUIC 在移動(dòng)端的表現(xiàn)也會(huì)比 TCP 好。因?yàn)?TCP 是基于 IP 和端口去識(shí)別連接的,這種方式在多變的移動(dòng)端網(wǎng)絡(luò)環(huán)境下是很脆弱的。但是 QUIC 是通過 ID 的方式去識(shí)別一個(gè)連接,不管你網(wǎng)絡(luò)環(huán)境如何變化,只要 ID 不變,就能迅速重連上。

加密認(rèn)證的報(bào)文

TCP 協(xié)議頭部沒有經(jīng)過任何加密和認(rèn)證,所以在傳輸過程中很容易被中間網(wǎng)絡(luò)設(shè)備篡改,注入和竊聽。比如修改序列號(hào)、滑動(dòng)窗口。這些行為有可能是出于性能優(yōu)化,也有可能是主動(dòng)攻擊。

但是 QUIC 的 packet 可以說是武裝到了牙齒。除了個(gè)別報(bào)文比如 PUBLIC_RESET 和 CHLO,所有報(bào)文頭部都是經(jīng)過認(rèn)證的,報(bào)文 Body 都是經(jīng)過加密的。

這樣只要對 QUIC 報(bào)文任何修改,接收端都能夠及時(shí)發(fā)現(xiàn),有效地降低了安全風(fēng)險(xiǎn)。

如上圖所示,紅色部分是 Stream Frame 的報(bào)文頭部,有認(rèn)證。綠色部分是報(bào)文內(nèi)容,全部經(jīng)過加密。

向前糾錯(cuò)機(jī)制

QUIC協(xié)議有一個(gè)非常獨(dú)特的特性,稱為向前糾錯(cuò) (Forward Error Correction,F(xiàn)EC),每個(gè)數(shù)據(jù)包除了它本身的內(nèi)容之外,還包括了部分其他數(shù)據(jù)包的數(shù)據(jù),因此少量的丟包可以通過其他包的冗余數(shù)據(jù)直接組裝而無需重傳。向前糾錯(cuò)犧牲了每個(gè)數(shù)據(jù)包可以發(fā)送數(shù)據(jù)的上限,但是減少了因?yàn)閬G包導(dǎo)致的數(shù)據(jù)重傳,因?yàn)閿?shù)據(jù)重傳將會(huì)消耗更多的時(shí)間(包括確認(rèn)數(shù)據(jù)包丟失、請求重傳、等待新數(shù)據(jù)包等步驟的時(shí)間消耗)

假如說這次我要發(fā)送三個(gè)包,那么協(xié)議會(huì)算出這三個(gè)包的異或值并多帶帶發(fā)出一個(gè)校驗(yàn)包,也就是總共發(fā)出了四個(gè)包。當(dāng)出現(xiàn)其中的非校驗(yàn)包丟包的情況時(shí),可以通過另外三個(gè)包計(jì)算出丟失的數(shù)據(jù)包的內(nèi)容。當(dāng)然這種技術(shù)只能使用在丟失一個(gè)包的情況下,如果出現(xiàn)丟失多個(gè)包就不能使用糾錯(cuò)機(jī)制了,只能使用重傳的方式了

七、總結(jié)

HTTP/1.x 有連接無法復(fù)用、隊(duì)頭阻塞、協(xié)議開銷大和安全因素等多個(gè)缺陷

HTTP/2 通過多路復(fù)用、二進(jìn)制流、Header 壓縮等等技術(shù),極大地提高了性能,但是還是存在著問題的

QUIC 基于 UDP 實(shí)現(xiàn),是 HTTP/3 中的底層支撐協(xié)議,該協(xié)議基于 UDP,又取了 TCP 中的精華,實(shí)現(xiàn)了即快又可靠的協(xié)議

給大家推薦一個(gè)好用的BUG監(jiān)控工具Fundebug,歡迎免費(fèi)試用!

歡迎關(guān)注公眾號(hào):前端工匠,你的成長我們一起見證!如果你感覺有收獲,歡迎給我打賞,以激勵(lì)我更多輸出優(yōu)質(zhì)開源內(nèi)容

參考文章

HTTP2講解

HTTP 2.0 協(xié)議詳解

前端面試之道

一文讀懂 HTTP/2 特性

科普:QUIC協(xié)議原理分析

HTTP2簡介和基于HTTP2的Web優(yōu)化

HTTPHTTP2.0,SPDYHTTPS你應(yīng)該知道的一些事

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102431.html

相關(guān)文章

  • 前端基礎(chǔ)匯總

    摘要:及相關(guān)問題數(shù)據(jù)類型函數(shù)中指向原型作用域閉包面向?qū)ο髮ο髣?chuàng)建模式繼承嚴(yán)格模式與對象轉(zhuǎn)換的方法添加屬性,根據(jù)原型創(chuàng)建區(qū)別新特性解構(gòu)賦值簡化對象寫法剪頭函數(shù)三點(diǎn)運(yùn)算符模板字符串形參默認(rèn)值異步過程深拷貝與淺拷貝賦值與淺拷貝的區(qū)別淺拷貝的幾種方法實(shí)現(xiàn) js及es相關(guān)問題 數(shù)據(jù)類型函數(shù)中this指向——————原型作用域閉包——————面向?qū)ο髮ο髣?chuàng)建模式繼承——————Es5嚴(yán)格模式Json與j...

    2json 評(píng)論0 收藏0
  • 前端基礎(chǔ)匯總

    摘要:及相關(guān)問題數(shù)據(jù)類型函數(shù)中指向原型作用域閉包面向?qū)ο髮ο髣?chuàng)建模式繼承嚴(yán)格模式與對象轉(zhuǎn)換的方法添加屬性,根據(jù)原型創(chuàng)建區(qū)別新特性解構(gòu)賦值簡化對象寫法剪頭函數(shù)三點(diǎn)運(yùn)算符模板字符串形參默認(rèn)值異步過程深拷貝與淺拷貝賦值與淺拷貝的區(qū)別淺拷貝的幾種方法實(shí)現(xiàn) js及es相關(guān)問題 數(shù)據(jù)類型函數(shù)中this指向——————原型作用域閉包——————面向?qū)ο髮ο髣?chuàng)建模式繼承——————Es5嚴(yán)格模式Json與j...

    laznrbfe 評(píng)論0 收藏0
  • 從誕生到原理,一文讀懂云計(jì)算所有貓膩

    摘要:云計(jì)算模式即為電廠集中供電模式。目前,對于云計(jì)算的認(rèn)識(shí)在不斷的發(fā)展變化,云計(jì)算沒仍沒有普遍一致的定義。目前,云計(jì)算的主要服務(wù)形式有,,。目前,以云應(yīng)用最具代表性,例如,云計(jì)算應(yīng)用平臺(tái)。2006年谷歌推出了Google 101計(jì)劃,并正式提出云的概念和理論。隨后亞馬遜、微軟、惠普、雅虎、英特爾、IBM等公司都宣布了自己的云計(jì)劃,云安全、云存儲(chǔ)、內(nèi)部云、外部云、公共云、私有云……一堆讓人眼花繚亂...

    X1nFLY 評(píng)論0 收藏0
  • Java11的新特性

    摘要:從版本開始,不再單獨(dú)發(fā)布或者版本了,有需要的可以自己通過去定制官方解讀官方細(xì)項(xiàng)解讀穩(wěn)步推進(jìn)系列六的小試牛刀一文讀懂的為何如此高效棄用引擎 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要講述一下Java11的新...

    April 評(píng)論0 收藏0
  • 【推薦】最新200篇:技術(shù)文章整理

    摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...

    BicycleWarrior 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<