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

Websocket庫Ws原理分析

開發(fā) 前端
我們看到ws監(jiān)聽了upgrade事件,當(dāng)有websocket請求到來時就會執(zhí)行handleUpgrade處理升級請求,升級成功后觸發(fā)connection事件。我們先看handleUpgrade。handleUpgrade邏輯不多,主要是處理和校驗升級請求的一些http頭。

 [[394780]]

前言:本文幾基于nodejs的ws模塊分析websocket的原理。

ws服務(wù)器邏輯由websocket-server.js的WebSocketServer類實現(xiàn)。該類初始化了一些參數(shù)后就執(zhí)行以下代碼

  1. if (this._server) { 
  2.       // 給server注冊下面事件,返回一個注銷函數(shù)(用于注銷下面注冊的事件) 
  3.       this._removeListeners = addListeners(this._server, { 
  4.         // listen成功的回調(diào) 
  5.         listening: this.emit.bind(this, 'listening'), 
  6.         error: this.emit.bind(this, 'error'), 
  7.         // 收到協(xié)議升級請求的回調(diào) 
  8.         upgrade: (req, socket, head) => { 
  9.           this.handleUpgrade(req, socket, head, (ws) => { 
  10.             // 處理成功,觸發(fā)鏈接成功事件 
  11.             this.emit('connection', ws, req); 
  12.           }); 
  13.         } 
  14.       }); 

我們看到ws監(jiān)聽了upgrade事件,當(dāng)有websocket請求到來時就會執(zhí)行handleUpgrade處理升級請求,升級成功后觸發(fā)connection事件。我們先看handleUpgrade。handleUpgrade邏輯不多,主要是處理和校驗升級請求的一些http頭。ws提供了一個校驗的鉤子。處理完http頭后,會調(diào)verifyClient校驗是否允許升級請求。如果成功則執(zhí)行completeUpgrade。顧名思義,completeUpgrade是完成升級請求的函數(shù),該函數(shù)返回同意協(xié)議升級并且設(shè)置一些http響應(yīng)頭。另外還有一些重要的邏輯處理。

  1. const ws = new WebSocket(null); 
  2. // 設(shè)置管理socket的數(shù)據(jù) 
  3. ws.setSocket(socket, head, this.options.maxPayload); 
  4. // cb就是this.emit('connection', ws, req); 
  5. cb(ws); 

我們看到這里新建了一個WebSocket對象并且調(diào)用了他的setSocket函數(shù)。我們來看看他做了什么。setSocket的邏輯非常多,我們慢慢分析。

數(shù)據(jù)接收者

  1. class Receiver extends Writable {} 

我們看到數(shù)據(jù)接收者是一個可寫流。這就意味著我們可以往里面寫數(shù)據(jù)。

  1. const receiver = new Receiver(); 
  2. receiver.write('hello'); 

我們看一下這時候Receiver的邏輯。

  1. _write(chunk, encoding, cb) { 
  2.     if (this._opcode === 0x08 && this._state == GET_INFO) return cb(); 
  3.     this._bufferedBytes += chunk.length; 
  4.     this._buffers.push(chunk); 
  5.     this.startLoop(cb); 
  6.   } 

首先記錄當(dāng)前數(shù)據(jù)的大小,然后把數(shù)據(jù)存起來,最后執(zhí)行startLoop。

  1. startLoop(cb) { 
  2.     let err; 
  3.     this._loop = true
  4.  
  5.     do { 
  6.       switch (this._state) { 
  7.         // 忽略其他case 
  8.         case GET_DATA: 
  9.           err = this.getData(cb); 
  10.           break; 
  11.         default
  12.           // `INFLATING` 
  13.           this._loop = false
  14.           return
  15.       } 
  16.     } while (this._loop); 
  17.  
  18.     cb(err); 
  19.   } 

我們知道websocket是基于tcp上層的應(yīng)用層協(xié)議,所以我們收到數(shù)據(jù)時,需要解析出一個個數(shù)據(jù)包(粘包問題),所以Receiver其實就是一個狀態(tài)機(jī),每次收到數(shù)據(jù)的時候,都會根據(jù)當(dāng)前的狀態(tài)進(jìn)行狀態(tài)流轉(zhuǎn)。比如當(dāng)前處于GET_DATA狀態(tài),那么就會進(jìn)行數(shù)據(jù)的處理。我們接著看一下數(shù)據(jù)處理的邏輯。

  1. getData(cb) { 
  2.     let data = EMPTY_BUFFER; 
  3.     // 提取數(shù)據(jù)部分 
  4.     if (this._payloadLength) { 
  5.       data = this.consume(this._payloadLength); 
  6.       if (this._masked) unmask(data, this._mask); 
  7.     } 
  8.     // 是控制報文則執(zhí)行controlMessage 
  9.     if (this._opcode > 0x07) return this.controlMessage(data); 
  10.     // 做了壓縮,則先解壓 
  11.     if (this._compressed) { 
  12.       this._state = INFLATING; 
  13.       this.decompress(data, cb); 
  14.       return
  15.     } 
  16.     // 沒有壓縮則直接處理(先存到_fragments,然后執(zhí)行dataMessage) 
  17.     if (data.length) { 
  18.       this._messageLength = this._totalPayloadLength; 
  19.       this._fragments.push(data); 
  20.     } 
  21.  
  22.     return this.dataMessage(); 
  23.   } 

我們執(zhí)行websocket協(xié)議定義了報文的類型,比如控制報文,數(shù)據(jù)報文。我們分別看一下這兩個的邏輯。

  1. controlMessage(data) { 
  2.     // 連接關(guān)閉 
  3.     if (this._opcode === 0x08) { 
  4.       this._loop = false
  5.       if (data.length === 0) { 
  6.         this.emit('conclude', 1005, ''); 
  7.         this.end(); 
  8.       } 
  9.     } else if (this._opcode === 0x09) { 
  10.       this.emit('ping', data); 
  11.     } else { 
  12.       this.emit('pong', data); 
  13.     } 
  14.     this._state = GET_INFO; 
  15.   } 

我們看到控制報文包括三種(conclude、ping、pong)。而數(shù)據(jù)報文只有this.emit('message', data);一種。這個就是接收者的整體邏輯。

2 數(shù)據(jù)發(fā)送者

數(shù)據(jù)發(fā)送者是對websocket協(xié)議的封裝,當(dāng)用戶調(diào)研數(shù)據(jù)發(fā)送者的send接口發(fā)送數(shù)據(jù)時,數(shù)據(jù)發(fā)送者會組裝成一個websocket協(xié)議的包再發(fā)送出去。

  1. send(data, options, cb) { 
  2.     const buf = toBuffer(data); 
  3.     const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName]; 
  4.     let opcode = options.binary ? 2 : 1; 
  5.     let rsv1 = options.compress; 
  6.  
  7.     if (this._firstFragment) { 
  8.       this._firstFragment = false
  9.       if (rsv1 && perMessageDeflate) { 
  10.         rsv1 = buf.length >= perMessageDeflate._threshold; 
  11.       } 
  12.       this._compress = rsv1; 
  13.     } else { 
  14.       rsv1 = false
  15.       opcode = 0; 
  16.     } 
  17.  
  18.     if (options.fin) this._firstFragment = true
  19.     // 需要壓縮 
  20.     if (perMessageDeflate) { 
  21.       const opts = { 
  22.         fin: options.fin, 
  23.         rsv1, 
  24.         opcode, 
  25.         mask: options.mask, 
  26.         readOnly: toBuffer.readOnly 
  27.       }; 
  28.       // 正在壓縮,則排隊等待,否則執(zhí)行壓縮 
  29.       if (this._deflating) { 
  30.         this.enqueue([this.dispatch, buf, this._compress, opts, cb]); 
  31.       } else { 
  32.         this.dispatch(buf, this._compress, opts, cb); 
  33.       } 
  34.     } else { 
  35.       // 不需要壓縮,直接發(fā)送 
  36.       this.sendFrame( 
  37.         Sender.frame(buf, { 
  38.           fin: options.fin, 
  39.           rsv1: false
  40.           opcode, 
  41.           mask: options.mask, 
  42.           readOnly: toBuffer.readOnly 
  43.         }), 
  44.         cb 
  45.       ); 
  46.     } 
  47.   } 

send函數(shù)做了一些參數(shù)的處理后發(fā)送數(shù)據(jù),但是如果需要壓縮的話,要壓縮后才能發(fā)送。數(shù)據(jù)處理完成后調(diào)用真正的發(fā)送函數(shù)

  1. sendFrame(list, cb) { 
  2.     if (list.length === 2) { 
  3.       this._socket.cork(); 
  4.       this._socket.write(list[0]); 
  5.       this._socket.write(list[1], cb); 
  6.       this._socket.uncork(); 
  7.     } else { 
  8.       this._socket.write(list[0], cb); 
  9.     } 
  10.   } 

了解了數(shù)據(jù)接收者和發(fā)送者的邏輯后,我們看一下websocket對象和setSocket函數(shù)做了什么事情,websocket對象本質(zhì)是對TCP socket的封裝。它接收來自底層的數(shù)據(jù),然后透傳給數(shù)據(jù)接收者,數(shù)據(jù)接收者處理完后,觸發(fā)websocket對應(yīng)的對應(yīng)的事件,比如message事件。發(fā)送數(shù)據(jù)的時候,websocket會調(diào)用數(shù)據(jù)發(fā)送者的接口,數(shù)據(jù)發(fā)送者組裝成websocket協(xié)議的數(shù)據(jù)包后再發(fā)送出去,架構(gòu)如下圖所示。

接下來我們看看setSocket的邏輯

  1. setSocket(socket, head, maxPayload) { 
  2.     // 數(shù)據(jù)接收者,負(fù)責(zé)處理tcp上收到的數(shù)據(jù)(socket是tcp層的socket) 
  3.     const receiver = new Receiver(...); 
  4.     // 數(shù)據(jù)發(fā)送者,負(fù)責(zé)發(fā)送數(shù)據(jù)給對端 
  5.     this._sender = new Sender(socket, this._extensions); 
  6.     // 數(shù)據(jù)接收者,負(fù)責(zé)解析數(shù)據(jù) 
  7.     this._receiver = receiver; 
  8.     // net模塊的tcp socket 
  9.     this._socket = socket; 
  10.     // 關(guān)聯(lián)起來 
  11.     receiver[kWebSocket] = this; 
  12.     socket[kWebSocket] = this; 
  13.     // 監(jiān)聽接收者的事件,解析數(shù)據(jù)的時候會回調(diào) 
  14.     receiver.on('conclude', receiverOnConclude); 
  15.     // 下面兩個事件由Writable觸發(fā) 
  16.     receiver.on('drain', receiverOnDrain); 
  17.     receiver.on('error', receiverOnError); 
  18.     receiver.on('message', receiverOnMessage); 
  19.     receiver.on('ping', receiverOnPing); 
  20.     receiver.on('pong', receiverOnPong); 
  21.     // 清除定時器 
  22.     socket.setTimeout(0); 
  23.     // 關(guān)閉nagle算法 
  24.     socket.setNoDelay(); 
  25.     // 升級請求中,攜帶的http body,通常是空 
  26.     if (head.length > 0) socket.unshift(head); 
  27.     // 監(jiān)聽tcp底層的事件 
  28.     socket.on('close', socketOnClose); 
  29.     socket.on('data', socketOnData); 
  30.     socket.on('end', socketOnEnd); 
  31.     socket.on('error', socketOnError); 
  32.  
  33.     this.readyState = WebSocket.OPEN
  34.     this.emit('open'); 
  35.   } 

我們看到里面監(jiān)聽了各種事件,下面以data事件為例,看一下處理過程。當(dāng)tcp socket收到數(shù)據(jù)的時候會執(zhí)行socketOnData函數(shù)。

  1. function socketOnData(chunk) { 
  2.   // 會調(diào)用receiver里的_write函數(shù),其實就是換成到receiver對象上,如果數(shù)據(jù)解析出錯,會觸發(fā)socket error事件 
  3.   if (!this[kWebSocket]._receiver.write(chunk)) { 
  4.     this.pause(); 
  5.   } 

socketOnData通過接收者的接口把數(shù)據(jù)傳給接收者,接收者會解析數(shù)據(jù),然后觸發(fā)對應(yīng)的事件,比如message。

  1. receiver.on('message', receiverOnMessage); 
  2. function receiverOnMessage(data) { 
  3.   this[kWebSocket].emit('message', data); 

然后ws的socket對象繼續(xù)往上層觸發(fā)message事件。this[kWebSocket]的值是ws提供的socket對象本身。架構(gòu)圖如下。

這就是ws實現(xiàn)websocket協(xié)議的基本原理,具體細(xì)節(jié)可以參考源碼。

責(zé)任編輯:武曉燕 來源: 編程雜技
相關(guān)推薦

2017-07-11 13:58:10

WebSocket

2021-04-21 07:52:39

核心SignalR應(yīng)用

2023-01-26 01:41:27

核心全局過濾器

2010-04-14 14:23:26

2024-01-11 08:53:58

2023-06-27 07:09:39

2017-08-17 17:48:06

2009-06-14 17:19:09

ibmdwWebSphere

2012-09-18 14:23:54

2023-11-28 08:49:01

短輪詢WebSocket長輪詢

2021-04-27 18:12:22

WebSocket持久化連接HTTP

2021-10-12 17:19:17

Random局限性變量

2022-04-13 08:23:31

Golang并發(fā)

2020-10-13 07:35:22

JUC - Count

2023-04-26 08:39:41

Bitmap元素存儲

2012-09-29 13:18:23

分布式數(shù)據(jù)庫Google Span

2010-04-19 15:29:31

2012-12-03 16:57:37

HDFS

2023-12-04 07:31:41

Golangwebsocket

2022-02-22 11:39:13

WebSocketsNode.js開發(fā)
點贊
收藏

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

午夜精品久久久久久久蜜桃| www.超碰97.com| 人妻精品一区一区三区蜜桃91| 狠狠干成人综合网| 精品伊人久久97| 网站一区二区三区| 日韩少妇视频| 久久网站最新地址| 成人美女av在线直播| 久久精品视频8| 奇米狠狠一区二区三区| 欧美日本一道本在线视频| 国产爆乳无码一区二区麻豆| 欧美欧美欧美| 国产米奇在线777精品观看| 午夜精品在线视频| 任我爽在线视频| 久久电影在线| 欧美精品免费视频| 北条麻妃在线一区| 日皮视频在线观看| 国产精品久久看| 久久国产主播精品| 国产片高清在线观看| 久久国产福利| 久久久久国色av免费观看性色| 国产免费一区二区三区网站免费| 欧美午夜在线播放| 欧美午夜视频网站| 免费看又黄又无码的网站| 麻豆传媒在线观看| 国产亚洲欧美日韩俺去了| 99理论电影网| 91禁在线观看| 日日夜夜精品视频免费| 97国产在线观看| 美女的奶胸大爽爽大片| 日本电影一区二区| 亚洲欧美另类国产| 欧亚乱熟女一区二区在线| 久久免费福利| 欧美精品在线一区二区| 欧美日韩亚洲自拍| 三级成人黄色影院| 欧美视频中文在线看| 久久这里只有精品18| 成人毛片av在线| 中文字幕在线播放不卡一区| 亚洲v欧美v另类v综合v日韩v| 性xxxfllreexxx少妇| 成人网页在线观看| 国产精品美女诱惑| 免费观看国产视频| 丁香五精品蜜臀久久久久99网站| 91视频免费进入| 国产夫妻在线观看| 国产sm精品调教视频网站| 亚洲一区二区三| 国产日韩一级片| 国产麻豆9l精品三级站| 97国产超碰| 性做久久久久久久久久| 国产激情一区二区三区四区| 91香蕉亚洲精品| 国产av无码专区亚洲av麻豆| 国产精品一区二区三区网站| 91免费看网站| 日本黄视频在线观看| 不卡一卡二卡三乱码免费网站| 国产高清精品一区二区三区| 国产香蕉在线观看| eeuss影院一区二区三区| 久久久久久久有限公司| 九色视频在线播放| 国产精品女同一区二区三区| 中文字幕日韩一区二区三区| a天堂中文在线官网在线| 一区二区三区四区国产精品| 日本福利视频一区| 自拍网站在线观看| 欧美午夜不卡在线观看免费| 亚洲激情在线看| 国产精品网在线观看| 亚洲欧美日韩天堂一区二区| 亚洲精品国产精品国自产网站| 久久免费精品视频在这里| 欧美精品在线免费播放| 国产午夜小视频| 日韩一区精品字幕| 97视频中文字幕| 午夜影院免费体验区| 国产欧美一区二区在线| 91精品国产吴梦梦| 麻豆mv在线看| 欧美无人高清视频在线观看| 亚洲一区二区三区三州| 亚洲激情77| 久久久久www| 一级免费在线观看| 久久精品国产99| 国产欧美日韩伦理| 色影院视频在线| 午夜一区二区三区在线观看| 欧美精品aaaa| 香蕉成人app| 国产一区二区三区视频在线观看| 欧美国产日韩综合| 男人的天堂亚洲一区| 国产精品美女久久久久av福利| a√资源在线| 亚洲成人av一区二区三区| 9l视频白拍9色9l视频| 6080亚洲理论片在线观看| 国产亚洲一区二区在线| 国产在线观看成人| 久久国产精品免费| 欧美精品欧美精品系列c| 亚洲男同gay网站| 欧洲一区在线观看| 少妇精品一区二区| 国产精品hd| 成人av番号网| 精品无吗乱吗av国产爱色| 一级女性全黄久久生活片免费| 国产视频在线视频| 老牛精品亚洲成av人片| 欧美成人剧情片在线观看| 无码人妻久久一区二区三区不卡| 国产91精品精华液一区二区三区 | 成+人+亚洲+综合天堂| 一区二区视频在线播放| 国精产品一区二区三区有限公司| 亚洲国产天堂网精品网站| 国产a免费视频| 久久超级碰视频| 色狠狠久久av五月综合| 英国三级经典在线观看| 亚洲第一精品久久忘忧草社区| 多男操一女视频| 日本va欧美va瓶| 欧美极品一区二区| 欧美激情网站| 亚洲精品短视频| 久久高清免费视频| 北条麻妃一区二区三区| 日韩一区二区高清视频| 欧美成人精品午夜一区二区| 精品国产一区二区三区久久狼黑人| 69xxxx国产| 久久久国际精品| 色综合av综合无码综合网站| 欧美深夜视频| 6080yy精品一区二区三区| 亚洲精品国产一区二| 亚洲综合在线第一页| 国产免费无码一区二区| 黑人一区二区| 国产亚洲欧美一区二区三区| √8天堂资源地址中文在线| 亚洲黄色成人网| 国偷自拍第113页| av在线综合网| 日本精品一区二区三区四区| 曰本一区二区三区视频| 日本高清视频精品| 粉嫩一区二区三区国产精品| 欧美色国产精品| 日韩欧美国产成人精品免费| 国产一区二区三区四| 日韩精品第1页| 97久久超碰| 国产91精品黑色丝袜高跟鞋| 国产小视频在线| 欧美日韩精品一区二区三区四区| 久草福利资源在线| 国产盗摄女厕一区二区三区| 我的公把我弄高潮了视频| 同性恋视频一区| 国产精品视频一区国模私拍| 日本黄色片在线观看| 日韩欧美国产一区二区在线播放| 欧美亚韩一区二区三区| 久久久久九九视频| 午夜视频在线网站| 在线欧美不卡| 色999五月色| 视频在线观看免费影院欧美meiju| 国色天香2019中文字幕在线观看| 视频午夜在线| 欧美日韩高清在线| 日本三级网站在线观看| 国产亚洲精品中文字幕| 天堂av手机在线| 99综合在线| 久久免费视频2| 久久影院资源站| 日韩美女在线看| av色综合久久天堂av色综合在| 亚洲成人网久久久| 在线观看亚洲国产| 精品国产乱码久久久久久虫虫漫画 | 国产精品蜜臀| 亚洲视频在线观看免费| 性猛交xxxx乱大交孕妇印度| 色天天综合色天天久久| 强行糟蹋人妻hd中文| 国产欧美一区二区在线观看| 亚洲黄色小说在线观看| 免费成人av资源网| 奇米影视亚洲色图| 天天精品视频| 欧美亚洲爱爱另类综合| av在线亚洲色图| 国产欧美在线播放| 亚洲男人av| 欧美激情乱人伦一区| 最新av网站在线观看| 精品调教chinesegay| 99热这里只有精品66| 欧美自拍偷拍一区| 欧美亚韩一区二区三区| 夜夜精品浪潮av一区二区三区| 五月天精品在线| 91色porny蝌蚪| 免费看91视频| 久久国产精品一区二区| 久草综合在线观看| 国产精品久久久亚洲一区| 大陆极品少妇内射aaaaaa| 青草国产精品| 青青成人在线| 久操精品在线| 久久精品日韩精品| 成人偷拍自拍| 91免费版网站在线观看| 国产精品亚洲四区在线观看| 国产精品露脸av在线| 美女100%一区| 日本精品久久久久影院| 欧美少妇精品| 欧美亚洲在线视频| 午夜激情电影在线播放| 96精品视频在线| 国产v日韩v欧美v| 高清欧美性猛交xxxx| 男女在线视频| 久久久久久久久网站| 污视频在线免费观看网站| 久久亚洲国产精品成人av秋霞| 日本高清中文字幕在线| 日韩亚洲第一页| 午夜免费视频在线国产| 少妇高潮久久77777| 免费的黄网站在线观看| 久久精品99国产精品酒店日本| 亚洲图片88| 日韩视频在线观看免费| 黄网站在线免费| 欧美成人小视频| 少女频道在线观看高清| 午夜精品久久久久久久99黑人| 国产高清自产拍av在线| 性亚洲最疯狂xxxx高清| 中文字幕一区久| 国产精品夫妻激情| 色8久久久久| 99精品国产一区二区| 成人h动漫精品一区二区器材| 国产精品久久国产三级国电话系列 | 欧美日韩国产精品一区| 久久精品视频7| 欧美在线免费视屏| 国产日韩一级片| 亚洲高清福利视频| 成人免费高清在线播放| 久久久精品免费视频| 538在线观看| 国产成人精品久久久| 精品美女一区| av色综合网| 亚洲激情77| 免费看av软件| 亚洲免费观看| www.夜夜爽| 丰满岳乱妇一区二区三区| 久久人人爽人人爽人人片| 国产精品视频第一区| 久久久久久蜜桃| 色域天天综合网| 国产欧美日韩综合精品一区二区三区| 亚洲福利视频网站| 1024视频在线| 久久久视频在线| 粉嫩av一区二区三区四区五区 | 在线播放国产一区| 精品少妇一区二区三区在线播放| 全色精品综合影院| 久久九九精品99国产精品| а√在线天堂官网| 成人欧美一区二区三区黑人| 国产精品色在线网站| 影音先锋欧美资源| 9国产精品视频| 在线免费黄色网| 久久网这里都是精品| 欧美黄色一区二区三区| 欧美性做爰猛烈叫床潮| 国产18精品乱码免费看| 最新国产精品亚洲| 樱桃视频成人在线观看| 亚洲影院在线看| 郴州新闻综合频道在线直播| 欧美精品卡一卡二| 韩日欧美一区二区三区| 在线不卡av电影| 亚洲高清视频的网址| 国产剧情精品在线| 一区二区三区国产视频| 久久男人av资源站| 电影午夜精品一区二区三区| 99久久久久国产精品| 看欧美ab黄色大片视频免费| 99久久久精品| 欧美久久久久久久久久久久| 欧美色网一区二区| 神马久久精品| 久久免费少妇高潮久久精品99| 国产精品毛片无码| 一区二区在线不卡| 日av在线不卡| 少妇av片在线观看| 色哟哟一区二区| 欧美少妇另类| 8050国产精品久久久久久| 91综合精品国产丝袜长腿久久| 最新视频 - x88av| 黄页网站大全一区二区| jizzjizzjizz国产| 欧美午夜精品久久久| 成人网视频在线观看| 日韩av快播网址| 国产不卡一区| 黄色a级片免费| 久久久午夜精品理论片中文字幕| www..com国产| 亚洲九九九在线观看| 特黄毛片在线观看| 久久精品国产精品青草色艺| 99在线精品视频在线观看| 亚洲一级Av无码毛片久久精品| 亚洲综合免费观看高清完整版在线| 国产精品欧美久久久久天天影视| www.精品av.com| 久久精品 人人爱| 在线天堂一区av电影| 国内成人精品2018免费看| 日本一级二级视频| 亚洲精品在线三区| 老司机深夜福利在线观看| 久久久久久艹| 日产欧产美韩系列久久99| 日韩精品电影一区二区三区| 欧美日韩国产成人在线91| 中文字幕中文字幕在线中高清免费版| 亚洲综合国产精品| 极品尤物久久久av免费看| 国产精品第七页| 欧美伊人久久大香线蕉综合69| 尤物网在线观看| 亚洲精品日韩激情在线电影| 在线日本成人| 欧美18—19性高清hd4k| 8v天堂国产在线一区二区| 天堂av在线电影| 美脚丝袜一区二区三区在线观看| 天堂在线亚洲视频| 成人黄色短视频| 欧美sm美女调教| 成人爽a毛片免费啪啪| 亚洲综合网中心| 国产91精品一区二区麻豆亚洲| 国产香蕉视频在线| 中文字幕亚洲专区| 亚洲国产视频二区| 六月丁香婷婷激情| 国产精品白丝在线| 视频二区在线观看| 国产精品免费网站| 欧美日韩国产高清| 黄瓜视频污在线观看| 制服丝袜中文字幕亚洲| 国产精品25p| 在线国产精品网| 99精品视频一区二区三区| 中文字幕在线观看视频一区| 欧美激情女人20p| 国产欧美日韩精品一区二区三区| 亚洲一二区在线观看| 欧美日韩在线观看视频| 超碰个人在线|