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

對于Netty ByteBuf的零拷貝(Zero Copy) 的理解

開發 后端
所謂的 Zero-copy, 就是在操作數據時, 不需要將數據 buffer 從一個內存區域拷貝到另一個內存區域. 因為少了一次內存的拷貝, 因此 CPU 的效率就得到的提升.

根據 Wiki 對 Zero-copy 的定義:

"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when transmitting a file over a network.

即所謂的 Zero-copy, 就是在操作數據時, 不需要將數據 buffer 從一個內存區域拷貝到另一個內存區域. 因為少了一次內存的拷貝, 因此 CPU 的效率就得到的提升.

在 OS 層面上的 Zero-copy 通常指避免在 用戶態(User-space) 與 內核態(Kernel-space) 之間來回拷貝數據. 例如 Linux 提供的mmap 系統調用, 它可以將一段用戶空間內存映射到內核空間, 當映射成功后, 用戶對這段內存區域的修改可以直接反映到內核空間; 同樣地, 內核空間對這段區域的修改也直接反映用戶空間. 正因為有這樣的映射關系, 我們就不需要在 用戶態(User-space) 與 內核態(Kernel-space) 之間拷貝數據, 提高了數據傳輸的效率.

而需要注意的是, Netty 中的 Zero-copy 與上面我們所提到到 OS 層面上的 Zero-copy 不太一樣, Netty的 Zero-coyp 完全是在用戶態(Java 層面)的, 它的 Zero-copy 的更多的是偏向于 優化數據操作 這樣的概念.

Netty 的 Zero-copy 體現在如下幾個個方面:

  • Netty 提供了 CompositeByteBuf 類, 它可以將多個 ByteBuf 合并為一個邏輯上的 ByteBuf, 避免了各個 ByteBuf 之間的拷貝.
  • 通過 wrap 操作, 我們可以將 byte[] 數組、ByteBuf、ByteBuffer等包裝成一個 Netty ByteBuf 對象, 進而避免了拷貝操作.
  • ByteBuf 支持 slice 操作, 因此可以將 ByteBuf 分解為多個共享同一個存儲區域的 ByteBuf, 避免了內存的拷貝.
  • 通過 FileRegion 包裝的FileChannel.tranferTo 實現文件傳輸, 可以直接將文件緩沖區的數據發送到目標 Channel, 避免了傳統通過循環 write 方式導致的內存拷貝問題.

下面我們就來簡單了解一下這幾種常見的零拷貝操作.

通過 CompositeByteBuf 實現零拷貝

假設我們有一份協議數據, 它由頭部和消息體組成, 而頭部和消息體是分別存放在兩個 ByteBuf 中的, 即:

  1. ByteBuf header = ... 
  2. ByteBuf body = ...  

我們在代碼處理中, 通常希望將 header 和 body 合并為一個 ByteBuf, 方便處理, 那么通常的做法是:

  1. ByteBuf allBuf = Unpooled.buffer(header.readableBytes() + body.readableBytes()); 
  2. allBuf.writeBytes(header); 
  3. allBuf.writeBytes(body);  

可以看到, 我們將 header 和 body 都拷貝到了新的 allBuf 中了, 這無形中增加了兩次額外的數據拷貝操作了.

那么有沒有更加高效優雅的方式實現相同的目的呢? 我們來看一下 CompositeByteBuf 是如何實現這樣的需求的吧.

  1. ByteBuf header = ... 
  2. ByteBuf body = ... 
  3. CompositeByteBuf compositeByteBuf = Unpooled.compositeBuffer(); 
  4. compositeByteBuf.addComponents(true, header, body);  

上面代碼中, 我們定義了一個 CompositeByteBuf 對象, 然后調用

  1. public CompositeByteBuf addComponents(boolean increaseWriterIndex, ByteBuf... buffers) { 
  2. ... 
  3.  

方法將 header 與 body 合并為一個邏輯上的 ByteBuf, 即: 

 

 

 

不過需要注意的是, 雖然看起來 CompositeByteBuf 是由兩個 ByteBuf 組合而成的, 不過在 CompositeByteBuf 內部, 這兩個 ByteBuf 都是單獨存在的, CompositeByteBuf 只是邏輯上是一個整體.

上面 CompositeByteBuf 代碼還以一個地方值得注意的是, 我們調用 addComponents(boolean increaseWriterIndex, ByteBuf... buffers) 來添加兩個 ByteBuf, 其中***個參數是 true, 表示當添加新的 ByteBuf 時, 自動遞增 CompositeByteBuf 的 writeIndex.

如果我們調用的是

  1. compositeByteBuf.addComponents(header, body); 

那么其實 compositeByteBuf 的 writeIndex 仍然是0, 因此此時我們就不可能從 compositeByteBuf 中讀取到數據, 這一點希望大家要特別注意.

除了上面直接使用 CompositeByteBuf 類外, 我們還可以使用 Unpooled.wrappedBuffer 方法, 它底層封裝了 CompositeByteBuf 操作, 因此使用起來更加方便:

  1. ByteBuf header = ... 
  2. ByteBuf body = ... 
  3. ByteBuf allByteBuf = Unpooled.wrappedBuffer(header, body);  

通過 wrap 操作實現零拷貝

例如我們有一個 byte 數組, 我們希望將它轉換為一個 ByteBuf 對象, 以便于后續的操作, 那么傳統的做法是將此 byte 數組拷貝到 ByteBuf 中, 即:

  1. byte[] bytes = ... 
  2. ByteBuf byteBuf = Unpooled.buffer(); 
  3. byteBuf.writeBytes(bytes);  

顯然這樣的方式也是有一個額外的拷貝操作的, 我們可以使用 Unpooled 的相關方法, 包裝這個 byte 數組, 生成一個新的 ByteBuf 實例, 而不需要進行拷貝操作. 上面的代碼可以改為:

  1. byte[] bytes = ... 
  2. ByteBuf byteBuf = Unpooled.wrappedBuffer(bytes);  

可以看到, 我們通過 Unpooled.wrappedBuffer 方法來將 bytes 包裝成為一個 UnpooledHeapByteBuf 對象, 而在包裝的過程中, 是不會有拷貝操作的. 即***我們生成的生成的 ByteBuf 對象是和 bytes 數組共用了同一個存儲空間, 對 bytes 的修改也會反映到 ByteBuf 對象中.

Unpooled 工具類還提供了很多重載的 wrappedBuffer 方法:

  1. public static ByteBuf wrappedBuffer(byte[] array) 
  2. public static ByteBuf wrappedBuffer(byte[] array, int offset, int length) 
  3.  
  4. public static ByteBuf wrappedBuffer(ByteBuffer buffer) 
  5. public static ByteBuf wrappedBuffer(ByteBuf buffer) 
  6.  
  7. public static ByteBuf wrappedBuffer(byte[]... arrays) 
  8. public static ByteBuf wrappedBuffer(ByteBuf... buffers) 
  9. public static ByteBuf wrappedBuffer(ByteBuffer... buffers) 
  10.  
  11. public static ByteBuf wrappedBuffer(int maxNumComponents, byte[]... arrays) 
  12. public static ByteBuf wrappedBuffer(int maxNumComponents, ByteBuf... buffers) 
  13. public static ByteBuf wrappedBuffer(int maxNumComponents, ByteBuffer... buffers)  

這些方法可以將一個或多個 buffer 包裝為一個 ByteBuf 對象, 從而避免了拷貝操作.

通過 slice 操作實現零拷貝

slice 操作和 wrap 操作剛好相反, Unpooled.wrappedBuffer 可以將多個 ByteBuf 合并為一個, 而 slice 操作可以將一個 ByteBuf 切片為多個共享一個存儲區域的 ByteBuf 對象.

ByteBuf 提供了兩個 slice 操作方法:

  1. public ByteBuf slice(); 
  2. public ByteBuf slice(int indexint length);  

不帶參數的 slice 方法等同于 buf.slice(buf.readerIndex(), buf.readableBytes()) 調用, 即返回 buf 中可讀部分的切片. 而slice(int index, int length) 方法相對就比較靈活了, 我們可以設置不同的參數來獲取到 buf 的不同區域的切片.

下面的例子展示了 ByteBuf.slice 方法的簡單用法:

  1. ByteBuf byteBuf = ... 
  2. ByteBuf header = byteBuf.slice(0, 5); 
  3. ByteBuf body = byteBuf.slice(5, 10);  

用 slice 方法產生 header 和 body 的過程是沒有拷貝操作的, header 和 body 對象在內部其實是共享了 byteBuf 存儲空間的不同部分而已. 即:

 

 

 

通過 FileRegion 實現零拷貝

Netty 中使用 FileRegion 實現文件傳輸的零拷貝, 不過在底層 FileRegion 是依賴于 Java NIO FileChannel.transfer 的零拷貝功能.

首先我們從最基礎的 Java IO 開始吧. 假設我們希望實現一個文件拷貝的功能, 那么使用傳統的方式, 我們有如下實現:

  1. public static void copyFile(String srcFile, String destFile) throws Exception { 
  2.     byte[] temp = new byte[1024]; 
  3.     FileInputStream in = new FileInputStream(srcFile); 
  4.     FileOutputStream out = new FileOutputStream(destFile); 
  5.     int length; 
  6.     while ((length = in.read(temp)) != -1) { 
  7.         out.write(temp, 0, length); 
  8.     } 
  9.  
  10.     in.close(); 
  11.     out.close(); 
  12.  

上面是一個典型的讀寫二進制文件的代碼實現了. 不用我說, 大家肯定都知道, 上面的代碼中不斷中源文件中讀取定長數據到 temp 數組中, 然后再將 temp 中的內容寫入目的文件, 這樣的拷貝操作對于小文件倒是沒有太大的影響, 但是如果我們需要拷貝大文件時, 頻繁的內存拷貝操作就消耗大量的系統資源了.

下面我們來看一下使用 Java NIO 的 FileChannel 是如何實現零拷貝的:

  1. public static void copyFileWithFileChannel(String srcFileName, String destFileName) throws Exception { 
  2.     RandomAccessFile srcFile = new RandomAccessFile(srcFileName, "r"); 
  3.     FileChannel srcFileChannel = srcFile.getChannel(); 
  4.  
  5.     RandomAccessFile destFile = new RandomAccessFile(destFileName, "rw"); 
  6.     FileChannel destFileChannel = destFile.getChannel(); 
  7.  
  8.     long position = 0; 
  9.     long count = srcFileChannel.size(); 
  10.  
  11.     srcFileChannel.transferTo(position, count, destFileChannel); 
  12.  

可以看到, 使用了 FileChannel 后, 我們就可以直接將源文件的內容直接拷貝(transferTo) 到目的文件中, 而不需要額外借助一個臨時 buffer, 避免了不必要的內存操作.

有了上面的一些理論知識, 我們來看一下在 Netty 中是怎么使用 FileRegion 來實現零拷貝傳輸一個文件的:

  1. @Override 
  2. public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { 
  3.     RandomAccessFile raf = null
  4.     long length = -1; 
  5.     try { 
  6.         // 1. 通過 RandomAccessFile 打開一個文件. 
  7.         raf = new RandomAccessFile(msg, "r"); 
  8.         length = raf.length(); 
  9.     } catch (Exception e) { 
  10.         ctx.writeAndFlush("ERR: " + e.getClass().getSimpleName() + ": " + e.getMessage() + '\n'); 
  11.         return
  12.     } finally { 
  13.         if (length < 0 && raf != null) { 
  14.             raf.close(); 
  15.         } 
  16.     } 
  17.  
  18.     ctx.write("OK: " + raf.length() + '\n'); 
  19.     if (ctx.pipeline().get(SslHandler.class) == null) { 
  20.         // SSL not enabled - can use zero-copy file transfer. 
  21.         // 2. 調用 raf.getChannel() 獲取一個 FileChannel. 
  22.         // 3. 將 FileChannel 封裝成一個 DefaultFileRegion 
  23.         ctx.write(new DefaultFileRegion(raf.getChannel(), 0, length)); 
  24.     } else { 
  25.         // SSL enabled - cannot use zero-copy file transfer. 
  26.         ctx.write(new ChunkedFile(raf)); 
  27.     } 
  28.     ctx.writeAndFlush("\n"); 
  29.  

上面的代碼是 Netty 的一個例子, 其源碼在 netty/example/src/main/java/io/netty/example/file/FileServerHandler.java

可以看到, ***步是通過 RandomAccessFile 打開一個文件, 然后 Netty 使用了 DefaultFileRegion 來封裝一個 FileChannel 即:

  1. new DefaultFileRegion(raf.getChannel(), 0, length) 

當有了 FileRegion 后, 我們就可以直接通過它將文件的內容直接寫入 Channel 中, 而不需要像傳統的做法: 拷貝文件內容到臨時 buffer, 然后再將 buffer 寫入 Channel. 通過這樣的零拷貝操作, 無疑對傳輸大文件很有幫助.

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

2024-11-28 10:40:26

零拷貝技術系統

2024-12-12 09:51:03

2020-10-12 06:33:18

Zero-Copy零拷貝CPU

2025-04-27 08:25:00

Netty零拷貝內存

2024-12-26 17:04:47

2022-05-16 08:22:37

零拷貝Netty

2024-06-07 08:10:14

Netty操作系統零拷貝

2024-10-24 16:14:43

數據傳輸CPU零拷貝

2025-08-18 00:00:00

零拷貝系統調用函數

2024-09-27 15:43:52

零拷貝DMAIO

2022-09-23 08:47:01

DMA網卡CPU

2024-04-29 08:15:07

I/OCPU密集型

2022-05-05 13:57:43

Buffer設備MYSQL

2018-08-15 10:29:58

NettyJDK內存

2010-05-06 09:43:29

負載均衡功能

2024-03-12 08:20:57

零拷貝存儲開發

2020-10-12 08:35:22

JavaScript

2011-06-14 10:01:03

長尾關鍵詞

2021-06-08 07:45:44

Go語言優化

2024-12-25 09:25:38

點贊
收藏

51CTO技術棧公眾號

亚洲国产精品视频| 国产成人在线观看免费网站| 亚洲天堂男人天堂女人天堂| 久久久久久三级| 黄网页在线观看| 国产不卡视频一区| 国产不卡在线观看| 老湿机69福利| 亚洲国产欧美日韩在线观看第一区| 91高清在线观看| 一本大道东京热无码aⅴ| 亚洲欧美日韩精品永久在线| 久久精品国产精品亚洲综合| 国内自拍欧美激情| 五月婷婷婷婷婷| 精品国产18久久久久久洗澡| 精品视频在线免费观看| 蜜臀精品一区二区| 91se在线| 91老师国产黑色丝袜在线| 91美女福利视频高清| 国产a∨精品一区二区三区仙踪林| 日韩av大片| 亚洲精品美女在线观看播放| 在线免费黄色网| 唐人社导航福利精品| 亚洲一区二区五区| 伊人久久婷婷色综合98网| 香蕉视频成人在线| 国产成人精品一区二区三区四区| 国产精品久久久久久久av电影| 免费在线黄色片| 仙踪林久久久久久久999| 日韩乱码在线视频| 丰满少妇xbxb毛片日本| 成人永久在线| 欧美日韩久久不卡| av网址在线观看免费| 成入视频在线观看| 亚洲图片欧美视频| 国产经典久久久| 日本韩国在线视频爽| 国产女人aaa级久久久级 | 一女被多男玩喷潮视频| 日日夜夜天天综合入口| 亚洲日本中文字幕区| 日韩在线三区| 国产高清av在线| 久久久夜色精品亚洲| 久久久久成人精品免费播放动漫| 丰满人妻熟女aⅴ一区| 国产精品一二三区在线| 91成人理论电影| 国产精品久久久久久久免费看| 美女一区二区视频| 国产欧美精品一区二区三区介绍| 波多野结衣在线观看一区| 久久精品毛片| 国产精品1234| 亚洲网站免费观看| 九色porny丨国产精品| 成人精品视频久久久久| 97人妻精品一区二区三区动漫| 麻豆极品一区二区三区| 91精品免费久久久久久久久| 国产又粗又猛又爽又黄的| 久久精品国产在热久久| 91视频九色网站| 国产日韩在线观看一区| 国产成人精品综合在线观看| 精品久久中出| 国产在线免费观看| 中文字幕综合网| 日韩专区第三页| 美女av在线免费看| 欧美性一二三区| 手机精品视频在线| 奇米777国产一区国产二区| 国产视频久久网| 91社区视频在线观看| 天天做天天爱天天综合网| 欧美人与物videos| 1级黄色大片儿| 蜜臀久久久久久久| 91福利视频导航| 天堂网www中文在线| 久久久久久毛片| 天天做天天爱天天高潮| 阿v视频在线观看| 欧美在线综合视频| 日韩女优在线视频| 国产伦精品一区二区三区视频 | 欧美日韩久久久| 免费黄色a级片| 国产成人久久| 欧美精品免费看| www.欧美色| 国产一区二区三区精品视频| 好吊色欧美一区二区三区| 成人午夜电影在线观看| 亚洲综合成人在线视频| 日日碰狠狠丁香久燥| 亚洲精品a区| 一区二区欧美日韩视频| 精品无码免费视频| 美女脱光内衣内裤视频久久影院| 成人看片视频| 香蕉视频在线看| 精品久久久久久久久国产字幕| 在线观看国产一级片| 女同久久另类99精品国产| www.亚洲免费视频| www.com亚洲| 成人小视频免费在线观看| 亚洲精品8mav| 男人最爱成人网| 精品国产成人在线影院 | 蜜桃91麻豆精品一二三区| 国产亚洲午夜高清国产拍精品| 毛片av在线播放| 日本中文字幕视频一区| 亚洲男女性事视频| 中文字幕一区二区三区手机版 | 精品美女国产在线| 1314成人网| 99久久综合狠狠综合久久aⅴ| 91av视频在线| 人妻少妇一区二区三区| 亚洲精品欧美激情| www.com操| 国产剧情一区| 国产精品18久久久久久麻辣| 欧洲av在线播放| 一区二区日韩电影| 欧美一级免费在线| 五月婷婷亚洲| 成人精品一区二区三区| 3p视频在线观看| 欧美在线一区二区| 免费看黄色三级| 日韩在线观看一区二区| 秋霞在线观看一区二区三区| 亚洲欧洲日本韩国| 精品亚洲男同gayvideo网站| 欧美精品亚洲精品日韩精品| 波多野结衣中文字幕一区二区三区| 大地资源网在线观看免费官网| 国产精品视频首页| 麻豆成人在线看| 国产成a人亚洲精v品无码 | 在线看视频不卡| 欧美大片网站| 久久精品99无色码中文字幕| 国产一区二区在线不卡| 综合分类小说区另类春色亚洲小说欧美| 在线免费av播放| 成人羞羞网站| 国产欧美日韩中文字幕在线| 日本福利在线| 欧美高清一级片在线| 开心激情五月网| 国产综合久久久久久久久久久久 | 日韩大片在线永久免费观看网站| 欧美色综合网站| 侵犯稚嫩小箩莉h文系列小说| 激情偷乱视频一区二区三区| 最新av在线免费观看| 视频精品二区| 1769国内精品视频在线播放| 免费理论片在线观看播放老| 在线观看免费成人| 久久一级免费视频| 国产精品456| 欧美不卡在线播放| 国产一区二区三区日韩精品 | 欧美一级欧美一级| 综合亚洲自拍| 国产一区二区丝袜| 国产丝袜在线播放| 亚洲精品天天看| 91久久久久久久久久久久| 亚洲欧美日韩国产一区二区三区 | 日韩午夜在线视频| 性生活视频软件| 色婷婷精品大视频在线蜜桃视频| 一级片黄色录像| 高清shemale亚洲人妖| 国产精品视频一区二区三区四区五区| 成人影院天天5g天天爽无毒影院| 亚洲free性xxxx护士白浆| 欧亚av在线| 久久精品国产欧美激情| 蜜桃视频在线观看www| 欧美私模裸体表演在线观看| 久久在线视频精品| 欧美国产激情二区三区| 91精品国产高清91久久久久久| 免费永久网站黄欧美| 精品一区二区成人免费视频 | 欧美成人一区二区三区片免费| 欧美三级午夜理伦| 国产精品久久久久久久久搜平片| 国产日韩视频一区| 蜜乳av一区二区| www国产精品内射老熟女| 久久激情电影| 精品一区二区三区免费毛片| 国产麻豆精品| 国产精品旅馆在线| 国产网站在线| 欧美成人一二三| 1区2区3区在线观看| 日韩av在线电影网| 精品久久久久久亚洲综合网站| 色婷婷精品久久二区二区蜜臂av | 日韩欧美国产一区二区| 午夜国产福利一区二区| 国产女主播一区| 久久国产精品影院| www.日韩精品| 99久久综合网| 国内外成人在线视频| 美女黄色片视频| 国产精品日韩欧美一区| 精品一区二区三区无码视频| 亚洲国产精品91| 亚洲精品成人a8198a| 久久不见久久见中文字幕免费| 国产一区国产精品| 综合激情久久| 999视频在线免费观看| **国产精品| 国产精品中文字幕在线观看| 欧美二三四区| 欧洲亚洲妇女av| 中文在线免费二区三区| 国外成人在线直播| 爱草tv视频在线观看992| 欧美激情一级精品国产| 色呦呦在线资源| 欧美大片va欧美在线播放| 成人video亚洲精品| 日韩在线观看免费av| 亚洲乱亚洲乱妇| xxx欧美精品| 欧美边添边摸边做边爱免费| 色偷偷偷亚洲综合网另类| 91大神在线网站| 久久九九全国免费精品观看| 精品自拍一区| 久久艹在线视频| 羞羞视频在线免费国产| 欧美国产乱视频| 美女扒开腿让男人桶爽久久软| 97热精品视频官网| 欧美舌奴丨vk视频| 国产精品旅馆在线| 精品99re| 国产日韩欧美亚洲一区| 特黄特色欧美大片| 免费成人深夜夜行视频| 国产精品一区二区三区av麻 | 国产免费a级片| 99久久伊人网影院| 四虎国产精品成人免费入口| 国产亚洲精品久| 四虎地址8848| 亚洲综合一二三区| 国产又黄又爽又色| 欧美综合视频在线观看| 91久久久久久久久久久久| 日韩欧美高清在线| 午夜视频免费在线| 最新的欧美黄色| 色呦呦在线视频| 日韩av成人在线观看| 日韩国产一二三区| 国产精品99久久久久久久| 精品在线播放| 国产午夜精品视频一区二区三区| 国产一区二区高清| 特黄视频免费观看| 成人精品鲁一区一区二区| 欧洲美熟女乱又伦| 亚洲综合免费观看高清在线观看| 国产精品久免费的黄网站| 在线播放国产精品二区一二区四区| xxxx国产精品| 亚洲香蕉av在线一区二区三区| 欧美成年黄网站色视频| 91国产美女在线观看| 国产成人亚洲一区二区三区| 成人激情直播| 欧美理论视频| 久久手机在线视频| 美美哒免费高清在线观看视频一区二区 | 在线精品视频小说1| aaa一区二区三区| 亚洲裸体xxxx| 最新国产露脸在线观看| 日韩免费在线视频| ccyy激情综合| 一区二区免费在线观看| 国产精品三上| 国产又黄又嫩又滑又白| 国产嫩草影院久久久久| 精品处破女学生| 制服丝袜亚洲色图| 国产网站在线播放| 97热在线精品视频在线观看| 精品视频在线播放一区二区三区 | 欧美日韩mv| 无需播放器的av| 2014亚洲片线观看视频免费| 久久久久免费看| 欧美精品少妇一区二区三区| 加勒比一区二区三区在线| 久久男人资源视频| 精品国产不卡一区二区| 亚洲高清在线播放| 亚洲一区亚洲| 色综合久久五月| 一区二区免费在线播放| 国产精品毛片久久久久久久av| 亚洲欧洲中文天堂| www.com.cn成人| 国产一区二区视频在线免费观看 | 一本色道无码道dvd在线观看| 成人黄色av电影| 久久久无码精品亚洲国产| 欧美一区二视频| 久久99精品久久久久久野外| 国产免费一区二区三区在线观看| 欧美欧美黄在线二区| 精品中文字幕av| 97久久精品人人做人人爽50路| 精品肉丝脚一区二区三区| 精品久久久久久亚洲综合网 | 午夜精品中文字幕| 中文字幕av一区 二区| 91丨九色丨海角社区| 亚洲色图第一页| 超碰国产一区| 欧美一区二区三区在线免费观看| 久久国产精品久久久久久电车| 人妻无码中文久久久久专区| 午夜久久久久久久久久一区二区| 亚洲欧美强伦一区二区| 97精品一区二区视频在线观看| 成人18夜夜网深夜福利网| 欧美日韩福利在线| 成人福利视频网站| 国产女同在线观看| 亚洲精品一区二区三区婷婷月| 波多视频一区| 日韩hmxxxx| 毛片av一区二区| 欧美日韩中文字幕在线观看| 日韩你懂的在线播放| gogo高清午夜人体在线| 精品在线视频一区二区三区| 一本一道久久综合狠狠老精东影业| 一出一进一爽一粗一大视频| 欧美日韩性视频| yw视频在线观看| 91精品啪在线观看麻豆免费| 午夜精品免费| 国产老熟女伦老熟妇露脸| 色欧美88888久久久久久影院| 成年在线电影| 91在线高清视频| 精品白丝av| 久久久久久久毛片| 在线不卡一区二区| www.8ⅹ8ⅹ羞羞漫画在线看| 精品国产乱码久久久久久郑州公司 | 久久精品免视看国产成人| 999在线观看视频| 国产欧美久久久精品影院| 国产精品一区二区三区在线免费观看| 欧美成人激情图片网| 亚洲涩涩av| 九九九九九伊人| 亚洲va国产天堂va久久en| 国产黄在线观看| 99久久精品久久久久久ai换脸| 性一交一乱一区二区洋洋av| 69xxx免费| 亚洲护士老师的毛茸茸最新章节 | 亚洲一区二区三区成人在线视频精品| 亚洲高清激情| 少妇愉情理伦三级| 精品成人私密视频| 精品久久福利| 国产免费黄色小视频| 亚洲欧洲日产国产综合网| 全国男人的天堂网| 国产在线一区二区三区| 国产亚洲精品bv在线观看| 日韩在线观看视频一区二区|