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

HTTP/2 頭部壓縮技術介紹

網絡 網絡管理
我們知道,HTTP/2 協議由兩個 RFC 組成:一個是 RFC 7540,描述了 HTTP/2 協議本身;一個是 RFC 7541,描述了 HTTP/2 協議中使用的頭部壓縮技術。本文將通過實際案例帶領大家詳細地認識 HTTP/2 頭部壓縮這門技術。

我們知道,HTTP/2 協議由兩個 RFC 組成:一個是 RFC 7540,描述了 HTTP/2 協議本身;一個是 RFC 7541,描述了 HTTP/2 協議中使用的頭部壓縮技術。本文將通過實際案例帶領大家詳細地認識 HTTP/2 頭部壓縮這門技術。

為什么要壓縮

在 HTTP/1 中,HTTP 請求和響應都是由「狀態行、請求 / 響應頭部、消息主體」三部分組成。一般而言,消息主體都會經過 gzip 壓縮,或者本身傳輸的就是壓縮過后的二進制文件(例如圖片、音頻),但狀態行和頭部卻沒有經過任何壓縮,直接以純文本傳輸。

隨著 Web 功能越來越復雜,每個頁面產生的請求數也越來越多,根據 HTTP Archive 的統計,當前平均每個頁面都會產生上百個請求。越來越多的請求導致消耗在頭部的流量越來越多,尤其是每次都要傳輸 UserAgent、Cookie 這類不會頻繁變動的內容,完全是一種浪費。

以下是我隨手打開的一個頁面的抓包結果。可以看到,傳輸頭部的網絡開銷超過 100kb,比 HTML 還多:

 [[154303]]

下面是其中一個請求的明細。可以看到,為了獲得 58 字節的數據,在頭部傳輸上花費了好幾倍的流量:

 [[154304]]

HTTP/1 時代,為了減少頭部消耗的流量,有很多優化方案可以嘗試,例如合并請求、啟用 Cookie-Free 域名等等,但是這些方案或多或少會引入一些新的問題,這里不展開討論。

壓縮后的效果

接下來我將使用訪問本博客的抓包記錄來說明 HTTP/2 頭部壓縮帶來的變化。

首先直接上圖。下圖選中的 Stream 是***訪問本站,瀏覽器發出的請求頭:

 [[154305]]

從圖片中可以看到這個 HEADERS 流的長度是 206 個字節,而解碼后的頭部長度有 451 個字節。由此可見,壓縮后的頭部大小減少了一半多。

然而這就是全部嗎?再上一張圖。下圖選中的 Stream 是點擊本站鏈接后,瀏覽器發出的請求頭:

 [[154306]]

可以看到這一次,HEADERS 流的長度只有 49 個字節,但是解碼后的頭部長度卻有 470 個字節。這一次,壓縮后的頭部大小幾乎只有原始大小的 1/10。

為什么前后兩次差距這么大呢?我們把兩次的頭部信息展開,查看同一個字段兩次傳輸所占用的字節數:

 [[154307]]

 [[154308]]

對比后可以發現,第二次的請求頭部之所以非常小,是因為大部分鍵值對只占用了一個字節。尤其是 UserAgent、Cookie 這樣的頭部,***請求中需要占用很多字節,后續請求中都只需要一個字節。

#p#

技術原理

下面這張截圖,取自 Google 的性能專家 Ilya Grigorik 在 Velocity 2015 • SC 會議中分享的「HTTP/2 is here, let's optimize!」,非常直觀地描述了 HTTP/2 中頭部壓縮的原理:

 [[154309]]

我再用通俗的語言解釋下,頭部壓縮需要在支持 HTTP/2 的瀏覽器和服務端之間:

維護一份相同的靜態字典(Static Table),包含常見的頭部名稱,以及特別常見的頭部名稱與值的組合;

維護一份相同的動態字典(Dynamic Table),可以動態的添加內容;

支持基于靜態哈夫曼碼表的哈夫曼編碼(Huffman Coding);

靜態字典的作用有兩個:1)對于完全匹配的頭部鍵值對,例如 :method :GET,可以直接使用一個字符表示;2)對于頭部名稱可以匹配的鍵值對,例如 cookie :xxxxxxx,可以將名稱使用一個字符表示。HTTP/2 中的靜態字典如下(以下只截取了部分):

HTTP/2 頭部壓縮技術介紹

同時,瀏覽器可以告知服務端,將 cookie :xxxxxxx 添加到動態字典中,這樣后續整個鍵值對就可以使用一個字符表示了。類似的,服務端也可以更新對方的動態字典。需要注意的是,動態字典上下文有關,需要為每個 HTTP/2 連接維護不同的字典。

使用字典可以極大地提升壓縮效果,其中靜態字典在***請求中就可以使用。對于靜態、動態字典中不存在的內容,還可以使用哈夫曼編碼來減小體積。HTTP/2 使用了一份靜態哈夫曼碼表(詳見),也需要內置在客戶端和服務端之中。

這里順便說一下,HTTP/1 的狀態行信息(Method、Path、Status 等),在 HTTP/2 中被拆成鍵值對放入頭部(冒號開頭的那些),同樣可以享受到字典和哈夫曼壓縮。另外,HTTP/2 中所有頭部名稱必須小寫。

實現細節

了解了 HTTP/2 頭部壓縮的基本原理,***我們來看一下具體的實現細節。HTTP/2 的頭部鍵值對有以下這些情況:

1)整個頭部鍵值對都在字典中

  1. 0 1 2 3 4 5 6 7 
  2.  
  3. +---+---+---+---+---+---+---+---+ 
  4.  
  5. | 1 | Index (7+) | 
  6.  
  7. +---+---------------------------+ 

這是最簡單的情況,使用一個字節就可以表示這個頭部了,最左一位固定為 1,之后七位存放鍵值對在靜態或動態字典中的索引。例如下圖中,頭部索引值為 2(0000010),在靜態字典中查詢可得 :method :GET。

 [[154310]]

#p#

2)頭部名稱在字典中,更新動態字典

  1. 0 1 2 3 4 5 6 7 
  2.  
  3. +---+---+---+---+---+---+---+---+ 
  4.  
  5. | 0 | 1 | Index (6+) | 
  6.  
  7. +---+---+-----------------------+ 
  8.  
  9. | H | Value Length (7+) | 
  10.  
  11. +---+---------------------------+ 
  12.  
  13. | Value String (Length octets) | 
  14.  
  15. +-------------------------------+ 

對于這種情況,首先需要使用一個字節表示頭部名稱:左兩位固定為 01,之后六位存放頭部名稱在靜態或動態字典中的索引。接下來的一個字節***位 H 表示頭部值是否使用了哈夫曼編碼,剩余七位表示頭部值的長度 L,后續 L 個字節就是頭部值的具體內容了。例如下圖中索引值為 32(100000),在靜態字典中查詢可得 cookie;頭部值使用了哈夫曼編碼(1),長度是 28(0011100);接下來的 28 個字節是 cookie 的值,將其進行哈夫曼解碼就能得到具體內容。

 [[154311]]

客戶端或服務端看到這種格式的頭部鍵值對,會將其添加到自己的動態字典中。后續傳輸這樣的內容,就符合第 1 種情況了。

3)頭部名稱不在字典中,更新動態字典

  1. 0 1 2 3 4 5 6 7 
  2.  
  3. +---+---+---+---+---+---+---+---+ 
  4.  
  5. | 0 | 1 | 0 | 
  6.  
  7. +---+---+-----------------------+ 
  8.  
  9. | H | Name Length (7+) | 
  10.  
  11. +---+---------------------------+ 
  12.  
  13. | Name String (Length octets) | 
  14.  
  15. +---+---------------------------+ 
  16.  
  17. | H | Value Length (7+) | 
  18.  
  19. +---+---------------------------+ 
  20.  
  21. | Value String (Length octets) | 
  22.  
  23. +-------------------------------+ 

這種情況與第 2 種情況類似,只是由于頭部名稱不在字典中,所以***個字節固定為 01000000;接著申明名稱是否使用哈夫曼編碼及長度,并放上名稱的具體內容;再申明值是否使用哈夫曼編碼及長度,***放上值的具體內容。例如下圖中名稱的長度是 5(0000101),值的長度是 6(0000110)。對其具體內容進行哈夫曼解碼后,可得 pragma: no-cache。

 [[154312]]

客戶端或服務端看到這種格式的頭部鍵值對,會將其添加到自己的動態字典中。后續傳輸這樣的內容,就符合第 1 種情況了。

4)頭部名稱在字典中,不允許更新動態字典

  1. 0 1 2 3 4 5 6 7 
  2.  
  3. +---+---+---+---+---+---+---+---+ 
  4.  
  5. | 0 | 0 | 0 | 1 | Index (4+) | 
  6.  
  7. +---+---+-----------------------+ 
  8.  
  9. | H | Value Length (7+) | 
  10.  
  11. +---+---------------------------+ 
  12.  
  13. | Value String (Length octets) | 
  14.  
  15. +-------------------------------+ 

這種情況與第 2 種情況非常類似,唯一不同之處是:***個字節左四位固定為 0001,只剩下四位來存放索引了,如下圖:

 [[154313]]

這里需要介紹另外一個知識點:對整數的解碼。上圖中***個字節為 00011111,并不代表頭部名稱的索引為 15(1111)。***個字節去掉固定的 0001,只剩四位可用,將位數用 N 表示,它只能用來表示小于「2 ^ N - 1 = 15」的整數 I。對于 I,需要按照以下規則求值(RFC 7541 中的偽代碼,via):

  1. PYTHONif I < 2 ^ N - 1, return I # I 小于 2 ^ N - 1 時,直接返回 
  2.  
  3. else 
  4.  
  5. M = 0 
  6.  
  7. repeat 
  8.  
  9. B = next octet # 讓 B 等于下一個八位 
  10.  
  11. I = I + (B & 127) * 2 ^ M # I = I + (B 低七位 * 2 ^ M) 
  12.  
  13. M = M + 7 
  14.  
  15. while B & 128 == 128 # B ***位 = 1 時繼續,否則返回 I 
  16.  
  17. return I 

對于上圖中的數據,按照這個規則算出索引值為 32(00011111 00010001,15 + 17),代表 cookie。需要注意的是,協議中所有寫成(N+)的數字,例如 Index (4+)、Name Length (7+),都需要按照這個規則來編碼和解碼。

這種格式的頭部鍵值對,不允許被添加到動態字典中(但可以使用哈夫曼編碼)。對于一些非常敏感的頭部,比如用來認證的 Cookie,這么做可以提高安全性。

#p#

5)頭部名稱不在字典中,不允許更新動態字典

  1. 0 1 2 3 4 5 6 7 
  2.  
  3. +---+---+---+---+---+---+---+---+ 
  4.  
  5. | 0 | 0 | 0 | 1 | 0 | 
  6.  
  7. +---+---+-----------------------+ 
  8.  
  9. | H | Name Length (7+) | 
  10.  
  11. +---+---------------------------+ 
  12.  
  13. | Name String (Length octets) | 
  14.  
  15. +---+---------------------------+ 
  16.  
  17. | H | Value Length (7+) | 
  18.  
  19. +---+---------------------------+ 
  20.  
  21. | Value String (Length octets) | 
  22.  
  23. +-------------------------------+ 

這種情況與第 3 種情況非常類似,唯一不同之處是:***個字節固定為 00010000。這種情況比較少見,沒有截圖,各位可以腦補。同樣,這種格式的頭部鍵值對,也不允許被添加到動態字典中,只能使用哈夫曼編碼來減少體積。

實際上,協議中還規定了與 4、5 非常類似的另外兩種格式:將 4、5 格式中的***個字節第四位由 1 改為 0 即可。它表示「本次不更新動態詞典」,而 4、5 表示「絕對不允許更新動態詞典」。區別不是很大,這里略過。

明白了頭部壓縮的技術細節,理論上可以很輕松寫出 HTTP/2 頭部解碼工具了。我比較懶,直接找來 node-http2 中的 compressor.js 驗證一下:

  1. JSvar Decompressor = require('./compressor').Decompressor; 
  2.  
  3. var testLog = require('bunyan').createLogger({name: 'test'}); 
  4.  
  5. var decompressor = new Decompressor(testLog, 'REQUEST'); 
  6.  
  7. var buffer = new Buffer('820481634188353daded6ae43d3f877abdd07f66a281b0dae053fad0321aa49d13fda992a49685340c8a6adca7e28102e10fda9677b8d05707f6a62293a9d810020004015309ac2ca7f2c3415c1f53b0497ca589d34d1f43aeba0c41a4c7a98f33a69a3fdf9a68fa1d75d0620d263d4c79a68fbed00177febe58f9fbed00177b518b2d4b70ddf45abefb4005db901f1184ef034eff609cb60725034f48e1561c8469669f081678ae3eb3afba465f7cb234db9f4085aec1cd48ff86a8eb10649cbf''hex'); 
  8.  
  9. console.log(decompressor.decompress(buffer)); 
  10.  
  11. decompressor._table.forEach(function(row, index) { 
  12.  
  13. console.log(index + 1, row[0], row[1]); 
  14.  
  15. }); 

頭部原始數據來自于本文第三張截圖,運行結果如下(靜態字典只截取了一部分):

  1. BASH{ ':method''GET'
  2.  
  3. ':path''/'
  4.  
  5. ':authority''imququ.com'
  6.  
  7. ':scheme''https'
  8.  
  9. 'user-agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:41.0) Gecko/20100101 Firefox/41.0'
  10.  
  11. accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
  12.  
  13. 'accept-language''en-US,en;q=0.5'
  14.  
  15. 'accept-encoding''gzip, deflate'
  16.  
  17. cookie: 'v=47; u=6f048d6e-adc4-4910-8e69-797c399ed456'
  18.  
  19. pragma: 'no-cache' } 
  20.  
  21. ':authority' '' 
  22.  
  23. ':method' 'GET' 
  24.  
  25. ':method' 'POST' 
  26.  
  27. ':path' '/' 
  28.  
  29. ':path' '/index.html' 
  30.  
  31. ':scheme' 'http' 
  32.  
  33. ':scheme' 'https' 
  34.  
  35. ':status' '200' 
  36.  
  37. ... ... 
  38.  
  39. 32 'cookie' '' 
  40.  
  41. ... ... 
  42.  
  43. 60 'via' '' 
  44.  
  45. 61 'www-authenticate' '' 
  46.  
  47. 62 'pragma' 'no-cache' 
  48.  
  49. 63 'cookie' 'u=6f048d6e-adc4-4910-8e69-797c399ed456' 
  50.  
  51. 64 'accept-language' 'en-US,en;q=0.5' 
  52.  
  53. 65 'accept' 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' 
  54.  
  55. 66 'user-agent' 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:41.0) Gecko/20100101 Firefox/41.0' 
  56.  
  57. 67 ':authority' 'imququ.com' 

可以看到,這段從 Wireshark 拷出來的頭部數據可以正常解碼,動態字典也得到了更新(62 - 67)。

總結

在進行 HTTP/2 網站性能優化時很重要一點是「使用盡可能少的連接數」,本文提到的頭部壓縮是其中一個很重要的原因:同一個連接上產生的請求和響應越多,動態字典積累得越全,頭部壓縮效果也就越好。所以,針對 HTTP/2 網站,***實踐是不要合并資源,不要散列域名。

默認情況下,瀏覽器會針對這些情況使用同一個連接:

同一域名下的資源;

不同域名下的資源,但是滿足兩個條件:1)解析到同一個 IP;2)使用同一個證書;

上面***點容易理解,第二點則很容易被忽略。實際上 Google 已經這么做了,Google 一系列網站都共用了同一個證書,可以這樣驗證:

  1. BASH$ openssl s_client -connect google.com:443 |openssl x509 -noout -text | grep DNS 
  2.  
  3. depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA 
  4.  
  5. verify error:num=20:unable to get local issuer certificate 
  6.  
  7. verify return:0 
  8.  
  9. DNS:*.google.com, DNS:*.android.com, DNS:*.appengine.google.com, DNS:*.cloud.google.com, DNS:*.google-analytics.com, DNS:*.google.ca, DNS:*.google.cl, DNS:*.google.co.in, DNS:*.google.co.jp, DNS:*.google.co.uk, DNS:*.google.com.ar, DNS:*.google.com.au, DNS:*.google.com.br, DNS:*.google.com.co, DNS:*.google.com.mx, DNS:*.google.com.tr, DNS:*.google.com.vn, DNS:*.google.de, DNS:*.google.es, DNS:*.google.fr, DNS:*.google.hu, DNS:*.google.it, DNS:*.google.nl, DNS:*.google.pl, DNS:*.google.pt, DNS:*.googleadapis.com, DNS:*.googleapis.cn, DNS:*.googlecommerce.com, DNS:*.googlevideo.com, DNS:*.gstatic.cn, DNS:*.gstatic.com, DNS:*.gvt1.com, DNS:*.gvt2.com, DNS:*.metric.gstatic.com, DNS:*.urchin.com, DNS:*.url.google.com, DNS:*.youtube-nocookie.com, DNS:*.youtube.com, DNS:*.youtubeeducation.com, DNS:*.ytimg.com, DNS:android.com, DNS:g.co, DNS:goo.gl, DNS:google-analytics.com, DNS:google.com, DNS:googlecommerce.com, DNS:urchin.com, DNS:youtu.be, DNS:youtube.com, DNS:youtubeeducation.com 

使用多域名加上相同的 IP 和證書部署 Web 服務有特殊的意義:讓支持 HTTP/2 的終端只建立一個連接,用上 HTTP/2 協議帶來的各種好處;而只支持 HTTP/1.1 的終端則會建立多個連接,達到同時更多并發請求的目的。這在 HTTP/2 完全普及前也是一個不錯的選擇。

責任編輯:何妍 來源: Jerry Qu的小站
相關推薦

2021-05-11 08:31:48

HTTP21.1

2010-06-24 10:42:42

Bzip2壓縮

2014-11-13 10:57:03

http協議

2009-07-07 15:24:49

Http Servle

2012-02-24 09:53:24

JavaPlay Framew

2025-07-01 07:53:47

2020-03-08 21:22:03

HTTP112

2009-07-07 17:32:31

HTTP Servle

2015-12-15 15:27:37

NginxHTTP網絡協議

2018-01-12 17:03:29

HTTPgzip壓縮

2019-09-23 08:35:52

2023-09-06 12:01:50

HTTP協議信息

2024-11-05 08:16:04

HTTP/3HTTP 2.0QUIC

2009-12-29 15:44:11

ADO.NET檢索技術

2010-03-04 13:54:39

Linux壓縮命令

2019-12-13 09:14:35

HTTP2協議

2015-09-15 13:48:01

網絡協議HTTP Client

2009-07-02 10:27:20

JSP技術JSP入門

2009-06-29 14:30:27

JSF技術

2009-07-02 12:56:01

JSP技術
點贊
收藏

51CTO技術棧公眾號

清纯唯美亚洲色图| 久久久久亚洲AV成人| 性欧美18一19sex性欧美| 久久综合九色综合欧美98| 日韩免费观看在线观看| 欧洲美熟女乱又伦| 欧美一区=区三区| 亚洲精品成人a在线观看| 97人人干人人| 日韩精品一区二区亚洲av| 国精一区二区| 欧美一区二区三区电影| 欧美久久久久久久久久久久久| 国产又爽又黄网站亚洲视频123| 久久精品综合| 久久久国产精品视频| 欧美午夜精品一区二区| 神马久久资源| 亚洲狠狠丁香婷婷综合久久久| 韩国成人av| 91精品国产色综合久久不8| 亚洲高清成人| 色偷偷av一区二区三区| 日本黄色动态图| 国产一区影院| 狠狠综合久久av一区二区小说| 五月天亚洲综合情| 日本xxxx人| 麻豆国产精品一区二区三区 | 国产精品久久久久久久久久久久久久 | 精品免费囯产一区二区三区| 99精品视频精品精品视频| 日韩成人久久久| 午夜免费一级片| 免费欧美电影| 亚洲成人一区二区| 中国 免费 av| 中文字幕在线播放| 久久综合久久综合亚洲| 亚洲a在线播放| 最近中文字幕免费在线观看| 国产精品免费看| 欧美精品激情在线| 中国一级片在线观看| 成人动漫免费在线观看| 国产网站欧美日韩免费精品在线观看| 亚欧美一区二区三区| 欧美成人aaa| 欧洲中文字幕精品| av观看免费在线| 牛牛精品一区二区| 午夜不卡在线视频| 亚洲精品无码国产| 国产探花视频在线观看| 亚洲精品国产成人久久av盗摄 | 国产精品无码自拍| 日韩欧美久久| 日韩一区二区三区电影| 香蕉视频xxxx| 日本亚州欧洲精品不卡| 欧美一级搡bbbb搡bbbb| 捷克做爰xxxⅹ性视频| 午夜不卡一区| 欧美区在线观看| 五月天激情视频在线观看| 成人av观看| 色婷婷综合在线| 爆乳熟妇一区二区三区霸乳| 偷拍中文亚洲欧美动漫| 欧美亚一区二区| 国产免费又粗又猛又爽| 欧美videos粗暴| 欧美一区二区三区免费在线看| 欧美体内she精高潮| 免费一级欧美在线大片| 欧美mv和日韩mv的网站| av漫画在线观看| 日韩大胆成人| 国产亚洲xxx| 国产白丝一区二区三区| 亚洲电影影音先锋| 欧美高清在线观看| 日韩激情一区二区三区| 亚洲裸体俱乐部裸体舞表演av| 91高清免费视频| 一二三区免费视频| 精品一区二区三区的国产在线播放| 国产日韩欧美综合| 性一交一乱一色一视频麻豆| av毛片久久久久**hd| 欧美午夜精品理论片a级大开眼界| 国产中文在线观看| 亚洲少妇30p| 日本福利视频在线观看| 久草在线中文最新视频| 在线亚洲人成电影网站色www| 色播五月激情五月| 91精品啪在线观看国产爱臀| 国产丝袜一区二区| 午夜剧场免费在线观看| 亚洲日本免费| 国产精品第1页| 国内精品偷拍视频| 久久亚洲欧美国产精品乐播 | 日韩欧美国产骚| 福利视频999| 美女主播精品视频一二三四| 一区二区三区视频免费| 久久久久97国产| 日韩精品一二三| www日韩av| 337p日本欧洲亚洲大胆鲁鲁| 亚洲一区二区中文在线| 热久久精品免费视频| 成人影院中文字幕| 精品国产欧美一区二区三区成人| 久久精品无码人妻| 蜜桃av一区二区| 韩国精品一区二区三区六区色诱| 欧美性猛交xxx乱大交3蜜桃| 黑人巨大精品欧美一区二区免费| 亚洲美女性囗交| 国产精品免费不| 久久久人成影片一区二区三区观看| 日韩国产亚洲欧美| 91免费版在线| 天堂8在线天堂资源bt| 久久婷婷五月综合色丁香| 精品亚洲va在线va天堂资源站| 日韩一级片大全| 日本中文一区二区三区| 久久久一本精品99久久精品| 主播国产精品| 欧美精品日韩一本| 影音先锋制服丝袜| 久久人人精品| 国产一区二区三区四区hd| 黄色av电影在线播放| 欧美自拍偷拍午夜视频| 法国伦理少妇愉情| 国产日韩欧美三级| 国产一区二区精品免费| 超碰在线中文字幕| 日韩视频免费观看高清在线视频| 亚洲综合久久av一区二区三区| 天堂va蜜桃一区二区三区 | 亚洲成人av免费看| 亚洲系列另类av| 91精品国产高清自在线| 国精产品乱码一区一区三区四区| 亚洲免费观看高清完整版在线观看| 黄色国产小视频| 极品美女一区二区三区| 日韩免费黄色av| 成人全视频高清免费观看| 欧美性xxxx在线播放| 无码熟妇人妻av| 亚洲欧美日本视频在线观看| 乱色588欧美| 伊人久久国产| 中文国产成人精品| 最近中文字幕在线免费观看| 国产欧美va欧美不卡在线| 欧美午夜性生活| 欧美一区二区性| 国产在线观看不卡| 成人在线视频亚洲| 日韩精品一区二区三区四区| 欧美日韩精品亚洲精品| 懂色av中文字幕一区二区三区| 国产乱淫av片杨贵妃| 精品一区二区男人吃奶| 青青草原一区二区| av网站在线播放| 欧美高清激情brazzers| 青青草手机在线视频| 成人h精品动漫一区二区三区| 欧美亚洲精品一区二区| 精品美女在线视频| 成人高h视频在线| 黑人精品视频| 亚洲美女自拍视频| 国产主播第一页| 中文字幕一区二区三区不卡| 台湾佬美性中文| 国产欧美日韩综合一区在线播放 | 亚洲高清免费视频| 亚洲av无码一区二区二三区| 麻豆专区一区二区三区四区五区| 中文字幕乱码免费| 牛牛影视久久网| 国产精品国产福利国产秒拍| 18在线观看的| 精品香蕉一区二区三区| 夜夜狠狠擅视频| 亚洲不卡一区二区三区| 先锋影音av在线| 国产成人精品免费一区二区| 欧美视频第一区| 亚洲草久电影| 欧美一区二区视频17c | 精品婷婷色一区二区三区蜜桃| 日本欧美韩国| 久久久久久亚洲| 日本在线免费看| 亚洲精品mp4| 国产精品一级二级| 色婷婷激情综合| 久久久久久蜜桃| 中文字幕免费观看一区| 少妇精品无码一区二区三区| 黄一区二区三区| 国内外免费激情视频| 国产精品videosex极品| 亚洲精品高清国产一线久久| 日韩动漫一区| 99伊人久久| 日韩一级视频| 国产成人精品亚洲精品| 麻豆蜜桃在线观看| 欧美另类极品videosbest最新版本| 国产www.大片在线| 日韩国产高清视频在线| 亚洲精品字幕在线观看| 91精品在线一区二区| 亚洲精品国产精品乱码视色| 欧美日韩国产激情| 欧美日韩综合一区二区| 中文字幕亚洲电影| 丁香激情五月少妇| 久久久久久97三级| 久久久久久久人妻无码中文字幕爆| 蜜桃视频免费观看一区| 在线不卡视频一区二区| 欧美亚洲精品在线| 六月婷婷久久| 日日狠狠久久偷偷综合色| 成人黄色午夜影院| 性欧美freehd18| 久久久久久成人精品| 伊人春色在线观看| 日日骚久久av| 国产在线视频网| 亚洲日本成人网| 污视频在线免费| 日韩欧美成人一区二区| 96日本xxxxxⅹxxx17| 欧美无砖专区一中文字| 国产寡妇亲子伦一区二区三区四区 | 国产精品久久久久免费a∨大胸| h视频在线免费观看| 久久久999国产| 午夜不卡视频| 国产一区二区三区中文| www.亚洲视频| 一区二区日韩精品| 男女网站在线观看| 亚洲成人精品视频| 亚洲国产精品一| 日韩欧美另类在线| 国产成人精品无码高潮| 欧美成人综合网站| 丰满人妻妇伦又伦精品国产 | 色噜噜在线播放| 精品国产电影一区二区| 亚洲第一精品网站| 亚洲国产精品网站| 深夜视频在线免费| 亚洲免费伊人电影在线观看av| 亚洲欧美丝袜中文综合| 日韩精品在线免费观看视频| 手机看片福利在线观看| 亚洲男人第一av网站| 97在线观看免费观看高清| 国产一区二区三区丝袜| 超碰免费在线观看| 尤物精品国产第一福利三区| 天天在线视频色| 按摩亚洲人久久| 欧美日韩视频在线播放| 欧美国产日韩一区| 僵尸再翻生在线观看| 欧美怡红院视频一区二区三区| 欧美aaa视频| 国产精品香蕉av| 国产一区二区三区视频在线| 国产精品一区二区三区四区五区| 欧美人与动xxxxz0oz| 免费国产一区二区| 亚洲国产一区二区在线观看 | 欧美限制电影| 一区二区国产日产| 午夜精品999| 免费日韩视频在线观看| 人禽交欧美网站| 日韩精品在线播放视频| 久久精品水蜜桃av综合天堂| 亚洲一二三精品| 亚洲另类在线视频| 国产区在线观看视频| 欧美曰成人黄网| www香蕉视频| 国产亚洲精品综合一区91| 菠萝菠萝蜜在线视频免费观看| 欧美精品videosex性欧美| 91九色在线播放| 成人午夜激情免费视频| 亚洲精品国模| 在线观看日韩片| 免播放器亚洲| 99九九精品视频| www.亚洲精品| 青青青在线免费观看| 欧美视频裸体精品| 一本到在线视频| 亚洲欧美国产高清va在线播| 国产激情小视频在线| 国内成人精品一区| 精品中文字幕一区二区三区| 免费在线国产精品| 午夜电影亚洲| 天堂网成人在线| 国产日产欧美一区| 三级影片在线看| 欧美日韩国产大片| 天堂а在线中文在线无限看推荐| 欧美成人精品xxx| 向日葵视频成人app网址| 97中文在线| 日韩成人综合| 久章草在线视频| 粉嫩蜜臀av国产精品网站| 久久久久久久久毛片| 欧美视频一区二区三区| 午夜福利视频一区二区| 精品中文字幕在线| 999精品视频在线观看| 日韩av一区二区三区在线| 亚洲麻豆一区| 中文在线观看免费视频| 亚洲欧美一区二区久久 | yourporn在线观看视频| 亚州成人av在线| 国产精品高潮呻吟久久久久 | 97在线精品| 黄色手机在线视频| 久久久91精品国产一区二区精品| 五月天婷婷网站| 亚洲成人三级在线| 午夜在线激情影院| 国产精品高潮呻吟视频| 欧美一二区在线观看| 国产成人无码av在线播放dvd| 成人午夜精品在线| 久久久久国产精品夜夜夜夜夜| 91麻豆精品国产自产在线观看一区| 免费黄色在线看| 成人www视频在线观看| 99欧美视频| 精品人妻一区二区三区免费| 国产精品第一页第二页第三页| 手机av免费观看| 日韩中文字幕国产| 欧美黄页在线免费观看| 亚洲国产午夜伦理片大全在线观看网站| 久久资源在线| 久久精品视频18| 91黄色免费版| 色影院视频在线| 成人国产精品免费视频| 日韩av大片| 手机精品视频在线| 亚洲精品综合在线| 欧性猛交ⅹxxx乱大交| 午夜精品一区二区三区在线播放| 国产精品网址| 成年人网站大全| 国产精品嫩草影院com| 91久久国语露脸精品国产高跟| 久久99视频精品| 国产精品极品| www.日本xxxx| 亚洲欧美日韩一区二区| 精品人妻少妇嫩草av无码专区 | 欧美电影网址| 视频一区亚洲| 国产成人在线视频免费播放| 免费在线观看黄色av| 亚洲精品福利在线| 99riav视频一区二区| 在线精品亚洲一区二区| 国产一区二区三区四| 国产一级特黄视频| 亚洲精品永久免费| 亚洲青青一区| 青青草精品视频在线| 91麻豆6部合集magnet| 国产毛片毛片毛片毛片毛片| 久久久久久久电影一区| 波多野结衣一区|