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

HTTP協議中你必須知道的三種數據格式

開發 前端
實習中的一個主要工作就是分析 HTTP 中的協議,自己也用 Python 寫過正則表達式對 HTTP 請求和響應的內容進行匹配,然后把關鍵字段抽離出來放到一個字典中以備使用(可以稍微改造一下就是一個爬蟲工具)。HTTP 協議中的很多坑,自己都遇到過,我就針對自己遇到的幾種 HTTP 常見的數據格式,來做一個總結。

[[175875]]

實習中的一個主要工作就是分析 HTTP 中的協議,自己也用 Python 寫過正則表達式對 HTTP 請求和響應的內容進行匹配,然后把關鍵字段抽離出來放到一個字典中以備使用(可以稍微改造一下就是一個爬蟲工具)。

HTTP 協議中的很多坑,自己都遇到過,我就針對自己遇到的幾種 HTTP 常見的數據格式,來做一個總結。

Zlib 壓縮數據

對于 Zlib,一點也不陌生,我們平時用它來壓縮文件,常見類型有 zip、rar 和 7z 等。Zlib 是一種流行的文件壓縮算法,應用十分廣泛,尤其是在 Linux 平臺。當應用 Zlib 壓縮到一個純文本文件時,效果是非常明顯的,大約可以減少70%以上的文件大小,這取決于文件中的內容。

Zlib 也適用于 Web 數據傳輸,比如利用 Apache 中的 Gzip (后面會提到,一種壓縮算法) 模塊,我們可以使用 Gzip 壓縮算法來對 Apache 服務器發布的網頁內容進行壓縮后再傳輸到客戶端瀏覽器。這樣經過壓縮后實際上降低了網絡傳輸的字節數,最明顯的好處就是可以加快網頁加載的速度。

網頁加載速度加快的好處不言而喻,節省流量,改善用戶的瀏覽體驗。而這些好處并不僅僅限于靜態內容,PHP 動態頁面和其他動態生成的內容均可以通過使用 Apache 壓縮模塊壓縮,加上其他的性能調整機制和相應的服務器端 緩存規則,這可以大大提高網站的性能。因此,對于部署在 Linux 服務器上的 PHP 程序,在服務器支持的情況下,建議你開啟使用 Gzip Web 壓縮。

Gzip 壓縮兩種類型

壓縮算法不同,可以產生不同的壓縮數據(目的都是為了減小文件大小)。目前 Web 端流行的壓縮格式有兩種,分別是 Gzip 和 Defalte。

Apache 中的就是 Gzip 模塊,Deflate 是同時使用了 LZ77 算法與哈夫曼編碼(Huffman Coding)的一個無損數據壓縮算法。Deflate 壓縮與解壓的源代碼可以在自由、通用的壓縮庫 zlib 上找到。

更高壓縮率的 Deflate 是 7-zip 所實現的。AdvanceCOMP 也使用這種實現,它可以對 gzip、PNG、MNG 以及 ZIP 文件進行壓縮從而得到比 zlib 更小的文件大小。在 Ken Silverman的 KZIP 與 PNGOUT 中使用了一種更加高效同時要求更多用戶輸入的 Deflate 程序。

deflate 使用 inflateInit(),而 gzip 使用 inflateInit2() 進行初始化,比 inflateInit() 多一個參數: -MAX_WBITS,表示處理 raw deflate 數據。因為 gzip 數據中的 zlib 壓縮數據塊沒有 zlib header 的兩個字節。使用 inflateInit2 時要求 zlib 庫忽略 zlib header。在 zlib 手冊中要求 windowBits 為 8..15,但是實際上其它范圍的數據有特殊作用,如負數表示 raw deflate。

其實說這么多,總結一句話,Deflate 是一種壓縮算法,是 huffman 編碼的一種加強。 deflate 與 gzip 解壓的代碼幾乎相同,可以合成一塊代碼。

更多知識請見 維基百科 zlib

Web 服務器處理數據壓縮的過程

Web服務器接收到瀏覽器的HTTP請求后,檢查瀏覽器是否支持HTTP壓縮(Accept-Encoding 信息);

如果瀏覽器支持HTTP壓縮,Web服務器檢查請求文件的后綴名;

如果請求文件是HTML、CSS等靜態文件,Web服務器到壓縮緩沖目錄中檢查是否已經存在請求文件的***壓縮文件;

如果請求文件的壓縮文件不存在,Web服務器向瀏覽器返回未壓縮的請求文件,并在壓縮緩沖目錄中存放請求文件的壓縮文件;

如果請求文件的***壓縮文件已經存在,則直接返回請求文件的壓縮文件;

如果請求文件是動態文件,Web服務器動態壓縮內容并返回瀏覽器,壓縮內容不存放到壓縮緩存目錄中。

舉個栗子

說了這么多,下面舉一個例子,打開抓包軟件,訪問我們學校的官網( www.ecnu.edu.cn ),請求頭如下:

  1. GET /_css/tpl2/system.css HTTP/1.1 
  2. Host: www.ecnu.edu.cn 
  3. Connection: keep-alive 
  4. User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36 
  5. Accept: text/css,*/*;q=0.1 
  6. Referer: http://www.ecnu.edu.cn/ 
  7. Accept-Encoding: gzip, deflate 
  8. Accept-Language: zh-CN,zh;q=0.8 
  9. Cookie: a10-default-cookie-persist-20480-sg_bluecoat_a=AFFIHIMKFAAA  

在第七行, Accept-Encoding 顯示的是 gzip, deflate,這句話的意思是,瀏覽器告訴服務器支持 gzip 和 deflate 兩種數據格式,服務器收到這種請求之后,會進行 gzip 或 deflate 壓縮(一般都是返回 gzip 格式的數據)。

Python 的 urllib2 就可以設置這個參數:

  1. request = urllib2.Request(url) 
  2. request.add_header('Accept-encoding''gzip'
  3. //或者設置成 deflate 
  4. request.add_header('Accept-encoding''deflate'
  5. //或者兩者都設置 
  6. request.add_header('Accept-encoding''gzip, deflate' 

服務器給的響應一般如下:

  1. HTTP/1.1 200 OK 
  2. Date: Sat, 22 Oct 2016 11:41:19 GMT 
  3. Content-Type: text/javascript;charset=utf-8 
  4. Transfer-Encoding: chunked 
  5. Connectionclose 
  6. Vary: Accept-Encoding 
  7. tracecode: 24798560510951725578102219 
  8. Server: Apache 
  9. Content-Encoding: gzip 
  10.  
  11. 400a 
  12. ............ks#I. ...W...,....>..T..]..Z...Y..].MK..2..L..(略) 
  13. //響應體為壓縮數據  

從響應頭來看,Content-Encoding: gzip 這段話說明響應體的壓縮方式是 gzip 壓縮,一般有幾種情況,字段為空表示明文無壓縮,還有 Content-Encoding: gzip 和 Content-Encoding: deflate 兩種。

實際上 Gzip 網站要遠比 Deflate 多,之前寫過一個簡單爬蟲從 hao123的主頁開始爬,爬幾千個網頁(基本涵蓋所有常用的),專門分析響應體的壓縮類型,得到的結果是:

  1. Accept-Encoding 不設置參數:會返回一個無壓縮的響應體(瀏覽器比較特別,他們會自動設置 Accept-Encoding: gzip: deflate 來提高傳輸速度);
  2. Accept-Encoding: gzip,100% 的網站都會返回 gzip 壓縮,但不保證互聯網所有網站都支持 gzip(萬一沒開啟);
  3. Accept-Encoding: deflate:只有不到 10% 的網站返回一個 deflate 壓縮的響應,其他的則返回一個沒有壓縮的響應體。
  4. Accept-Encoding: gzip, deflate:返回的結果也都是 gzip 格式的數據,說明在優先級上 gzip 更受歡迎。

響應頭的 Encoding 字段很有幫助,比如我們寫個正則表達式匹配響應頭是什么壓縮:

  1. (?<=Content-Encoding: ).+(?=\r\n) 

匹配到內容為空說明沒有壓縮,為 gzip 說明響應體要經過 gzip 解壓,為 deflate 說明為 deflate 壓縮。

Python 中的 zlib 庫

在python中有zlib庫,它可以解決gzip、deflate和zlib壓縮。這三種對應的壓縮方式分別是:

  1. RFC 1950 (zlib compressed format) 
  2. RFC 1951 (deflate compressed format) 
  3. RFC 1952 (gzip compressed format)  

雖說是 Python 庫,但是底層還是 C(C++) 來實現的,這個 http-parser 也是 C 實現的源碼,Nodejs 的 http-parser 也是 C 實現的源碼,zlib 的 C 源碼在這里。C 真的好牛逼呀!

在解壓縮的過程中,需要選擇 windowBits 參數:

  1. to (de-)compress deflate format, use wbits = -zlib.MAX_WBITS 
  2. to (de-)compress zlib format, use wbits = zlib.MAX_WBITS 
  3. to (de-)compress gzip format, use wbits = zli  

例如,解壓gzip數據,就可以使用zlib.decompress(data, zlib.MAX_WBITS | 16),解壓deflate數據可以使用zlib.decompress(data,- zlib.MAX_WBITS)。

當然,對于gzip文件,也可以使用python的gzip包來解決,可以參考下面的代碼:

  1. >>> import gzip 
  2. >>> import StringIO 
  3. >>> fio = StringIO.StringIO(gzip_data) 
  4. >>> f = gzip.GzipFile(fileobj=fio) 
  5. >>> f.read() 
  6. 'test' 
  7. >>> f.close()  

也可以在解壓的時候自動加入頭檢測,把32加入頭中就可以觸發頭檢測,例如:

  1. >>> zlib.decompress(gzip_data, zlib.MAX_WBITS|32) 
  2. 'test' 
  3. >>> zlib.decompress(zlib_data, zlib.MAX_WBITS|32) 
  4. 'test'  

以上參考 stackoverflow How can I decompress a gzip stream with zlib?

剛接觸這些東西的時候,每天都會稀奇古怪的報一些錯誤,基本上 Google 一下都能解決。

分塊傳輸編碼 chunked

分塊傳輸編碼(Chunked transfer encoding)是超文本傳輸協議(HTTP)中的一種數據傳輸機制,允許 HTTP 由網頁服務器發送給客戶端應用( 通常是網頁瀏覽器)的數據可以分成多個部分。分塊傳輸編碼只在 HTTP 協議 1.1 版本(HTTP/1.1)中提供。

通常,HTTP 應答消息中發送的數據是整個發送的,Content-Length 消息頭字段表示數據的長度。數據的長度很重要,因為客戶端需要知道哪里是應答消息的結束,以及后續應答消息的開始。然而,使用分塊傳輸編碼,數據分解成一系列數據塊,并以一個或多個塊發送,這樣服務器可以發送數據而不需要預先知道發送內容的總大小。通常數據塊的大小是一致的,但也不總是這種情況。

分塊傳輸的優點

HTTP 1.1引入分塊傳輸編碼提供了以下幾點好處:

  • HTTP 分塊傳輸編碼允許服務器為動態生成的內容維持 HTTP 持久鏈接。通常,持久鏈接需要服務器在開始發送消息體前發送 Content-Length 消息頭字段,但是對于動態生成的內容來說,在內容創建完之前是不可知的。
  • 分塊傳輸編碼允許服務器在***發送消息頭字段。對于那些頭字段值在內容被生成之前無法知道的情形非常重要,例如消息的內容要使用散列進行簽名,散列的結果通過 HTTP 消息頭字段進行傳輸。沒有分塊傳輸編碼時,服務器必須緩沖內容直到完成后計算頭字段的值并在發送內容前發送這些頭字段的值。
  • HTTP 服務器有時使用壓縮 (gzip 或 deflate)以縮短傳輸花費的時間。分塊傳輸編碼可以用來分隔壓縮對象的多個部分。在這種情況下,塊不是分別壓縮的,而是整個負載進行壓縮,壓縮的輸出使用本文描述的方案進行分塊傳輸。在壓縮的情形中,分塊編碼有利于一邊進行壓縮一邊發送數據,而不是先完成壓縮過程以得知壓縮后數據的大小。

注:以上內容來自于維基百科

分塊傳輸的格式

如果一個 HTTP 消息(請求消息或應答消息)的 Transfer-Encoding 消息頭的值為 chunked,那么,消息體由數量未定的塊組成,并以***一個大小為 0 的塊為結束。每一個非空的塊都以該塊包含數據的字節數(字節數以十六進制表示)開始,跟隨一個 CRLF(回車及換行),然后是數據本身,***塊 CRLF 結束。在一些實現中,塊大小和 CRLF 之間填充有白空格(0x20)。

***一塊是單行,由塊大小(0),一些可選的填充白空格,以及 CRLF。***一塊不再包含任何數據,但是可以發送可選的尾部,包括消息頭字段。

消息***以 CRLF 結尾。例如下面就是一個 chunked 格式的響應體。

  1. HTTP/1.1 200 OK 
  2. Date: Wed, 06 Jul 2016 06:59:55 GMT 
  3. Server: Apache 
  4. Accept-Ranges: bytes 
  5. Transfer-Encoding: chunked 
  6. Content-Type: text/html 
  7. Content-Encoding: gzip 
  8. Age: 35 
  9. X-Via: 1.1 daodianxinxiazai58:88 (Cdn Cache Server V2.0), 1.1 yzdx147:1 (Cdn  
  10. Cache Server V2.0) 
  11. Connection: keep-alive 
  12.  
  13. ....k.|W.. 
  14. 166 
  15. ..OO.0...&~..;........]..(F=V.A3.X..~z...-.l8......y....).?....,....j..h .6 
  16. ....s.~.>..mZ .8/..,.)B.G.`"Dq.P].f=0..Q..d.....h......8....F..y......q.....4 
  17. {F..M.A.*..a.rAra.... .n>.D 
  18. ..o@.`^.....!@ $...p...%a\D..K.. .d{2...UnF,C[....T.....c....V...."%.`U......? 
  19. D....#..K..<.....D.e....IFK0.<...)]K.V/eK.Qz...^....t...S6...m...^..CK.XRU?m.. 
  20. .........Z..#Uik...... 
  21.  

Transfer-Encoding: chunked字段可以看出響應體是否為 chunked 壓縮,chunked 數據很有意思,采用的格式是 長度\r\n內容\r\n長度\r\n..0\r\n,而且長度還是十六進制的,***以 0\r\n 結尾(不保證都有)。因為上面的數據是 gzip 壓縮,看起來不夠直觀,下面舉個簡單的例子:

  1. 5\r\n 
  2. ababa\r\n 
  3. f\r\n 
  4. 123451234512345\r\n 
  5. 14\r\n 
  6. 12345123451234512345\r\n 
  7. 0\r\n  

上述例子 chunked 解碼后的數據 ababa12345...,另外 \r\n 是不可見的,我手動加的。

和 gzip 一樣,一樣可以寫一個正則表達式來匹配:

  1. (?<=Transfer-Encoding: ).+(?=\r\n) 

處理 chunked 數據

從前面的介紹可以知道,response-body 部分其實由 length(1) \r\n data(1) \r\n length(2) \r\n data(2)…… 循環組成,通過下面的函數進行處理,再根據壓縮類型解壓出最終的數據。

Python 處理的過程如下:

  1. unchunked = b'' 
  2. pos = 0 
  3. while pos <= len(data): 
  4.     chunkNumLen = data.find(b'\r\n', pos)-pos 
  5.     //從***個元素開始,發現***個\r\n,計算length長度 
  6.     chunkLen=int(data[pos:pos+chunkNumLen], 16) 
  7.     //把length的長度轉換成int 
  8.     if chunkLen == 0: 
  9.         break 
  10.         //如果長度為0,則說明到結尾 
  11.     chunk = data[pos+chunkNumLen+len('\r\n'):pos+chunkNumLen+len('\r\n')+chunkLen] 
  12.     unchunked += chunk 
  13.     //將壓縮數據拼接 
  14.     pos += chunkNumLen+len('\r\n')+chunkLen+len('\r\n'
  15.     //同時pos位置向后移動 
  16.  
  17. return unchunked 
  18. //此時處理后unchunked就是普通的壓縮數據,可以用zlib解壓函數進行解壓  

實際中,我們會同時遇到既時 chunked 又是壓縮數據的響應,這個時候處理的思路應該是:先處理 chunked,在處理壓縮數據,順序不能反。

MultiPart 數據

MultiPart 的本質就是 Post 請求,MultiPart出現在請求中,用來對一些文件(圖片或文檔)進行處理,在請求頭中出現 Content-Type: multipart/form-data; boundary=::287032381131322 則表示為 MultiPart 格式數據包,下面這個是 multipart 數據包格式:

  1. POST /cgi-bin/qtest HTTP/1.1 
  2. Host: aram 
  3. User-Agent: Mozilla/5.0 Gecko/2009042316 Firefox/3.0.10 
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
  5. Accept-Language: en-us,en;q=0.5 
  6. Accept-Encoding: gzip,deflate 
  7. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
  8. Keep-Alive: 300 
  9. Connection: keep-alive 
  10. Referer: http://aram/~martind/banner.htm 
  11. Content-Type: multipart/form-data; boundary=::287032381131322 
  12. Content-Length: 514 
  13.  
  14. --::287032381131322 
  15. Content-Disposition: form-data; name="datafile1"; filename="r.gif" 
  16. Content-Type: image/gif 
  17.  
  18. GIF87a.............,...........D..; 
  19. --::287032381131322 
  20. Content-Disposition: form-data; name="datafile2"; filename="g.gif" 
  21. Content-Type: image/gif 
  22.  
  23. GIF87a.............,...........D..; 
  24. --::287032381131322 
  25. Content-Disposition: form-data; name="datafile3"; filename="b.gif" 
  26. Content-Type: image/gif 
  27.  
  28. GIF87a.............,...........D..; 
  29. --::287032381131322—  

http 協議本身的原始方法不支持 multipart/form-data 請求,那這個請求自然就是由這些原始的方法演變而來的,具體如何演變且看下文:

  1. multipart/form-data 的基礎方法是 post,也就是說是由 post 方法來組合實現的
  2. multipart/form-data 與 post 方法的不同之處:請求頭,請求體。
  3. multipart/form-data 的請求頭必須包含一個特殊的頭信息:Content-Type,且其值也必須規定為 multipart/form-data,同時還需要規定一個內容分割符用于分割請求體中的多個 post 內容,如文件內容和文本內容自然需要分割,不然接收方就無法正常解析和還原這個文件。具體的頭信息如:Content-Type: multipart/form-data; boundary=${bound},${bound} 代表分割符,可以任意規定,但為了避免和正常文本重復,盡量使用復雜一點的內容,如::287032381131322
  4. multipart/form-data 的請求體也是一個字符串,不過和 post 的請求體不同的是它的構造方式,post 是簡單的 name=value 值連接,而 multipart/form-data 則是添加了分隔符等內容的構造體。

維基百科上關于 multipart 的介紹。

multipart 的數據格式有一定的特點,首先是頭部規定了一個 ${bound},上面那個例子中的 ${bound} 為 ::287032381131322,由多個內容相同的塊組成,每個塊的格式以--加 ${bound} 開始的,然后是該部分內容的描述信息,然后一個\r\n,然后是描述信息的具體內容。如果傳送的內容是一個文件的話,那么還會包含文件名信息,以及文件內容的類型。

小結,要發送一個 multipart/form-data 的請求,需要定義一個自己的 ${bound} ,按照格式來發請求就好,對于 multipart 的數據格式并沒有過多介紹,感覺和 chunked 很類似,不難理解。

總結

本文介紹的三種數據格式,都比較基礎,一些框架自動把它們處理,比如爬蟲。還有圖像上傳,對于 multipart/data 格式的請求頭,了解一些概念性的東西也非常有意思。共勉。

參考全列在文章中了

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2021-11-08 09:33:07

JS 字符串數據類型

2020-04-02 15:37:58

數據結構存儲

2024-03-29 13:17:03

Docker數據卷Volume

2019-01-08 10:29:12

BeautifulSoPython第三庫

2020-12-28 10:35:38

前端數據技術

2017-12-07 15:28:36

2012-09-29 10:29:56

.Net內存分配繼承

2012-09-29 09:22:24

.NETGC內存分配

2019-11-12 14:18:56

PythonWord設計

2020-02-28 14:05:00

Linuxshell命令

2017-12-07 15:47:25

2024-11-26 07:47:41

2023-09-19 08:01:33

數據格式化程序

2021-10-29 08:44:22

推拉機制面試broker

2015-10-27 10:22:47

Html5API調用

2021-03-01 07:34:42

Java泛型ArrayList

2015-07-23 10:37:13

Linux命令

2011-11-30 09:09:13

王濤Windows Pho移動開發

2015-06-29 09:40:10

Rails新特性

2017-10-11 15:50:18

光纖通信傳輸
點贊
收藏

51CTO技術棧公眾號

亚洲色图都市激情| 51国偷自产一区二区三区的来源| 欧美熟妇精品黑人巨大一二三区| av影视在线| 久久色在线视频| 国产精品吹潮在线观看| 国产少妇在线观看| 美国一区二区| 欧美日韩三级一区二区| 妺妺窝人体色www看人体| 头脑特工队2免费完整版在线观看| 可以免费看不卡的av网站| 色婷婷久久av| yy6080午夜| 国产福利一区二区三区在线播放| 亚洲精品乱码久久久久| 欧美日韩在线观看一区| 伊人免费在线观看高清版| 国语精品一区| 在线日韩中文字幕| 又黄又爽的网站| 国产成+人+综合+亚洲欧美| 亚洲午夜精品一区二区三区他趣| 视频一区二区综合| 外国精品视频在线观看| 国产激情一区二区三区| 国产精品久久久久久久久久东京| 一区二区三区免费高清视频| 不卡中文字幕| 国产视频精品免费播放| 91丨porny丨九色| 日韩欧美一区二区三区在线观看| 亚洲永久精品大片| 亚洲国产成人不卡| 日韩大片b站免费观看直播| 久久99久久精品欧美| 欧美又大粗又爽又黄大片视频| 国产一区二区精彩视频| 欧美军人男男激情gay| 亚洲国产精品va在线| 三日本三级少妇三级99| 国产a亚洲精品| 91九色最新地址| av之家在线观看| 手机电影在线观看| 一区在线观看免费| 亚洲欧美99| 国产视频福利在线| 久久欧美中文字幕| 蜜桃久久精品乱码一区二区| 韩国av免费在线| 国产高清在线观看免费不卡| 成人激情视频网| 在线观看免费中文字幕| 日韩中文字幕av电影| 亲子乱一区二区三区电影| 日本一区二区免费在线观看| 亚洲一级高清| 久久久久久91| 日韩欧美亚洲国产| 国产欧美一级| 2019亚洲男人天堂| 五月婷婷亚洲综合| 乱人伦精品视频在线观看| 日本欧美在线视频| 欧美一区二区三区不卡视频| 久久激情婷婷| 国产精品久久久久国产a级| 精品人妻一区二区三区潮喷在线 | av今日在线| 亚洲成在人线在线播放| 你懂的av在线| 345成人影院| 91成人免费电影| 99热手机在线| 四虎影视国产精品| 日韩一本二本av| 不许穿内裤随时挨c调教h苏绵| 国产精品毛片久久久| 亚洲精品国产综合区久久久久久久| 天天躁日日躁狠狠躁av麻豆男男| 色综合www| 伊人一区二区三区久久精品 | 亚洲av无码国产精品久久不卡| 国产精品中文字幕欧美| 国产伦精品一区二区三区在线| 亚洲日本在线播放| 日本一区二区视频在线观看| 亚洲国产精品一区二区第一页| 一广人看www在线观看免费视频| ㊣最新国产の精品bt伙计久久| av动漫在线免费观看| av成人 com a| 欧美日韩在线免费视频| 日韩精品国产一区| av亚洲在线观看| 欧美成人一二三| 97久久久久久久| 久久成人免费日本黄色| 国产精品综合久久久久久| 黄色av网址在线免费观看| 综合久久久久久| 国自产拍偷拍精品啪啪一区二区| 黄色欧美视频| 亚洲成人激情在线| 懂色av蜜桃av| 极品av少妇一区二区| 国产成人在线一区| 丁香花免费高清完整在线播放| 久久久久国产免费免费 | 欧美xxxxx少妇| 精品国产乱码久久久久久果冻传媒| 久久精品99久久香蕉国产色戒| 亚洲欧美在线观看视频| 寂寞少妇一区二区三区| 欧美黑人xxxxx| 影音先锋在线视频| 欧美性一二三区| 中文字幕无码人妻少妇免费| 天天久久综合| 国产成人精品久久二区二区| 亚洲精品久久久狠狠狠爱 | av福利导福航大全在线| 欧美日韩精品一区二区三区蜜桃| 中文字幕一区二区人妻电影丶| 婷婷综合在线| 国产成人欧美在线观看| 五月婷婷开心中文字幕| 亚洲精选一二三| 亚州精品一二三区| 亚洲精品国模| 性欧美xxxx交| 一级久久久久久久| 国产欧美精品国产国产专区 | 欧美一卡二卡在线观看| av永久免费观看| 免费日韩视频| 好吊色欧美一区二区三区| 直接在线观看的三级网址| 欧美日韩一区二区欧美激情| 色噜噜日韩精品欧美一区二区| 99精品视频免费观看视频| 亚洲最大福利视频网| 黄色在线免费| 欧美日韩高清一区二区不卡| 男人的天堂官网| 日本中文字幕不卡| 欧美一区二区在线视频观看| 欧美男男tv网站在线播放| 精品国产乱码久久久久久图片 | 少妇一区二区三区四区| 亚洲一区二区三区影院| 久久久无码人妻精品无码| 欧美激情综合色综合啪啪| 97av影视网在线观看| 97超碰资源站在线观看| 日韩欧美黄色影院| 麻豆影视在线播放| 成人毛片视频在线观看| www插插插无码视频网站| 综合中文字幕| 性欧美长视频免费观看不卡| 人人妻人人玩人人澡人人爽| 精品二区三区线观看| 性色av蜜臀av色欲av| 亚洲女同同性videoxma| 欧洲一区二区日韩在线视频观看免费 | 国产剧情在线视频| 国产亚洲午夜高清国产拍精品| av动漫免费看| 日韩电影免费网址| 91精品啪在线观看麻豆免费| 性国产高清在线观看| 亚洲成人在线网| 亚洲欧美综合另类| 亚洲国产精品精华液2区45| 自拍偷拍21p| 91精品一区二区三区综合在线爱| 91久久国产自产拍夜夜嗨| 999精品网| 亚洲欧美日韩综合| 中文字幕 自拍偷拍| 亚洲婷婷在线视频| 亚洲天堂美女视频| 老司机精品导航| 99精品视频网站| caoporn成人免费视频在线| 4k岛国日韩精品**专区| 成人在线二区| 日韩精品一区二区三区在线| 一级片中文字幕| 国产精品久久久久久久久晋中| 永久看看免费大片| 天堂在线亚洲视频| 免费国产成人看片在线| 欧美激情极品| 成人亚洲激情网| 精精国产xxxx视频在线播放| 色婷婷久久一区二区| 免费观看国产精品| 欧美色成人综合| 日韩欧美亚洲视频| 中文字幕一区二区在线播放| 色天使在线视频| 国产中文一区二区三区| 亚洲午夜无码av毛片久久| 亚洲国产老妈| 日韩欧美视频一区二区三区四区 | 蜜桃91精品入口| 四虎在线精品| 日本中文字幕久久看| 影音先锋在线播放| 色偷偷91综合久久噜噜| 亚洲 另类 春色 国产| 这里只有精品电影| 波多野结衣不卡| 性做久久久久久久久| 999福利视频| www国产成人| 亚洲色图欧美日韩| 国产一区二区网址| 日韩一区二区三区不卡视频| 亚洲一区激情| 无码 制服 丝袜 国产 另类| 99久久婷婷这里只有精品| 欧美大陆一区二区| 红杏视频成人| 999视频在线观看| 日韩一区二区三免费高清在线观看| 日本久久久久久久| 国产精品25p| 久久久久久九九九| 羞羞视频在线免费国产| 俺去啦;欧美日韩| √新版天堂资源在线资源| 国产视频久久久久| 熟妇高潮一区二区高潮| 欧美成人艳星乳罩| 国产乱淫a∨片免费视频| 欧美日韩高清影院| 中文字幕在线观看你懂的| 色噜噜狠狠色综合中国| 日本一区二区不卡在线| 亚洲第一主播视频| 国产在线精品观看| 美女视频黄a大片欧美| 日韩网站免费观看| 欧美自拍第一页| 精品国产一二三| 亚洲精品成av人片天堂无码| 日韩久久免费av| 超碰人人人人人人| 精品国产一区二区在线观看| 自拍偷拍第9页| 69精品久久久| 成人爱爱电影网址| 亚洲911精品成人18网站| 麻豆国产精品视频| 人九九综合九九宗合| 久久大胆人体| 91精品成人久久| 毛片网站在线看| 午夜精品一区二区三区在线| av免费不卡国产观看| 91精品国产91久久| 免费高潮视频95在线观看网站| 7777精品久久久久久| 在线能看的av网址| 国产91亚洲精品| 成人午夜一级| 国产大片精品免费永久看nba| 人人鲁人人莫人人爱精品| 国产精品观看在线亚洲人成网| 香蕉久久免费电影| 国产精品午夜一区二区欲梦| 国产精成人品2018| 成人情趣片在线观看免费| 日韩欧美中文在线观看| 国产伦精品一区二区三区四区视频| 欧美日韩一区二区三区不卡视频| 国产在线播放一区二区| 亚洲欧洲美洲国产香蕉| 日韩久久久久久久| 亚洲成人最新网站| 亚洲小视频在线播放| 99视频+国产日韩欧美| 91热这里只有精品| 国产精品1024久久| 精品伦一区二区三区| 91蜜桃婷婷狠狠久久综合9色| 成人在线手机视频| 亚洲精品国产第一综合99久久| 日本一区二区三区四区五区| 亚洲成av人综合在线观看| 精品人妻无码一区二区性色| 在线观看91av| 天堂中文字幕在线| x99av成人免费| fc2ppv国产精品久久| **欧美日韩vr在线| 国内精品视频| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 97香蕉超级碰碰久久免费软件| 日本精品网站| 国产精品欧美久久| 91综合网人人| 六月丁香婷婷激情| 国产一区二区三区久久久| 亚洲永久精品ww.7491进入| 亚洲男人都懂的| 伊人久久久久久久久久久久| 精品乱人伦一区二区三区| 国产毛片在线看| 久久久久久成人精品| 四虎影视成人精品国库在线观看| 久久久久久99| 欧美日韩99| 亚洲精品自拍网| 99精品视频一区| 欧美国产日韩在线观看成人 | 国产精品无码乱伦| 亚洲综合二区| 风韵丰满熟妇啪啪区老熟熟女| 欧美国产精品久久| 五月天综合激情| 日韩亚洲欧美高清| 日本视频在线免费观看| 国语自产精品视频在线看一大j8| 电影中文字幕一区二区| 日韩少妇中文字幕| 久久人人精品| 欧美做受喷浆在线观看| 亚洲国产va精品久久久不卡综合 | 国产一区二区91| 天天操天天舔天天射| 色哟哟日韩精品| 同心难改在线观看| 8090成年在线看片午夜| 亚洲成人五区| 中文字幕日韩精品无码内射| 精品制服美女久久| www.com.av| 欧美日韩免费观看一区三区| av在线播放av| 国产精品免费电影| 精品国产乱码久久久| 密臀av一区二区三区| 日本一区二区视频在线观看| 中文字幕在线欧美| 亚洲性线免费观看视频成熟| 日韩福利一区| 涩涩日韩在线| 琪琪一区二区三区| 中文乱码字幕高清一区二区| 欧美日韩国产精品自在自线| 欧美一区二区三区| 成人黄色在线播放| 欧美日韩国产免费观看| 视频区 图片区 小说区| 一区二区三区精密机械公司| 国产情侣自拍小视频| 欧美日本精品在线| 黄色免费大全亚洲| 成年人在线看片| 亚洲国产精品精华液ab| 国产又粗又猛视频| 久久99热精品| 欧美精品国产白浆久久久久| 日批视频在线免费看| 久久久99久久| 一区二区日韩视频| 欧美高清视频在线| 日本三级久久| 国产九九在线视频| 亚洲精品成人精品456| 天天干天天摸天天操| 国产精品99一区| 国产大片一区| 扒开伸进免费视频| 日本韩国精品在线| 黄在线免费观看| 狠狠色噜噜狠狠狠狠色吗综合| 久久精品1区| 好吊日在线视频| 日韩电影免费观看在线观看| 视频精品导航| 97视频在线免费| 欧美激情一区二区三区蜜桃视频| 精品久久人妻av中文字幕| 2019中文字幕全在线观看| 人人狠狠综合久久亚洲婷| 国产精品无码自拍| 欧美性猛交一区二区三区精品| 最爽无遮挡行房视频在线| 久久精品aaaaaa毛片| 国产一区二区三区av电影| 国产成人精品片| 久久夜色精品国产亚洲aⅴ| 欧美影院天天5g天天爽| 中文字幕12页|