精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

神奇的Google二進(jìn)制編解碼技術(shù):Protobuf

開發(fā) 前端
作為程序員我們知道,client以及server之間不會(huì)簡(jiǎn)單傳遞一串?dāng)?shù)字以及字符這樣簡(jiǎn)單,尤其在互聯(lián)網(wǎng)大廠后端服務(wù)這種場(chǎng)景下。

計(jì)算機(jī)網(wǎng)絡(luò)編程中一個(gè)非常基本的問題:該怎樣表示client與server之間交互的數(shù)據(jù),在往下看之前先想一想這個(gè)問題。

共識(shí)與協(xié)議

這個(gè)問題可不像看上去的那樣簡(jiǎn)單,因?yàn)閏lient進(jìn)程和server進(jìn)程運(yùn)行在不同的機(jī)器上,這些機(jī)器可能運(yùn)行在不同的處理器平臺(tái)、可能運(yùn)行在不同的操作系統(tǒng)、可能是由不同的編程語言編寫的,server要怎樣才能識(shí)別出client發(fā)送的是什么數(shù)據(jù)呢?就像這樣:

圖片

client給server發(fā)送了一段數(shù)據(jù):

0101000100100001

server怎么能知道該怎樣“解讀”這段數(shù)據(jù)呢?

顯然,client和server在發(fā)送數(shù)據(jù)之前必須首先達(dá)成某種關(guān)于怎樣解讀數(shù)據(jù)的共識(shí),這就是所謂的協(xié)議。

這里的協(xié)議可以是這樣的:“將每8個(gè)比特為一個(gè)單位解釋為無符號(hào)數(shù)字”,如果協(xié)議是這樣的,那么server接收到這串二進(jìn)制后就會(huì)將其解析為81(01010001)與33(00100001)。

當(dāng)然,這里的協(xié)議也可以是這樣的:“將每8個(gè)比特為一個(gè)單位解釋為ASCII字符”,那么server接收到這串二進(jìn)制后就將其解析為“Q!”。

可見,同樣一串二進(jìn)制在不同的“上下文/協(xié)議”下有完全不一樣的解讀,這也是為什么計(jì)算機(jī)明明只認(rèn)知0和1但是卻能處理非常復(fù)雜任務(wù)的根本原因,因?yàn)橐磺卸伎梢跃幋a為0和1,同樣的我們也可以從0和1中解析出我們想要的信息,這就是所謂的編解碼技術(shù)。

實(shí)際上不止0和1,我們也可以將信息編碼為摩斯密碼(Morse code)等,只不過計(jì)算機(jī)擅長處理0和1而已。

圖片

扯遠(yuǎn)了,回到本文的主題。

遠(yuǎn)程過程調(diào)用:RPC

作為程序員我們知道,client以及server之間不會(huì)簡(jiǎn)單傳遞一串?dāng)?shù)字以及字符這樣簡(jiǎn)單,尤其在互聯(lián)網(wǎng)大廠后端服務(wù)這種場(chǎng)景下。

當(dāng)我們?cè)陔娚藺pp搜索商品、打車App呼叫出租車以及刷短視頻時(shí),每一次請(qǐng)求的背后在后端都涉及大量服務(wù)之間的交互,就像這樣:

圖片

完成一次客戶端請(qǐng)求gateway這個(gè)服務(wù)要調(diào)用N多個(gè)下游服務(wù),所謂調(diào)用是說A服務(wù)向B服務(wù)發(fā)送一段數(shù)據(jù)(請(qǐng)求),B服務(wù)接收到這段數(shù)據(jù)后執(zhí)行相應(yīng)的函數(shù),并將結(jié)果返回給A服務(wù)。

只不過對(duì)于服務(wù)A來說并不想關(guān)心網(wǎng)絡(luò)傳輸這樣的底層細(xì)節(jié),如果能像調(diào)用本地函數(shù)一樣調(diào)用遠(yuǎn)程服務(wù)就好了,這就是所謂的RPC,經(jīng)典的實(shí)現(xiàn)方式是這樣的:

圖片

RPC對(duì)上層提供和普通函數(shù)一樣的接口,只不過在實(shí)現(xiàn)上封裝了底層復(fù)雜的網(wǎng)絡(luò)通信,RPC框架是當(dāng)前互聯(lián)網(wǎng)后端的基石之一,很多所謂互聯(lián)網(wǎng)后端的職位無非就是在此基礎(chǔ)之上堆業(yè)務(wù)邏輯。

本文我們不關(guān)心其中的細(xì)節(jié),這里我們只關(guān)心在網(wǎng)絡(luò)層client是怎樣對(duì)請(qǐng)求參數(shù)進(jìn)行編碼、server怎樣對(duì)請(qǐng)求參數(shù)進(jìn)行解碼的,也就是本文開頭提出的問題。

信息的編解碼

在思考怎樣進(jìn)行編解碼之前我們必須意識(shí)到:

client和server可能是用不同語言編寫的,你的編解碼方案必須通用且不能和語言綁定

編解碼方法的性能問題,尤其是對(duì)時(shí)間要求苛刻的服務(wù)

首先,我們最應(yīng)該能想到的就是以純文本的形式來表示。

純文本從來都是一種非常有友好的信息載體,為什么?很簡(jiǎn)單,因?yàn)槿祟?我們)可以直接看懂,就像這段:

{
"widget": {
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
},
}
}

是不是很清晰,一目了然,只要我們實(shí)現(xiàn)約定好文本的結(jié)構(gòu)(也就是語法),那么client和server就能利用這種文本進(jìn)行信息的編碼以及解碼,不管client和server是運(yùn)行在x86還是Arm、是32位的還是64位的、運(yùn)行在Linux上還是windows上、是大端還是小端,都可以無障礙交流。

因此在這里,文本的語法就是一種協(xié)議。

圖片

順便說一句,你都規(guī)定好了文本的語法,實(shí)際上就相當(dāng)于發(fā)明了一種語言。

這里用來舉例用的語言就是所謂的Json,只不過json這種語言不是用來表示邏輯(代碼)而是用來存儲(chǔ)數(shù)據(jù)的。

Json就是這個(gè)老頭提出來的:

圖片

除了Json,另一種利用文本存儲(chǔ)數(shù)據(jù)的表示方法是XML,來一段感受下:

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

相對(duì)Json來說是不是就沒那么容易看懂了,Json出現(xiàn)后在web領(lǐng)域逐漸取代了XML。

當(dāng)兩段數(shù)據(jù)量很少的時(shí)候——就像瀏覽器和服務(wù)端的交互,Json可以工作的非常好,這個(gè)場(chǎng)景就是這里:

圖片

在這里是json的天下。

但對(duì)于后端服務(wù)之間的交互來說就不一樣了,后端服務(wù)之間的RPC調(diào)用可能會(huì)傳輸大量數(shù)據(jù),如果全部用純文本的形式來表示數(shù)據(jù)那么不管是網(wǎng)絡(luò)帶寬還是性能可能都會(huì)差強(qiáng)人意。

圖片

在這種場(chǎng)景下,Json并不是最好的選項(xiàng),主要原因之一就在于性能以及數(shù)據(jù)的體積。

我們知道,文本表示對(duì)人類是最友好的,對(duì)機(jī)器來說則不是這樣,對(duì)機(jī)器來說最好的還是01二進(jìn)制。

那么有沒有二進(jìn)制的編碼方法嗎?答案是肯定的,這就是當(dāng)前互聯(lián)網(wǎng)后端中流行的protobuf,Google公司開源項(xiàng)目。

那么protobuf有什么神奇之處嗎?

假設(shè)client端想給server端傳輸這樣一段信息:“我有一個(gè)id,其值為43”,那么在XML下是這樣表示的:

<id>43</id>

數(shù)一數(shù)這這段數(shù)據(jù)占據(jù)了多少字節(jié),很顯然是11字節(jié);

而如果用json來表示呢?

{"id":43}

數(shù)一數(shù)這段數(shù)據(jù)占據(jù)了多少字節(jié),顯然是9字節(jié);

而如果用protobuf來表示呢? 是這樣的:

// 消息定義
message Msg {
optional int32 id = 1;
}

// 實(shí)例化
Msg msg;
msg.set_id(43);

其中Msg的定義看上去比Json和XML更加復(fù)雜了,但這些只是給人看的,這些還會(huì)被protbuf進(jìn)一步處理,最終被編碼為:

082b

也就是0x08與0x2b,這占據(jù)了多少字節(jié)呢?答案是2字節(jié)。

從json的9字節(jié)到protobuf的2字節(jié),數(shù)據(jù)大小減少了4倍多,數(shù)據(jù)量的減少意味著:

  • 更少的網(wǎng)絡(luò)帶寬
  • 更快的解析速度

那么protobuf是怎樣做到這一點(diǎn)的呢?

protobuf是怎樣實(shí)現(xiàn)的?

首先,我們來思考最簡(jiǎn)單的情況,該怎樣表示數(shù)字。

你可能會(huì)想這還不簡(jiǎn)單,統(tǒng)一用固定長度,比如用64個(gè)比特(8字節(jié)),這種方法可行,但問題是不論一個(gè)數(shù)字有多小,比方2,那么用這種方法表示2也需要占據(jù)64個(gè)比特(8字節(jié)):

圖片

明明只要一個(gè)字節(jié)就能表示而我們卻用了8個(gè),前面的全都是0,這也太奢侈太浪費(fèi)了吧。

顯然,在這里我們不能使用固定長度來表示數(shù)字,而需要使用變長方法來表示。

什么叫變長?意思是說如果數(shù)字本身比較大,那么其使用的比特位可以較多,但如果數(shù)字很小那么就應(yīng)該使用較少的比特位來表示,這就叫變長,隨機(jī)應(yīng)變,不死板。

那怎樣變長呢?

我們規(guī)定:對(duì)于每一個(gè)字節(jié)來說,第一個(gè)比特位如果是1那么表示接下來的一個(gè)比特依然要用來解釋為一個(gè)數(shù)字,如果第一個(gè)比特為0,那么說明接下來的一個(gè)字節(jié)不是用來表示該數(shù)字的。

也就是說對(duì)于每個(gè)8個(gè)比特(1字節(jié))來說,它的有效載荷是7個(gè)比特,第一個(gè)比特僅僅用來標(biāo)記是否還應(yīng)該把接下來的一個(gè)字節(jié)解析為數(shù)字。

根據(jù)這個(gè)規(guī)定假設(shè)來了這樣一串01二進(jìn)制:

1010110000000010

根據(jù)規(guī)定,我們首先取出第一個(gè)字節(jié),也就是:

10101100

此時(shí)我們發(fā)現(xiàn)第一個(gè)比特位是1,因此我們知道接下來的一個(gè)字節(jié)也屬于該數(shù)字,將當(dāng)前字節(jié)的1去掉就是:

0101100

然后我們看下一個(gè)字節(jié):

00000010

我們發(fā)現(xiàn)第一個(gè)bit為0,因此我們知道下一個(gè)字節(jié)不屬于該數(shù)字了。

接下來我們將解析到的0101100(第一個(gè)字節(jié)去掉第一個(gè)比特位)以及第二個(gè)字節(jié)0000010(第二個(gè)字節(jié)去掉第一個(gè)比特位)翻轉(zhuǎn)之后拼接到一起,這里之所以翻轉(zhuǎn)是因?yàn)槲覀円?guī)定數(shù)字的高位在后。

這個(gè)過程就是:

1010110000000010  
-> 10101100 | 00000010 // 解析得到兩個(gè)字節(jié)
_ _

-> 0101100 | 0000010 // 各自去掉最高位
-> 0000010 | 0101100 // 兩個(gè)字節(jié)翻轉(zhuǎn)順序

0000010 + 0101100
-> 100101100 // 拼接

最后我們得到了100101100,這一串二進(jìn)制表示數(shù)字300。

這種數(shù)字的變長表示方法在protobuf中被稱之為varint。

因此在這種表示方法下,如果數(shù)字較大,那么使用的比特就多,如果數(shù)字較小那么使用比特就少,聰明吧。

有的同學(xué)看到這里可能會(huì)問題,剛才講解的方法只能表示無符號(hào)數(shù)字,那么有符號(hào)數(shù)字該怎么表示呢?比如-2該怎么表示?

有符號(hào)數(shù)的表示

按照剛才變長編碼的思想,-2147483646使用的比特位應(yīng)該比-2要少。

然而我們知道在計(jì)算機(jī)世界中負(fù)數(shù)使用補(bǔ)碼表示的,也就是說最高位(最左側(cè)的比特位)一定是1,假設(shè)我們使用64位來表示數(shù)字,那么如果我們依然用補(bǔ)碼來表示數(shù)字的話那么無論這個(gè)負(fù)數(shù)有多大還是多小都需要占據(jù)10個(gè)字節(jié)的空間。

為什么是10個(gè)字節(jié)呢?

不要忘了varint每個(gè)字節(jié)的有效負(fù)荷是7個(gè)比特,那么對(duì)于需要64位表示的數(shù)字來說就需要64/7向上取整也就是10個(gè)字節(jié)來表示。

這顯然不能滿足我們對(duì)數(shù)字變長存儲(chǔ)的要求。

該怎么解決這個(gè)問題呢?

既然無符號(hào)數(shù)字可以方便的進(jìn)行變長編碼,那么我們將有符號(hào)數(shù)字映射稱為無符號(hào)數(shù)字不就可以了,這就是所謂的ZigZag編碼,是不是很聰明,就像這樣:

原始信息      編碼后
0 0
-1 1
1 2
-2 3
2 4
-3 5
3 6

... ...

2147483647 4294967294
-2147483648 4294967295

這樣我們就可以將有符號(hào)數(shù)字轉(zhuǎn)為無符號(hào)數(shù)字,接收方接收到該數(shù)據(jù)后再恢復(fù)出有符號(hào)數(shù)字。

現(xiàn)在數(shù)字的問題徹底解決了,但這僅僅是萬里長征第一步。

字段名稱與字段類型

對(duì)于任何一個(gè)有用的信息都包含這樣幾部分:

  • 字段名稱
  • 字段類型
  • 字段值

就像C/C++中定義變量時(shí):

int i = 100;

在這里,字段名稱就是i,字段類型是int,字段值是100。

剛才我們用varint以及ZigZag編碼解決了字段值表示的問題,那么該怎樣表示字段名稱和字段類型呢?

首先,對(duì)于字段類型還比較簡(jiǎn)單,因?yàn)樽侄晤愋途湍敲炊啵琾rotobuf中定義了6種字段類型:

圖片

對(duì)于6種字段類型我們使用3個(gè)比特位來表示就足夠了。

接下來比較有趣的是字段名稱該怎么表示呢?假設(shè)我們需要傳遞這樣一個(gè)字段:

int long_long_name = 100;

那么我們真的需要把“l(fā)ong_long_name”這么多字符通過網(wǎng)絡(luò)傳遞給對(duì)端嗎?

既然通信雙方需要協(xié)議,那么“l(fā)ong_long_name”這字段其實(shí)是client和server都知道的,它們唯一不知道的就是“哪些值屬于哪些字段”。

為解決這個(gè)問題,我們給每個(gè)字段都進(jìn)行編號(hào),比如通信雙方都知道“l(fā)ong_long_name”這個(gè)字段的編號(hào)是2,那么對(duì)于:

int long_long_name = 100;

這個(gè)信息我們只需要傳遞:

  • 字段名稱:2 (2對(duì)應(yīng)字段“l(fā)ong_long_name”)
  • 字段類型:0 (0表示varint類型,參見上圖)
  • 字段值:100

所以我們可以看到,無論你用多么復(fù)雜的字段名稱也不會(huì)影響編碼后占據(jù)的空間,字段名稱根本就不會(huì)出現(xiàn)在編碼后的信息中,so clever。

從宏觀上看

我們已經(jīng)在protobuf中看到了數(shù)字以及字段名稱以及字段類型是怎么表示了,現(xiàn)在是時(shí)候從宏觀角度來看看多個(gè)字段該怎么編碼了。

從本質(zhì)上講,protobuf被編碼后形成一系列的key-value,每個(gè)key-value對(duì)應(yīng)一個(gè)proto中的字段。

也就是鍵值對(duì):

圖片

其中value比較簡(jiǎn)單,也就是字段值;而字段名稱和字段類型會(huì)被拼接成key,protobuf中共有6種類型,因此只需要3個(gè)比特位即可;字段名稱只需要存儲(chǔ)對(duì)應(yīng)的編號(hào),這樣可以就可以這樣編碼:

(字段編號(hào) << 3) | 字段類型

假設(shè)server接收到了一個(gè)key為0x08,其二進(jìn)制的表示為:

0000 1000

由于key也是利用varint編碼的,因此需要將第一個(gè)比特位去掉,這樣我的得到:

000 1000

根據(jù)key的編碼方式,其后三個(gè)比特位表示字段類型,即:

000

也就是0,這樣我們知道該key的類型是Varint(第0號(hào)類型),而字段編號(hào)為抹掉后3個(gè)比特位的值,即:

0001

這樣,我們就知道了該key對(duì)應(yīng)的字段編號(hào)為1,得到編號(hào)我們就能根據(jù)編號(hào)找到對(duì)應(yīng)的編號(hào)名稱。

嵌套數(shù)據(jù)

與Json和XML類似,protobuf中也支持嵌套消息,就像這樣:

message SubMsg {
optional int32 id = 1;
}
message Msg {
optional SubMsg msg = 1;
}

其實(shí)現(xiàn)也比較簡(jiǎn)單,這依然遵循被編碼后形成一系列的key-value,只不過對(duì)于嵌套類型的key來說,其value是由子消息的key-value組成。

圖片

protobuf與編譯語言

與Json一樣,protobuf也是一門語言,兼具了文本的可讀性以及二進(jìn)制的高效。

protobuf之所以能做到這一點(diǎn)就好比C語言與機(jī)器指令。

C語言是給程序員看的,可讀性好,而機(jī)器指令是給硬件使用的,性能好,編譯器會(huì)將C語言程序轉(zhuǎn)為機(jī)器可執(zhí)行的機(jī)器指令。

而protobuf也一樣,protobuf也是一門語言,會(huì)將可讀性較好的消息編碼為二進(jìn)制從而可以在網(wǎng)絡(luò)中進(jìn)行傳播,而對(duì)端也可以將其解碼回來。

在這里protobuf中定義的消息就好比C語言,編碼后的二進(jìn)制消息就好比機(jī)器指令。

而protobuf作為事實(shí)上語言必然有自己的語法,其語法就是這樣:

圖片

怎么樣,還覺得編譯原理沒什么用嗎?

不理解編譯原理是不可能發(fā)明protobuf這種技術(shù)的。

總結(jié)

我在寫這篇文章時(shí)不斷感嘆,Google的這項(xiàng)技術(shù)節(jié)省了多少程序員的時(shí)間,同時(shí)我們也能看到這種基石般的技術(shù)依賴的底層原理卻非常古老:

  • 信息的編解碼
  • 編譯原理

怎么樣,這些是不是遠(yuǎn)遠(yuǎn)沒有IT界各種流行的技術(shù)聽上去時(shí)髦有趣,而正是這種樸素的技術(shù)支撐起了工業(yè)界,現(xiàn)在你也應(yīng)該能明白底層技術(shù)的重要性了吧。

責(zé)任編輯:武曉燕 來源: 碼農(nóng)的荒島求生
相關(guān)推薦

2009-02-27 09:37:33

Google二進(jìn)制代碼

2021-03-08 21:50:48

序列化格式JSON

2017-04-11 10:48:53

JS二進(jìn)制

2010-10-13 15:45:23

MySQL二進(jìn)制日志

2018-10-22 14:37:16

二進(jìn)制數(shù)據(jù)存儲(chǔ)

2022-10-31 08:02:42

二進(jìn)制計(jì)算乘法

2011-05-25 14:10:38

浮點(diǎn)數(shù)

2021-11-10 09:15:00

CPU01 二進(jìn)制Linux

2021-01-14 09:40:54

漏洞macOS屬性表文件

2022-07-18 09:01:15

SwiftApple二進(jìn)制目標(biāo)

2021-06-11 21:46:31

RocketMQ數(shù)據(jù)JSON

2009-12-16 10:49:42

Ruby操作二進(jìn)制文件

2022-07-26 13:00:01

安全符號(hào)源代碼

2010-06-09 13:02:29

MySQL啟用二進(jìn)制日

2009-08-12 18:06:53

C#讀取二進(jìn)制文件

2020-10-10 14:27:01

kubernetes 二進(jìn)制部署

2010-04-16 09:42:25

Fedora 13Nvidia二進(jìn)制驅(qū)動(dòng)

2011-12-31 11:22:50

Web新世界

2011-12-31 09:31:57

Web

2021-10-08 14:32:33

電腦二進(jìn)制計(jì)算機(jī)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲美女少妇无套啪啪呻吟| 国产va免费精品观看精品| 99久久亚洲一区二区三区青草| 午夜伦理精品一区| 色欲狠狠躁天天躁无码中文字幕 | 欧美成人亚洲成人| 亚洲av网址在线| 色综合视频一区二区三区44| 亚洲影视在线观看| 日本精品视频一区| 国产精品久久a| caoporm免费视频在线| 成人黄色在线网站| 国产狼人综合免费视频| 国产午夜福利片| 大片网站久久| 亚洲成人黄色在线观看| 一区二区三区 日韩| 多野结衣av一区| 国产日韩亚洲欧美综合| 97超级碰碰| 中文字幕a级片| 9色国产精品| 久久久91精品| 波多野吉衣中文字幕| 午夜免费欧美电影| 欧美日韩精品电影| 国产淫片免费看| 污污视频在线看| 国产精品福利一区| 免费在线观看91| 亚洲欧美另类视频| 精品伊人久久久久7777人| 日本久久91av| 日韩特黄一级片| 欧美精品午夜| 久久精品夜夜夜夜夜久久| 日本黄色特级片| 国产日韩欧美中文| 香蕉污视频在线观看| 亚洲视频大全| 97国产在线观看| 免费一级肉体全黄毛片| 亚洲成av人电影| 在线国产精品播放| 日本三区在线观看| jizz一区二区三区| 一区二区日韩av| 亚洲国产精品女人| 欧美69xxx| 国产精品美女久久久久高潮| 欧美亚洲丝袜| 人操人视频在线观看| 91网站视频在线观看| 国产一区二区精品在线| 亚洲欧美激情国产综合久久久| 国产综合一区二区| 91久久久精品| 国产免费高清视频| 国产乱码精品一区二区三| 亚洲a成v人在线观看| 97免费观看视频| 精品一区二区三区欧美| 91理论片午午论夜理片久久| 一区二区三区精彩视频| 九九久久精品视频| 91久久在线视频| 亚洲成熟女性毛茸茸| 粉嫩aⅴ一区二区三区四区五区| 欧美精品久久久久久久久| 天天综合天天做| 综合一区二区三区| 久久久噜噜噜久久| 久久久久久久久久久久久久av| 国产欧美日韩一级| 国产精品精品一区二区三区午夜版 | 97国产精品人人爽人人做| 国产情侣在线视频| 日日摸夜夜添夜夜添亚洲女人| 国产精品91在线| 一级黄色免费片| 风间由美性色一区二区三区 | 深爱五月激情五月| 久久蜜桃av一区二区天堂| 小说区图片区图片区另类灬| 秋霞成人影院| 亚洲国产aⅴ天堂久久| 亚洲乱码中文字幕久久孕妇黑人| 粉嫩一区二区三区| 7777精品伊人久久久大香线蕉经典版下载 | 国产午夜手机精彩视频| 亚洲无吗在线| 国产成人精品在线观看| 国产精品无码AV| av不卡免费在线观看| 色吧亚洲视频| 尤物视频在线看| 色哟哟精品一区| 91精品视频国产| 欧美性生活一级片| 色阁综合伊人av| 在线观看成人毛片| 日欧美一区二区| 国产精品综合久久久| 日本波多野结衣在线| 国产欧美精品区一区二区三区 | 中国极品少妇xxxx| 欧美三级伦理在线| 久久999免费视频| 日韩欧美一级大片| proumb性欧美在线观看| 亚洲美女自拍偷拍| 日韩av中字| 精品久久久久久亚洲综合网| 免费成人深夜蜜桃视频| 国产精品亚洲综合久久| 成人在线激情视频| 九色在线观看| 亚洲成人www| 免费在线观看污网站| 中日韩免视频上线全都免费| 九九热这里只有精品6| 亚洲午夜无码久久久久| eeuss国产一区二区三区| 中文字幕中文字幕99| 午夜欧美巨大性欧美巨大 | japan高清日本乱xxxxx| 成人情趣视频网站| 欧美在线视频一区| 黄色av中文字幕| 亚洲黄网站在线观看| 天天干天天操天天做| 欧美激情在线精品一区二区三区| 欧美激情亚洲国产| 国产高清免费av| 中文字幕一区二区三区在线播放| 爱情岛论坛vip永久入口| 秋霞蜜臀av久久电影网免费| 久久久久成人精品| www.蜜臀av.com| 亚洲免费高清视频在线| 午夜一级免费视频| 91超碰国产精品| 国产精品亚洲第一区| 国产h视频在线观看| 色综合天天天天做夜夜夜夜做| 大乳护士喂奶hd| 激情自拍一区| 国产精品区一区二区三在线播放 | 亚洲午夜免费视频| 免费在线观看日韩av| 欧美国产综合| 动漫3d精品一区二区三区| av在线下载| 日韩午夜精品电影| 妺妺窝人体色www聚色窝仙踪 | 黄色在线免费看| 欧美久久免费观看| 中文字幕av播放| 国产精品一品二品| 久操手机在线视频| 美女一区二区在线观看| 97成人超碰免| 黄色在线网站| 欧美日韩国产在线观看| 国产精品白丝喷水在线观看| 国产精品影视网| 91.com在线| 日韩高清成人在线| 国产精品18久久久久久首页狼| 国产九色在线| 欧美男男青年gay1069videost| 国产一区二区三区在线视频观看| 国产一区二区免费在线| 日韩精品在线中文字幕| 卡通动漫国产精品| 国产999精品久久久| 在线观看美女网站大全免费| 欧美一区二区在线看| 国产网址在线观看| 久久久久久**毛片大全| 国产aⅴ爽av久久久久| 狠狠88综合久久久久综合网| 久久国产精品-国产精品| 成人不卡视频| 欧美日韩成人精品| 欧洲毛片在线| 宅男在线国产精品| 天天操天天摸天天干| 国产精品亲子乱子伦xxxx裸| 午夜视频在线免费看| 噜噜噜在线观看免费视频日韩| 亚洲高清123| 岛国精品一区| 国产精品高潮视频| 黑人另类精品××××性爽| 亚洲女同性videos| 国产成人精品一区二三区四区五区 | 国产av不卡一区二区| 日韩极品在线| 92看片淫黄大片看国产片| 蜜桃麻豆av在线| www.美女亚洲精品| 亚洲色图另类小说| 91精品黄色片免费大全| 中文字幕av影院| 一区二区三区高清| 日本人亚洲人jjzzjjz| 成人激情午夜影院| 深夜黄色小视频| 99视频精品| avove在线观看| 欧美色女视频| 好看的日韩精品视频在线| 高清不卡一区| 国产精品久久在线观看| 色是在线视频| 欧美激情免费在线| 国产精品久久麻豆| 中文字幕日韩有码| 国产精品黄色大片| 亚洲免费av在线| 日韩视频在线观看免费视频| 9人人澡人人爽人人精品| 国产高清999| 免费观看在线综合| 欧美韩国日本在线| 日韩天堂av| 欧美无砖专区免费| 一区二区三区毛片免费| 一本色道久久99精品综合| 亚洲制服欧美另类| 久草精品电影| 开心激情综合| 国产高清不卡av| 秋霞影院一区| 91福利视频导航| 国产高清视频一区二区| 国产日韩在线观看av| 欧美日韩在线精品一区二区三区激情综合 | 成人午夜免费影院| 亚洲国产精品成人综合| a级在线免费观看| 久久综合成人精品亚洲另类欧美 | 亚洲开心激情| 成人资源av| 中文字幕亚洲在线观看 | 北条麻妃一二三区| 日韩欧美亚洲另类制服综合在线| 国产乱淫av免费| 欧美一二三四区在线| 国产成人免费看一级大黄| 91精品国产综合久久香蕉的特点| 国产露脸国语对白在线| 欧美一级片免费看| 亚洲第一天堂影院| 精品成人佐山爱一区二区| 日本久久一级片| 精品调教chinesegay| 好男人免费精品视频| 亚洲色图国产精品| av大全在线免费看| 美女av一区二区三区| 日韩影视在线| 91极品视频在线| 欧美黄色网页| 91精品国产自产在线观看永久| 国产95亚洲| 国产有色视频色综合| 国产欧美日韩免费观看| 一区二区三区四区不卡| 欧美va天堂在线| www插插插无码视频网站| 久久电影一区| 国产精品嫩草影院8vv8| 国产传媒欧美日韩成人| 亚洲国产精品无码久久久久高潮| 久久久久国产精品麻豆ai换脸 | 亚洲综合在线免费观看| 99热国产在线观看| 欧美三级中文字幕| 亚洲第一成人av| 亚洲欧洲一区二区三区久久| 好吊日视频在线观看| 91精品国产乱码久久久久久久久| 日韩免费小视频| 亚洲最大的网站| 国产区精品区| 国产成人生活片| 久久国产欧美| 色哟哟在线观看视频| 99久久99精品久久久久久| 国产又黄又粗视频| 亚洲亚洲精品在线观看| 九九热最新视频| 精品国产一区久久| 日韩黄色影院| 91av在线播放| 国产精品久久久久久av公交车| 鲁丝片一区二区三区| 一级毛片免费高清中文字幕久久网| 岛国大片在线播放| 久久99精品久久久| 成人影视免费观看| 一区二区在线观看免费视频播放| 成人午夜视频在线播放| 欧美一区二区三区男人的天堂| 黄色av免费在线观看| 午夜精品久久久久久久久久久久| 激情久久一区二区| 蜜桃91精品入口| 国产精品地址| 毛片毛片毛片毛| 国产日韩欧美一区二区三区乱码 | 成人动漫在线免费观看| 久久久久久九九九| 高清久久精品| 亚洲一区二三| 久久青草久久| av无码一区二区三区| 洋洋av久久久久久久一区| 国产精品久久久久久久久久久久久久久久| 亚洲精品国偷自产在线99热| av在线免费观看网址| 91精品久久久久久久| 少妇精品久久久| av网站手机在线观看| 国产一区二区三区免费看 | 国产精品久久久久秋霞鲁丝| 欧美日韩一本| 免费国产黄色网址| 懂色一区二区三区免费观看| avove在线播放| 欧美一区二区大片| 国产黄色在线观看| 成人网欧美在线视频| 日韩专区精品| 天天操天天摸天天爽| 国产亚洲欧美在线| 99超碰在线观看| 亚洲欧美制服第一页| 自拍偷拍亚洲视频| 久99久视频| 香蕉视频成人在线观看| 无码人妻aⅴ一区二区三区| 精品久久久视频| 日韩在线免费看| 欧美在线亚洲在线| 免费av一区二区三区四区| 黄色国产精品视频| 久久久久九九视频| 精品乱码一区内射人妻无码| 中文字幕日韩电影| 日韩福利影视| 久久久无码中文字幕久...| 国产一区日韩二区欧美三区| 欧美黄色aaa| 精品国产乱码久久久久久夜甘婷婷 | www.亚洲激情| 少妇av一区二区三区| 日韩亚洲国产免费| 干日本少妇视频| 国产成人免费在线视频| 国产一卡二卡在线| 亚洲国产成人久久综合一区| 中文在线8资源库| 色就是色欧美| 国产一区视频导航| 国产无遮挡又黄又爽| 亚洲老头老太hd| 国产原创一区| 免费看日b视频| 91玉足脚交白嫩脚丫在线播放| 久久久久久久久黄色| 日韩在线视频一区| 66精品视频在线观看| www黄色日本| 国产精品乱人伦一区二区| 性一交一乱一色一视频麻豆| 国产69久久精品成人看| 日韩电影一区| 2018国产精品| 91久久人澡人人添人人爽欧美| 日本免费在线观看| 国产一区二区精品免费| 免费高清视频精品| 久久久久无码精品国产| 亚洲欧洲在线看| 日本亚洲视频| 久久久免费视频网站| 日韩一区在线播放| 无码精品人妻一区二区| 国产精品视频免费在线观看| 黄色国产精品| 精品人体无码一区二区三区| 精品国产亚洲一区二区三区在线观看 | 国产精品日产欧美久久久久| 国产成人精品白浆久久69| 国产精品video| 狠狠综合久久|