精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

精品乱码一区二区三区| 亚洲天堂男人天堂| 伊人久久青草| 国产欧美久久久精品免费| 91精品国产麻豆国产在线观看 | 亚洲福利在线播放| 992tv成人免费观看| 国产精品国产三级国产aⅴ| 奇米亚洲欧美| 欧美二区三区91| 一区二区三区四区视频在线| 夜夜躁狠狠躁日日躁av| 自拍亚洲一区| 3d成人h动漫网站入口| www污在线观看| 免费人成在线观看网站| 久久成人免费网| 国内外成人免费激情在线视频| 老牛影视av老牛影视av| 91成人精品观看| 天天射综合影视| 一区二区三区我不卡| 男人天堂av网| 日本成人在线不卡视频| 欧美精品一区二区免费| 黄色aaa视频| 国产精品日本一区二区不卡视频| 欧美日韩国产黄| 香蕉精品视频在线| 深夜福利在线看| 国产真实精品久久二三区| 久久久伊人欧美| av片在线免费看| 韩国精品福利一区二区三区| 欧美四级电影网| 国产中文字幕二区| 九七久久人人| 久久久精品免费免费| 成人激情av| 亚洲一区二区三区网站| 亚洲精选国产| 北条麻妃一区二区三区中文字幕 | 精品国产一区二区三区久久久久久 | 成人在线免费在线观看| √天堂8在线网| 久久精品人人做人人综合| 国产99在线免费| 国产精品嫩草影院精东| 青青草精品视频| 欧美综合在线观看| 久久精品视频8| 91精品国产成人观看| 在线观看日韩欧美| 男生裸体视频网站| 成人性生交大片免费看96| 在线综合亚洲欧美在线视频| 爆乳熟妇一区二区三区霸乳| 国产极品在线观看| 亚洲精品videosex极品| 自拍另类欧美| av基地在线| 久久亚洲二区三区| 蜜桃av噜噜一区二区三| 免费看av毛片| 不卡区在线中文字幕| 91九色单男在线观看| 一级α片免费看刺激高潮视频| 免费在线成人| 热草久综合在线| 国产精品视频久久久久久久| 999在线观看精品免费不卡网站| 久久99久久99精品免观看粉嫩 | 欧美一级视频在线观看| 日韩xxx高潮hd| 91久久综合| 国产做受69高潮| 日本三级午夜理伦三级三| 欧美精品啪啪| 久久久亚洲精品视频| www青青草原| 国产伦一区二区三区| 精品国产乱码久久久久久闺蜜| 婷婷中文字幕在线观看| 亚洲色图图片| 91精品久久久久久久99蜜桃| jizz18女人| 久久精品嫩草影院| 欧美日韩精品免费| 羞羞的视频在线| 日韩三级一区| 日本韩国欧美国产| www.com污| 青娱乐极品盛宴一区二区| 欧美精品视频www在线观看| 一区二区三区国产好的精华液| **国产精品| 日韩欧美成人一区| 欧美无人区码suv| 激情综合网站| 美女999久久久精品视频| 久久综合激情网| 亚洲主播在线| 国产精品专区第二| 亚洲黄色精品视频| 久久亚洲一区二区三区明星换脸| 日韩一区二区三区高清| 国产成人无吗| 午夜视频在线观看一区二区| 亚洲欧美另类动漫| 日韩成人视屏| 亚洲人成在线播放| 亚洲怡红院在线观看| 狠狠久久婷婷| 国产精品激情av电影在线观看| 91精品国自产| 97se狠狠狠综合亚洲狠狠| 亚洲国产欧美不卡在线观看 | 欧美中日韩免费视频| 午夜看片在线免费| 香蕉久久一区二区不卡无毒影院| 日日碰狠狠丁香久燥| 日本伊人久久| 中文字幕精品www乱入免费视频| 丰满少妇被猛烈进入一区二区| 亚洲精品黄色| 成人免费观看a| 日韩欧美在线观看一区二区| 日韩毛片高清在线播放| 久在线观看视频| 国产成人视屏| 亚洲人成免费电影| 免费中文字幕视频| 免费成人你懂的| 久久大香伊蕉在人线观看热2| 成人午夜在线影视| 欧美无砖砖区免费| 男女黄床上色视频| 韩国欧美一区| 91精品视频网站| av亚洲在线| 色婷婷综合五月| 国产一卡二卡三卡四卡| 91精品国产乱码久久久久久| 国产精品av网站| 天天插天天干天天操| 亚洲久草在线视频| 天天操天天爽天天射| 日韩三级av| 欧美精品videos另类日本| 一卡二卡在线观看| 国产欧美日本一区视频| 一二三四视频社区在线| 久久久久久爱| 久久精品视频va| 中文字幕欧美人妻精品一区蜜臀| 久久久亚洲综合| www一区二区www免费| 久久99精品国产自在现线| 欧美人与性动交| 国产又色又爽又黄又免费| 国产精品天天摸av网| 国产1区2区在线| 日韩精品丝袜美腿| 韩剧1988免费观看全集| 黄色片一区二区| 亚洲一区二区三区四区五区中文 | 一区二区不卡在线观看| 成人福利片在线| 中文欧美在线视频| 一级黄色大毛片| 国产精品久久久久三级| 亚洲天堂2018av| 日韩在线第七页| 国产免费久久av| 精品黄色免费中文电影在线播放| 欧美亚洲日本国产| 亚洲av成人无码久久精品| 蜜臀a∨国产成人精品| 欧美亚洲另类久久综合| 巨茎人妖videos另类| 国产亚洲精品高潮| 中文字幕永久在线视频| 国产精品国产三级国产aⅴ入口| 777一区二区| 欧美a级一区| 丁香婷婷久久久综合精品国产| 免费在线观看的电影网站| 欧美精品一区二区在线观看| 日韩成人免费在线观看| 久久久久久久久99精品| 黄色三级视频片| 中文字幕亚洲精品乱码| 国产精品免费在线播放| 深夜av在线| 中文字幕日韩av电影| 国产精品欧美激情在线| 亚洲va欧美va人人爽午夜| 精品无码一区二区三区| 久久99精品久久久久| 青青草视频在线视频| 美日韩黄色大片| 国产精品视频专区| 国产羞羞视频在线播放| 亚洲免费高清视频| 国产一区二区女内射| 亚洲大尺度视频在线观看| 四虎影成人精品a片| 开心九九激情九九欧美日韩精美视频电影 | 免费观看日韩毛片| 久久久综合色| 国产在线精品一区二区三区| 成人免费在线观看视频| 色黄久久久久久| 亚洲精品97久久中文字幕| 亚洲国产aⅴ天堂久久| 日本aaa视频| 国产在线视频一区二区三区| 国产午夜福利100集发布| 成人网18免费网站| 国产91色在线|亚洲| 日韩三区免费| 欧美国产在线电影| 91在线免费看| 日韩精品视频在线观看网址| 国产精品久久免费| 性做久久久久久久免费看| 日韩不卡av在线| 97久久精品人人澡人人爽| 999在线精品视频| 国产精品视频| 乱子伦一区二区| 精品产国自在拍| 国产精品日本一区二区| 久久精品国产精品亚洲毛片| 欧美最顶级的aⅴ艳星| 欧美性爽视频| 日韩在线播放一区| 国产中文字幕在线观看| 欧美变态凌虐bdsm| 国产又大又粗又硬| 精品视频1区2区3区| 国产成人无码精品久在线观看| 亚洲天堂免费看| 欧美日韩生活片| 91视频观看视频| 欧美一区二区免费在线观看| 国产在线精品一区二区三区不卡| 成年人视频在线免费| 中文一区在线| 日本人体一区二区| 欧美精品国产| 成人在线观看毛片| 1024精品久久久久久久久| 亚洲一区二区在线免费观看| 亚洲综合图色| 蜜桃av久久久亚洲精品| 日韩在线你懂的| 国产自产在线视频一区| 国产美女撒尿一区二区| 成人激情av| 一区视频网站| 成人在线免费观看视视频| 久久99国产精品二区高清软件| 国产精品久久久久久五月尺| 高清电影一区| 国产精品成人免费视频| 欧美不卡高清一区二区三区| 国产99久久久欧美黑人| 吞精囗交69激情欧美| 热re99久久精品国产66热| 亚洲日本天堂| 国产精品 欧美在线| 国产精品字幕| 国产日韩欧美中文在线播放| 日本午夜精品久久久久| 亚洲一区国产精品| 中文在线综合| 久久久久久99| 国产欧美日韩精品一区二区三区| 视频一区视频二区视频三区视频四区国产 | 久久久久久久国产精品影院| 亚洲av成人无码一二三在线观看| 韩国成人精品a∨在线观看| www.精品在线| 国产麻豆视频精品| 肉丝美足丝袜一区二区三区四| 成人免费av网站| 日本xxx在线播放| 国产精品午夜春色av| 日本一二三区在线观看| 一区二区三区高清| 日韩视频免费观看高清| 色婷婷激情久久| 中文字幕在线播放不卡| 91精品午夜视频| 亚洲精品一区二区口爆| 亚洲精品成人久久| av资源在线观看免费高清| 日韩视频精品在线| segui88久久综合9999| 欧美做受高潮电影o| 青草综合视频| 国产精品日韩欧美一区二区三区 | 国产精品jizz| 国产精品久久久久永久免费观看| 91porn在线视频| 日韩欧美中文在线| 日韩不卡高清视频| 91精品国产入口在线| 美女做暖暖视频免费在线观看全部网址91| 一区二区三区视频免费在线观看| av超碰免费在线| 日韩美女在线看| 日韩精品一区二区三区中文在线| 美女亚洲精品| 欧美福利视频| 青青在线免费观看视频| 国产精品夜夜嗨| 欧美另类z0zx974| 亚洲成人你懂的| 区一区二在线观看| 精品国产青草久久久久福利| h视频在线免费| 国产91精品久久久久| 精品国产三区在线| 日韩国产高清一区| 亚洲毛片在线| 99re6在线观看| 91亚洲永久精品| 国产人妻精品一区二区三区不卡| 欧美日韩性生活视频| 99久久免费国产精精品| 亚洲系列中文字幕| 欧美裸体视频| 99在线观看视频网站| 久久神马影院| 亚洲黄色a v| 91美女片黄在线观看91美女| 五月天丁香激情| 911精品国产一区二区在线| 久久久久久久影视| 91高潮精品免费porn| 999久久久久久久久6666| 在线观看日韩羞羞视频| 久久一区中文字幕| 久久精品成人av| 午夜电影久久久| 91精品视频免费在线观看| 亚洲国产天堂久久综合| av中文在线资源库| 成人看片在线| 韩日欧美一区| 日日夜夜精品视频免费观看| 国产精品卡一卡二卡三| 中文字幕精品无码亚| 亚洲一级一级97网| 欧美成人精品三级网站| 日本欧美精品久久久| 日日骚欧美日韩| 亚洲av毛片基地| 欧美在线视频你懂得| 国产最新视频在线| 午夜精品福利在线观看| 婷婷视频一区二区三区| 国产女主播自拍| 成人免费毛片嘿嘿连载视频| 久久伊人成人网| 精品福利在线导航| 2021中文字幕在线| 国产亚洲福利社区| 国产亚洲高清视频| 亚洲最大成人网站| 91久久久免费一区二区| 四虎精品一区二区三区| 97超视频免费观看| 日韩精品丝袜美腿| 免费观看成人在线视频| 中文子幕无线码一区tr| 一级全黄裸体免费视频| 不卡av在线播放| 久久久精品区| 黄色免费视频大全| 国产欧美精品一区二区三区四区 | 欧美激情第一区| 亚洲精品精品亚洲| 国模人体一区二区| 97成人精品区在线播放| 精品国产一区二区三区av片| 日本爱爱免费视频| 最新成人av在线| 黄色三级网站在线观看| 日本一区二区在线免费播放| 日韩中文首页| 台湾佬美性中文| 午夜不卡在线视频| 97在线观看免费观看高清| 亚洲va久久久噜噜噜| 国产亚洲一区在线| 国产视频精品免费| 欧美精品一区二区久久久|