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

黄色短视频在线观看| a级黄色一级片| 国产高清精品软件丝瓜软件| 狠狠色综合网| 亚洲欧美日韩精品久久| 五月婷婷六月丁香激情| 欧美亚洲天堂| 国产亚洲美州欧州综合国| 亚洲www视频| 特级做a爱片免费69| 久久网站免费观看| 亚洲精品电影网| 午夜激情影院在线观看| 欧美xxxhd| 亚洲色图19p| 日本精品一区二区三区高清 久久| 国产精品无码AV| 免费精品视频| 高清亚洲成在人网站天堂| jizz18女人高潮| 国产色噜噜噜91在线精品| 欧美日韩中字一区| 国产91xxx| 国产黄大片在线观看画质优化| 91美女片黄在线观看| 91九色露脸| 中文字幕你懂的| 国产精品免费看| 欧美高清视频在线| 国产wwwwxxxx| 欧美日韩伦理| 亚洲欧洲在线视频| 黄色国产在线视频| 蜜桃在线一区| 欧美男男青年gay1069videost| 久久久久久久激情| av免费不卡国产观看| 亚洲美女免费视频| 日本黄色a视频| wwwxxx在线观看| 久久久久久久久久久99999| 国产一区二区在线网站| 精品国产伦一区二区三| 狠狠久久亚洲欧美| 成人免费高清完整版在线观看| 日韩在线www| 午夜免费看视频| 日韩国产网站| 欧美性生交大片免费| 免费看日本毛片| 女海盗2成人h版中文字幕| 亚洲一区二区三区四区在线观看 | 亚洲乱码免费伦视频| 自拍偷拍免费精品| 三上悠亚在线观看视频| 久久日文中文字幕乱码| x99av成人免费| 侵犯稚嫩小箩莉h文系列小说| 欧美电影免费播放| 色爱av美腿丝袜综合粉嫩av| 国产1区2区在线观看| 成人在线亚洲| 日韩在线视频观看正片免费网站| 人人艹在线视频| 欧美影视一区| 久久久久久久久久av| 国产做受高潮漫动| 麻豆九一精品爱看视频在线观看免费| 国产91热爆ts人妖在线| 中国老头性行为xxxx| 韩国av一区二区三区四区| 91色视频在线导航| 亚洲免费国产视频| 91免费视频网| 亚洲无玛一区| 青青草视频在线免费直播| 亚洲成av人片一区二区梦乃| 成人免费aaa| 国产成人免费9x9x人网站视频 | 日本精品一区在线| av日韩精品| 亚洲女人被黑人巨大进入al| 精品手机在线视频| 欧美黄色大片网站| 2018中文字幕一区二区三区| 中文字幕 自拍偷拍| 国产一区二区三区四| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 欧美国产1区2区| 欧美日韩dvd| 99久久久久久久久久| 国产一区福利| 丝袜亚洲另类欧美重口| 精国产品一区二区三区a片| 亚洲一区二区免费看| 国产精品香蕉国产| 欧美综合视频在线| 国产精品三级电影| 欧美国产视频一区| 91大神在线观看线路一区| 欧美成人女星排名| 中文字幕av久久爽一区| 国产精品www.| 国产精品欧美亚洲777777| www.中文字幕| 中文字幕不卡三区| 黄色www网站| 日韩激情综合| 自拍偷拍亚洲精品| 亚洲天堂一区在线观看| 国产精品中文字幕欧美| 欧洲一区二区日韩在线视频观看免费| 女同视频在线观看| 欧美日韩极品在线观看一区| 国产精品无码毛片| 欧美精品一区二区三区久久久竹菊| 日本电影亚洲天堂| 欧美 日韩 国产 成人 在线 91| 国产精品欧美极品| 国产成人无码一二三区视频| 超碰地址久久| 久久这里有精品| 国产精品尤物视频| 91免费国产视频网站| 国产精品视频一二三四区| 青草综合视频| 在线视频免费一区二区| 天天干在线播放| 成人一区二区三区视频在线观看 | www久久日com| 欧美视频一区二区三区四区| 18禁裸乳无遮挡啪啪无码免费| 国产专区一区| 91成人免费在线观看| av片在线观看| 欧美一区二区三区免费| 三上悠亚作品在线观看| 蓝色福利精品导航| 亚洲一区二区不卡视频| 韩日精品一区| 亚洲视频777| 亚洲欧美日韩一区二区三区四区| 2021中文字幕一区亚洲| 国产免费一区二区三区视频| 飘雪影视在线观看免费观看 | 97人人爽人人喊人人模波多| 国产乱人乱偷精品视频a人人澡| 中文成人综合网| 免费日韩中文字幕| 亚州综合一区| 欧美最近摘花xxxx摘花| 视频在线观看你懂的| 午夜精品福利视频网站| 中文字幕人妻一区二区三区| 亚洲精品1234| 精品一区久久久久久| 欧美13videosex性极品| 国产网站欧美日韩免费精品在线观看 | 欧美午夜片欧美片在线观看| 国产黄色三级网站| 美女久久网站| 水蜜桃亚洲一二三四在线| 亚洲v.com| 一区二区欧美日韩视频| 97人妻精品一区二区三区软件| 中文字幕日韩欧美一区二区三区| 在线观看中文av| 在线欧美日韩| 欧美日韩一区二区三区在线观看免 | 欧美性少妇18aaaa视频| 国产伦精品一区二区三区视频女| 麻豆精品久久精品色综合| 欧美一级黄色录像片| 91成人精品在线| 欧美精品123区| 全亚洲最色的网站在线观看| 国产视频手机在线观看| 亚洲午夜三级在线| 色哟哟精品观看| 国内精品在线播放| 欧美综合在线播放| 欧美午夜精彩| 成人午夜电影免费在线观看| 性欧美18xxxhd| 精品国产一区二区在线| 黄色福利在线观看| 欧美午夜寂寞影院| 久久久无码一区二区三区| 26uuu国产在线精品一区二区| 依人在线免费视频| 亚洲精品人人| 一本一本a久久| 欧美日日夜夜| 91精品啪aⅴ在线观看国产| 国产伦理精品| 日韩在线视频线视频免费网站| 亚洲av无码片一区二区三区 | 中日韩av在线| 亚洲国产成人高清精品| avhd101老司机| 99视频一区二区| 黄色片免费网址| 日韩精品1区2区3区| 黄色三级中文字幕| 日韩精品免费一区二区在线观看| 粉嫩av免费一区二区三区| 日本精品在线一区| 91av在线播放| 午夜激情在线| 日韩网站在线观看| 日本护士...精品国| 欧美一区二区精品在线| 波多野结衣mp4| 精品久久久久久久中文字幕| 日韩欧美综合视频| 日本一区二区不卡视频| 少妇毛片一区二区三区| 成人美女在线视频| 91丨porny丨九色| 久久成人综合网| 九色porny91| 久久视频一区| 欧美女人性生活视频| 狠狠爱www人成狠狠爱综合网 | 午夜亚洲性色视频| 农民人伦一区二区三区| 亚洲网色网站| 在线免费观看成人| 色呦哟—国产精品| 日韩精品久久一区二区三区| 一道本一区二区三区| 久久国产精品久久| 精品伊人久久久| 国产精品久久久久久久免费大片 | 日韩hmxxxx| 欧美猛男做受videos| 久久久久久久久久久久久9999| 国产厕拍一区| 国产精品一国产精品最新章节| 视频一区国产| 91传媒在线免费观看| 日本一区二区三区电影免费观看| 成人欧美一区二区三区黑人| 久久久久伊人| 成人免费自拍视频| 国内不卡的一区二区三区中文字幕 | 国产av国片精品| 99热这里只有成人精品国产| www.射射射| 国产精品久久久免费| 日本三级免费观看| 天堂午夜影视日韩欧美一区二区| 日韩欧美xxxx| 蜜臀精品久久久久久蜜臀| 欧美特级aaa| 国产一区视频在线看| 亚洲精品久久久久久| 国产1区2区3区精品美女| 亚洲欧美日韩偷拍| 91色婷婷久久久久合中文| 亚洲 小说 欧美 激情 另类| 国产欧美日本一区二区三区| 欧美自拍偷拍网| 亚洲免费成人av| 香蕉免费毛片视频| 在线精品视频免费观看| 亚洲视频一区在线播放| 日韩欧美一级在线播放| 天天躁日日躁狠狠躁伊人| 亚洲午夜av久久乱码| 免费a级人成a大片在线观看| 欧美精品亚州精品| 高潮在线视频| 国产精品欧美日韩| 涩爱av色老久久精品偷偷鲁| 精品欧美日韩| 天天影视综合| 久久久久久久久久久99| 秋霞成人午夜伦在线观看| 1314成人网| 91老司机福利 在线| 人妻熟人中文字幕一区二区| 一区二区三区在线视频观看58| 四虎永久在线精品| 欧美在线免费观看视频| 99热这里只有精品1| 日韩av最新在线观看| 久cao在线| 91成人在线播放| 91国产一区| 蜜桃成人免费视频| 香蕉久久网站| 久久美女福利视频| 国产成人鲁色资源国产91色综| 91精品国产自产| 亚洲人被黑人高潮完整版| 精品欧美一区二区三区免费观看| 欧美日韩一二三| 人成在线免费视频| 欧美成人h版在线观看| 日本久久免费| 国产精品视频在线免费观看| 日韩精品永久网址| 日韩中文字幕在线视频观看| 国内精品免费**视频| 亚洲一级中文字幕| 夜夜爽夜夜爽精品视频| 伊人免费在线观看高清版| 日韩av网站大全| 99视频免费在线观看| 国产精品久久不能| 亚洲欧洲色图| av在线观看地址| 国产精品小仙女| 51精品免费网站| 日韩人在线观看| 色丁香婷婷综合久久| 九色精品免费永久在线| 六九午夜精品视频| 日韩精品成人一区二区在线观看| 亚洲国产99| 国产性猛交96| 伊人一区二区三区| 国产精品一级视频| 中文字幕av一区| 经典三级一区二区| 免费看成人av| 国产精品视频久久一区| 四虎精品一区二区| 亚洲亚洲精品在线观看| 国产www视频| 成人97在线观看视频| 亚洲精品大全| 在线不卡视频一区二区| 免费一区二区视频| 欧美 日韩 成人| 色激情天天射综合网| 四虎成人免费在线| 97久久久久久| 羞羞色国产精品网站| 欧美极品欧美精品欧美| www.在线欧美| av黄色在线看| 亚洲美女av在线| 六月婷婷综合| 亚欧精品在线| 久久国产日韩欧美精品| 成人黄色短视频| 欧美日本韩国一区| 黄色小网站在线观看| 亚洲综合av影视| 欧美日韩一区二区三区四区在线观看| www.51色.com| 亚洲一区二区在线免费观看视频| 亚洲AV无码精品色毛片浪潮| 国产最新精品视频| 天堂俺去俺来也www久久婷婷| 久章草在线视频| 中文在线资源观看网站视频免费不卡| 懂色av蜜臀av粉嫩av喷吹| 中文字幕日韩有码| 精品一区二区三区四区五区 | 日本中文字幕一区| 亚洲欧美精品久久| 日韩精品一区二区三区老鸭窝 | 一本加勒比北条麻妃| 在线这里只有精品| 日本中文字幕视频在线| 亚洲一区二区三区四区视频| 亚洲午夜一级| 亚洲精品午夜视频| 宅男噜噜噜66一区二区66| 男女在线视频| 欧美在线日韩精品| 精品一区二区三区免费观看| 国产成人啪精品午夜在线观看| 亚洲男人第一网站| 国产精品亚洲欧美一级在线 | 成人激情免费电影网址| 国产伦精品一区二区三区视频我| 最新中文字幕亚洲| а√中文在线天堂精品| 日韩欧美视频网站| 一色屋精品亚洲香蕉网站| 男人的天堂a在线| 国产精品高潮在线| 精品av久久久久电影| 亚洲av毛片基地| 精品粉嫩aⅴ一区二区三区四区 | 欧美日韩一区精品| 欧美人与禽猛交乱配| 日韩高清dvd| 成人一区在线看| 亚洲性在线观看| 91高清视频免费| 欧美在线亚洲| 精品一区二区6| 日韩国产精品亚洲а∨天堂免| www.久久99| 欧美精品成人网|