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

原來 8 張圖,就能學廢 Reactor 和 Proactor

網絡 通信技術
別小看這兩個東西,特別是 Reactor 模式,市面上常見的開源軟件很多都采用了這個方案,比如 Redis、Nginx、Netty 等等,所以學好這個模式設計的思想,不僅有助于我們理解很多開源軟件,而且也能在面試時吹逼。

 [[395961]]

本文轉載自微信公眾號「小林coding」,作者小林coding 。轉載本文請聯系小林coding公眾號。

小林,來了。

這次就來圖解 Reactor 和 Proactor 這兩個高性能網絡模式。

別小看這兩個東西,特別是 Reactor 模式,市面上常見的開源軟件很多都采用了這個方案,比如 Redis、Nginx、Netty 等等,所以學好這個模式設計的思想,不僅有助于我們理解很多開源軟件,而且也能在面試時吹逼。

發車!

演進

如果要讓服務器服務多個客戶端,那么最直接的方式就是為每一條連接創建線程。

其實創建進程也是可以的,原理是一樣的,進程和線程的區別在于線程比較輕量級些,線程的創建和線程間切換的成本要小些,為了描述簡述,后面都以線程為例。

處理完業務邏輯后,隨著連接關閉后線程也同樣要銷毀了,但是這樣不停地創建和銷毀線程,不僅會帶來性能開銷,也會造成浪費資源,而且如果要連接幾萬條連接,創建幾萬個線程去應對也是不現實的。

要這么解決這個問題呢?我們可以使用「資源復用」的方式。

也就是不用再為每個連接創建線程,而是創建一個「線程池」,將連接分配給線程,然后一個線程可以處理多個連接的業務。

不過,這樣又引來一個新的問題,線程怎樣才能高效地處理多個連接的業務?

當一個連接對應一個線程時,線程一般采用「read -> 業務處理 -> send」的處理流程,如果當前連接沒有數據可讀,那么線程會阻塞在 read 操作上( socket 默認情況是阻塞 I/O),不過這種阻塞方式并不影響其他線程。

但是引入了線程池,那么一個線程要處理多個連接的業務,線程在處理某個連接的 read 操作時,如果遇到沒有數據可讀,就會發生阻塞,那么線程就沒辦法繼續處理其他連接的業務。

要解決這一個問題,最簡單的方式就是將 socket 改成非阻塞,然后線程不斷地輪詢調用 read 操作來判斷是否有數據,這種方式雖然該能夠解決阻塞的問題,但是解決的方式比較粗暴,因為輪詢是要消耗 CPU 的,而且隨著一個 線程處理的連接越多,輪詢的效率就會越低。

上面的問題在于,線程并不知道當前連接是否有數據可讀,從而需要每次通過 read 去試探。

那有沒有辦法在只有當連接上有數據的時候,線程才去發起讀請求呢?答案是有的,實現這一技術的就是 I/O 多路復用。

I/O 多路復用技術會用一個系統調用函數來監聽我們所有關心的連接,也就說可以在一個監控線程里面監控很多的連接。

我們熟悉的 select/poll/epoll 就是內核提供給用戶態的多路復用系統調用,線程可以通過一個系統調用函數從內核中獲取多個事件。

PS:如果想知道 select/poll/epoll 的區別,可以看看小林之前寫的這篇文章:這次答應我,一舉拿下 I/O 多路復用!

select/poll/epoll 是如何獲取網絡事件的呢?

在獲取事件時,先把我們要關心的連接傳給內核,再由內核檢測:

  • 如果沒有事件發生,線程只需阻塞在這個系統調用,而無需像前面的線程池方案那樣輪訓調用 read 操作來判斷是否有數據。
  • 如果有事件發生,內核會返回產生了事件的連接,線程就會從阻塞狀態返回,然后在用戶態中再處理這些連接對應的業務即可。

當下開源軟件能做到網絡高性能的原因就是 I/O 多路復用嗎?

是的,基本是基于 I/O 多路復用,用過 I/O 多路復用接口寫網絡程序的同學,肯定知道是面向過程的方式寫代碼的,這樣的開發的效率不高。

于是,大佬們基于面向對象的思想,對 I/O 多路復用作了一層封裝,讓使用者不用考慮底層網絡 API 的細節,只需要關注應用代碼的編寫。

大佬們還為這種模式取了個讓人第一時間難以理解的名字:Reactor 模式。

Reactor 翻譯過來的意思是「反應堆」,可能大家會聯想到物理學里的核反應堆,實際上并不是的這個意思。

這里的反應指的是「對事件反應」,也就是來了一個事件,Reactor 就有相對應的反應/響應。

事實上,Reactor 模式也叫 Dispatcher 模式,我覺得這個名字更貼合該模式的含義,即 I/O 多路復用監聽事件,收到事件后,根據事件類型分配(Dispatch)給某個進程 / 線程。

Reactor 模式主要由 Reactor 和處理資源池這兩個核心部分組成,它倆負責的事情如下:

Reactor 負責監聽和分發事件,事件類型包含連接事件、讀寫事件;

處理資源池負責處理事件,如 read -> 業務邏輯 -> send;

Reactor 模式是靈活多變的,可以應對不同的業務場景,靈活在于:

Reactor 的數量可以只有一個,也可以有多個;

處理資源池可以是單個進程 / 線程,也可以是多個進程 /線程;

將上面的兩個因素排列組設一下,理論上就可以有 4 種方案選擇:

  • 單 Reactor 單進程 / 線程;
  • 單 Reactor 多進程 / 線程;
  • 多 Reactor 單進程 / 線程;
  • 多 Reactor 多進程 / 線程;

其中,「多 Reactor 單進程 / 線程」實現方案相比「單 Reactor 單進程 / 線程」方案,不僅復雜而且也沒有性能優勢,因此實際中并沒有應用。

剩下的 3 個方案都是比較經典的,且都有應用在實際的項目中:

  • 單 Reactor 單進程 / 線程;
  • 單 Reactor 多線程 / 進程;
  • 多 Reactor 多進程 / 線程;

方案具體使用進程還是線程,要看使用的編程語言以及平臺有關:

  • Java 語言一般使用線程,比如 Netty;
  • C 語言使用進程和線程都可以,例如 Nginx 使用的是進程,Memcache 使用的是線程。

接下來,分別介紹這三個經典的 Reactor 方案。

Reactor

單 Reactor 單進程 / 線程

一般來說,C 語言實現的是「單 Reactor 單進程」的方案,因為 C 語編寫完的程序,運行后就是一個獨立的進程,不需要在進程中再創建線程。

而 Java 語言實現的是「單 Reactor 單線程」的方案,因為 Java 程序是跑在 Java 虛擬機這個進程上面的,虛擬機中有很多線程,我們寫的 Java 程序只是其中的一個線程而已。

我們來看看「單 Reactor 單進程」的方案示意圖:

可以看到進程里有 Reactor、Acceptor、Handler 這三個對象:

  • Reactor 對象的作用是監聽和分發事件;
  • Acceptor 對象的作用是獲取連接;
  • Handler 對象的作用是處理業務;

對象里的 select、accept、read、send 是系統調用函數,dispatch 和 「業務處理」是需要完成的操作,其中 dispatch 是分發事件操作。

接下來,介紹下「單 Reactor 單進程」這個方案:

  • Reactor 對象通過 select (IO 多路復用接口) 監聽事件,收到事件后通過 dispatch 進行分發,具體分發給 Acceptor 對象還是 Handler 對象,還要看收到的事件類型;
  • 如果是連接建立的事件,則交由 Acceptor 對象進行處理,Acceptor 對象會通過 accept 方法 獲取連接,并創建一個 Handler 對象來處理后續的響應事件;
  • 如果不是連接建立事件, 則交由當前連接對應的 Handler 對象來進行響應;
  • Handler 對象通過 read -> 業務處理 -> send 的流程來完成完整的業務流程。

單 Reactor 單進程的方案因為全部工作都在同一個進程內完成,所以實現起來比較簡單,不需要考慮進程間通信,也不用擔心多進程競爭。

但是,這種方案存在 2 個缺點:

  • 第一個缺點,因為只有一個進程,無法充分利用 多核 CPU 的性能;
  • 第二個缺點,Handler 對象在業務處理時,整個進程是無法處理其他連接的事件的,如果業務處理耗時比較長,那么就造成響應的延遲;

所以,單 Reactor 單進程的方案不適用計算機密集型的場景,只適用于業務處理非常快速的場景。

Redis 是由 C 語言實現的,它采用的正是「單 Reactor 單進程」的方案,因為 Redis 業務處理主要是在內存中完成,操作的速度是很快的,性能瓶頸不在 CPU 上,所以 Redis 對于命令的處理是單進程的方案。

單 Reactor 多線程 / 多進程

如果要克服「單 Reactor 單線程 / 進程」方案的缺點,那么就需要引入多線程 / 多進程,這樣就產生了單 Reactor 多線程 / 多進程的方案。

聞其名不如看其圖,先來看看「單 Reactor 多線程」方案的示意圖如下:

詳細說一下這個方案:

  • Reactor 對象通過 select (IO 多路復用接口) 監聽事件,收到事件后通過 dispatch 進行分發,具體分發給 Acceptor 對象還是 Handler 對象,還要看收到的事件類型;
  • 如果是連接建立的事件,則交由 Acceptor 對象進行處理,Acceptor 對象會通過 accept 方法 獲取連接,并創建一個 Handler 對象來處理后續的響應事件;
  • 如果不是連接建立事件, 則交由當前連接對應的 Handler 對象來進行響應;

上面的三個步驟和單 Reactor 單線程方案是一樣的,接下來的步驟就開始不一樣了:

  • Handler 對象不再負責業務處理,只負責數據的接收和發送,Handler 對象通過 read 讀取到數據后,會將數據發給子線程里的 Processor 對象進行業務處理;
  • 子線程里的 Processor 對象就進行業務處理,處理完后,將結果發給主線程中的 Handler 對象,接著由 Handler 通過 send 方法將響應結果發送給 client;

單 Reator 多線程的方案優勢在于能夠充分利用多核 CPU 的能,那既然引入多線程,那么自然就帶來了多線程競爭資源的問題。

例如,子線程完成業務處理后,要把結果傳遞給主線程的 Reactor 進行發送,這里涉及共享數據的競爭。

要避免多線程由于競爭共享資源而導致數據錯亂的問題,就需要在操作共享資源前加上互斥鎖,以保證任意時間里只有一個線程在操作共享資源,待該線程操作完釋放互斥鎖后,其他線程才有機會操作共享數據。

聊完單 Reactor 多線程的方案,接著來看看單 Reactor 多進程的方案。

事實上,單 Reactor 多進程相比單 Reactor 多線程實現起來很麻煩,主要因為要考慮子進程 <-> 父進程的雙向通信,并且父進程還得知道子進程要將數據發送給哪個客戶端。

而多線程間可以共享數據,雖然要額外考慮并發問題,但是這遠比進程間通信的復雜度低得多,因此實際應用中也看不到單 Reactor 多進程的模式。

另外,「單 Reactor」的模式還有個問題,因為一個 Reactor 對象承擔所有事件的監聽和響應,而且只在主線程中運行,在面對瞬間高并發的場景時,容易成為性能的瓶頸的地方。

多 Reactor 多進程 / 線程

要解決「單 Reactor」的問題,就是將「單 Reactor」實現成「多 Reactor」,這樣就產生了第 多 Reactor 多進程 / 線程的方案。

老規矩,聞其名不如看其圖。多 Reactor 多進程 / 線程方案的示意圖如下(以線程為例):

方案詳細說明如下:

  • 主線程中的 MainReactor 對象通過 select 監控連接建立事件,收到事件后通過 Acceptor 對象中的 accept 獲取連接,將新的連接分配給某個子線程;
  • 子線程中的 SubReactor 對象將 MainReactor 對象分配的連接加入 select 繼續進行監聽,并創建一個 Handler 用于處理連接的響應事件。
  • 如果有新的事件發生時,SubReactor 對象會調用當前連接對應的 Handler 對象來進行響應。
  • Handler 對象通過 read -> 業務處理 -> send 的流程來完成完整的業務流程。

多 Reactor 多線程的方案雖然看起來復雜的,但是實際實現時比單 Reactor 多線程的方案要簡單的多,原因如下:

  • 主線程和子線程分工明確,主線程只負責接收新連接,子線程負責完成后續的業務處理。
  • 主線程和子線程的交互很簡單,主線程只需要把新連接傳給子線程,子線程無須返回數據,直接就可以在子線程將處理結果發送給客戶端。

大名鼎鼎的兩個開源軟件 Netty 和 Memcache 都采用了「多 Reactor 多線程」的方案。

采用了「多 Reactor 多進程」方案的開源軟件是 Nginx,不過方案與標準的多 Reactor 多進程有些差異。

具體差異表現在主進程中僅僅用來初始化 socket,并沒有創建 mainReactor 來 accept 連接,而是由子進程的 Reactor 來 accept 連接,通過鎖來控制一次只有一個子進程進行 accept(防止出現驚群現象),子進程 accept 新連接后就放到自己的 Reactor 進行處理,不會再分配給其他子進程。

Proactor

前面提到的 Reactor 是非阻塞同步網絡模式,而 Proactor 是異步網絡模式。

這里先給大家復習下阻塞、非阻塞、同步、異步 I/O 的概念。

先來看看阻塞 I/O,當用戶程序執行 read ,線程會被阻塞,一直等到內核數據準備好,并把數據從內核緩沖區拷貝到應用程序的緩沖區中,當拷貝過程完成,read 才會返回。

注意,阻塞等待的是「內核數據準備好」和「數據從內核態拷貝到用戶態」這兩個過程。過程如下圖:

阻塞 I/O

知道了阻塞 I/O ,來看看非阻塞 I/O,非阻塞的 read 請求在數據未準備好的情況下立即返回,可以繼續往下執行,此時應用程序不斷輪詢內核,直到數據準備好,內核將數據拷貝到應用程序緩沖區,read 調用才可以獲取到結果。過程如下圖:

非阻塞 I/O

注意,這里最后一次 read 調用,獲取數據的過程,是一個同步的過程,是需要等待的過程。這里的同步指的是內核態的數據拷貝到用戶程序的緩存區這個過程。

舉個例子,如果 socket 設置了 O_NONBLOCK 標志,那么就表示使用的是非阻塞 I/O 的方式訪問,而不做任何設置的話,默認是阻塞 I/O。

因此,無論 read 和 send 是阻塞 I/O,還是非阻塞 I/O 都是同步調用。因為在 read 調用時,內核將數據從內核空間拷貝到用戶空間的過程都是需要等待的,也就是說這個過程是同步的,如果內核實現的拷貝效率不高,read 調用就會在這個同步過程中等待比較長的時間。

而真正的異步 I/O 是「內核數據準備好」和「數據從內核態拷貝到用戶態」這兩個過程都不用等待。

當我們發起 aio_read (異步 I/O) 之后,就立即返回,內核自動將數據從內核空間拷貝到用戶空間,這個拷貝過程同樣是異步的,內核自動完成的,和前面的同步操作不一樣,應用程序并不需要主動發起拷貝動作。過程如下圖:

異步 I/O

舉個你去飯堂吃飯的例子,你好比應用程序,飯堂好比操作系統。

阻塞 I/O 好比,你去飯堂吃飯,但是飯堂的菜還沒做好,然后你就一直在那里等啊等,等了好長一段時間終于等到飯堂阿姨把菜端了出來(數據準備的過程),但是你還得繼續等阿姨把菜(內核空間)打到你的飯盒里(用戶空間),經歷完這兩個過程,你才可以離開。

非阻塞 I/O 好比,你去了飯堂,問阿姨菜做好了沒有,阿姨告訴你沒,你就離開了,過幾十分鐘,你又來飯堂問阿姨,阿姨說做好了,于是阿姨幫你把菜打到你的飯盒里,這個過程你是得等待的。

異步 I/O 好比,你讓飯堂阿姨將菜做好并把菜打到飯盒里后,把飯盒送到你面前,整個過程你都不需要任何等待。

很明顯,異步 I/O 比同步 I/O 性能更好,因為異步 I/O 在「內核數據準備好」和「數據從內核空間拷貝到用戶空間」這兩個過程都不用等待。

Proactor 正是采用了異步 I/O 技術,所以被稱為異步網絡模型。

現在我們再來理解 Reactor 和 Proactor 的區別,就比較清晰了。

  • Reactor 是非阻塞同步網絡模式,感知的是就緒可讀寫事件。在每次感知到有事件發生(比如可讀就緒事件)后,就需要應用進程主動調用 read 方法來完成數據的讀取,也就是要應用進程主動將 socket 接收緩存中的數據讀到應用進程內存中,這個過程是同步的,讀取完數據后應用進程才能處理數據。
  • Proactor 是異步網絡模式, 感知的是已完成的讀寫事件。在發起異步讀寫請求時,需要傳入數據緩沖區的地址(用來存放結果數據)等信息,這樣系統內核才可以自動幫我們把數據的讀寫工作完成,這里的讀寫工作全程由操作系統來做,并不需要像 Reactor 那樣還需要應用進程主動發起 read/write 來讀寫數據,操作系統完成讀寫工作后,就會通知應用進程直接處理數據。

因此,Reactor 可以理解為「來了事件操作系統通知應用進程,讓應用進程來處理」,而 Proactor 可以理解為「來了事件操作系統來處理,處理完再通知應用進程」。這里的「事件」就是有新連接、有數據可讀、有數據可寫的這些 I/O 事件這里的「處理」包含從驅動讀取到內核以及從內核讀取到用戶空間。

舉個實際生活中的例子,Reactor 模式就是快遞員在樓下,給你打電話告訴你快遞到你家小區了,你需要自己下樓來拿快遞。而在 Proactor 模式下,快遞員直接將快遞送到你家門口,然后通知你。

無論是 Reactor,還是 Proactor,都是一種基于「事件分發」的網絡編程模式,區別在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式則是基于「已完成」的 I/O 事件。

接下來,一起看看 Proactor 模式的示意圖:

介紹一下 Proactor 模式的工作流程:

  • Proactor Initiator 負責創建 Proactor 和 Handler 對象,并將 Proactor 和 Handler 都通過
  • Asynchronous Operation Processor 注冊到內核;
  • Asynchronous Operation Processor 負責處理注冊請求,并處理 I/O 操作;
  • Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor;
  • Proactor 根據不同的事件類型回調不同的 Handler 進行業務處理;
  • Handler 完成業務處理;

可惜的是,在 Linux 下的異步 I/O 是不完善的,

aio 系列函數是由 POSIX 定義的異步操作接口,不是真正的操作系統級別支持的,而是在用戶空間模擬出來的異步,并且僅僅支持基于本地文件的 aio 異步操作,網絡編程中的 socket 是不支持的,這也使得基于 Linux 的高性能網絡程序都是使用 Reactor 方案。

而 Windows 里實現了一套完整的支持 socket 的異步編程接口,這套接口就是 IOCP,是由操作系統級別實現的異步 I/O,真正意義上異步 I/O,因此在 Windows 里實現高性能網絡程序可以使用效率更高的 Proactor 方案。

總結

常見的 Reactor 實現方案有三種。

第一種方案單 Reactor 單進程 / 線程,不用考慮進程間通信以及數據同步的問題,因此實現起來比較簡單,這種方案的缺陷在于無法充分利用多核 CPU,而且處理業務邏輯的時間不能太長,否則會延遲響應,所以不適用于計算機密集型的場景,適用于業務處理快速的場景,比如 Redis 采用的是單 Reactor 單進程的方案。

第二種方案單 Reactor 多線程,通過多線程的方式解決了方案一的缺陷,但它離高并發還差一點距離,差在只有一個 Reactor 對象來承擔所有事件的監聽和響應,而且只在主線程中運行,在面對瞬間高并發的場景時,容易成為性能的瓶頸的地方。

第三種方案多 Reactor 多進程 / 線程,通過多個 Reactor 來解決了方案二的缺陷,主 Reactor 只負責監聽事件,響應事件的工作交給了從 Reactor,Netty 和 Memcache 都采用了「多 Reactor 多線程」的方案,Nginx 則采用了類似于 「多 Reactor 多進程」的方案。

Reactor 可以理解為「來了事件操作系統通知應用進程,讓應用進程來處理」,而 Proactor 可以理解為「來了事件操作系統來處理,處理完再通知應用進程」。

因此,真正的大殺器還是 Proactor,它是采用異步 I/O 實現的異步網絡模型,感知的是已完成的讀寫事件,而不需要像 Reactor 感知到事件后,還需要調用 read 來從內核中獲取數據。

不過,無論是 Reactor,還是 Proactor,都是一種基于「事件分發」的網絡編程模式,區別在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式則是基于「已完成」的 I/O 事件。

參考資料

https://cloud.tencent.com/developer/article/1373468

https://blog.csdn.net/qq_27788177/article/details/98108466

https://time.geekbang.org/column/article/8805

https://www.cnblogs.com/crazymakercircle/p/9833847.html

 

責任編輯:武曉燕 來源: 小林coding
相關推薦

2024-08-16 21:30:00

IO網絡網絡通信

2015-07-13 10:23:23

Java圖解

2024-09-02 08:00:00

2011-03-31 10:41:49

BIONIOIO

2021-03-19 08:19:50

MySQL數據庫自定義變量

2010-07-14 10:17:14

MyEclipse漢化

2020-08-12 07:44:57

存儲結構

2021-10-19 18:22:50

Map 注冊表源碼

2021-03-08 09:52:55

架構運維技術

2025-07-25 14:59:13

AI模型視頻生成

2018-03-09 14:59:02

F5應用交付

2020-11-24 09:46:50

算法開源視頻

2020-11-13 10:29:37

流程控制語句

2022-02-12 11:00:33

FTP網絡協議文件傳輸

2021-09-14 23:05:47

Nginx前端運維

2022-02-11 20:45:42

HTTPHTTPS協議

2025-08-25 08:48:00

2019-10-15 08:41:37

SpringCloud框架服務器

2021-02-18 09:44:52

MySQL

2021-05-16 08:50:58

數據驅動業務
點贊
收藏

51CTO技術棧公眾號

丰满诱人av在线播放| 国产精品羞羞答答在线| 黑丝美女一区二区| 欧美一级生活片| 欧美日韩精品在线一区二区 | 日韩黄色a级片| 成人区精品一区二区婷婷| 欧美一区二区啪啪| 国模杨依粉嫩蝴蝶150p| av激情在线| 国产午夜精品久久久久久免费视| 国产精品久久久久毛片大屁完整版 | 狂野欧美性猛交xxxx巴西| zzijzzij亚洲日本成熟少妇| 喷水视频在线观看| 高清不卡一区| 欧美在线免费视屏| 欧美日韩精品在线一区二区| 成人片在线看| 欧美激情一区二区三区不卡| 国产欧美欧洲| 99久久久无码国产精品免费| 老司机亚洲精品| 久久久久久国产精品三级玉女聊斋| 五月婷婷婷婷婷| 亚洲国产精品嫩草影院久久av| 欧美一区二区女人| 亚洲欧美日韩精品一区| 欧美亚洲韩国| 欧美日韩一区二区免费视频| 男插女免费视频| 69久久夜色| 国产网站一区二区三区| 久久免费99精品久久久久久| 人妻无码中文字幕| 豆国产96在线|亚洲| 成人免费黄色网| 在线视频欧美亚洲| 美女一区二区三区在线观看| 热久久99这里有精品| 久久午夜免费视频| 99av国产精品欲麻豆| 久久久在线观看| 一区二区三区免费高清视频| 欧美xxx在线观看| 久久精品精品电影网| www.涩涩爱| 色偷偷综合网| 日韩有码片在线观看| 美国精品一区二区| 日韩欧美中文| 久久精品国产精品亚洲| 成人在线观看高清| 欧美日韩精品一本二本三本| 欧美另类高清videos| 国产少妇在线观看| 欧美片第1页综合| 久久久久久久国产精品视频| 国产精品变态另类虐交| 99精品国产在热久久| 97色伦亚洲国产| 欧美精品韩国精品| 日韩vs国产vs欧美| 国产日韩精品在线播放| 97人人爽人人爽人人爽| 国产精品资源在线观看| 国产私拍一区| 国产一级在线观看| 国产精品剧情在线亚洲| 免费观看亚洲视频| 俄罗斯一级**毛片在线播放| 午夜不卡av免费| 国产成人精品无码播放| 久久婷婷五月综合色丁香| 91精品啪在线观看国产60岁| 美国黄色一级视频| 亚洲免费专区| 日韩视频免费看| 欧美人妻精品一区二区免费看| 亚洲午夜激情在线| 日本人成精品视频在线| 亚洲视频一区二区三区四区| 国产成人av一区二区三区在线观看| 国产伦精品一区二区三区高清版| 爽爽视频在线观看| 日本一区二区视频在线| 91精品一区二区三区四区| 91超碰在线免费| 欧美午夜一区二区| 亚洲精品成人无码毛片| 国产99久久精品一区二区300| 日韩中文在线视频| 日本在线视频免费观看| 毛片不卡一区二区| 精品国产_亚洲人成在线| a√资源在线| 亚洲444eee在线观看| 亚洲第一中文av| 1204国产成人精品视频| 一区二区欧美在线| 国产无码精品在线播放| 蜜桃视频一区二区三区| 国产精品一区二区三区四区五区| 电影在线一区| 精品久久在线播放| 亚洲图片 自拍偷拍| 国产精品探花在线观看| 欧美黑人xxxⅹ高潮交| 人妻中文字幕一区二区三区| 99这里都是精品| www国产免费| 韩日精品一区| 精品一区二区三区三区| 欧美成人三级在线观看| 麻豆国产精品视频| 欧美主播一区二区三区美女 久久精品人| av电影高清在线观看| 欧美午夜电影网| 国精产品一区一区三区免费视频 | 久久亚洲精品视频| 成人一级免费视频| 91丝袜美腿高跟国产极品老师| 特级西西444| 99久久久成人国产精品| 最近2019中文字幕在线高清| 亚洲综合久久网| av不卡在线观看| 日韩久久久久久久久久久久| 高清久久一区| 久久精品国产欧美亚洲人人爽| 一级一级黄色片| 久久精品水蜜桃av综合天堂| 国产黄色一级网站| 秋霞在线一区| 98精品在线视频| 天天操天天操天天干| 一区二区三区免费| 无码国产精品一区二区高潮| 亚洲深深色噜噜狠狠爱网站| 国产综合福利在线| 麻豆视频免费在线观看| 欧美一区二视频| 天堂网avav| 国产精品888| 草草草视频在线观看| 亚洲超碰在线观看| 久久久久久成人精品| 亚洲狼人综合网| 亚洲午夜久久久久中文字幕久| 美女流白浆视频| 黄色在线成人| 国产在线精品一区| 不卡福利视频| 中文字幕精品在线| 国产麻豆免费视频| 一区二区三区在线免费| 制服丝袜av在线| 国产精品嫩草99av在线| 欧美日韩在线高清| 久久精品国产精品亚洲毛片| 久久精品视频免费播放| 国产不卡av在线播放| 亚洲永久免费视频| 免费成人蒂法网站| 日本一不卡视频| 在线免费观看成人| 亚洲国产视频二区| 7777免费精品视频| 成人激情电影在线看| 777a∨成人精品桃花网| 国产精品1234区| 国产亚洲欧美日韩日本| 久久精品国产露脸对白| 激情欧美日韩一区| 欧美日本韩国国产| 亚洲欧美在线综合| 午夜精品视频网站| eeuss影院www在线观看| 日韩欧美成人一区| 日韩黄色在线播放| 中文字幕亚洲欧美在线不卡| 97人妻精品一区二区三区免费| 久久精品动漫| 中国一级大黄大黄大色毛片| 欧美调教网站| 91精品国产自产在线老师啪| 91在线三级| 日韩一区二区三区xxxx| 婷婷五月综合久久中文字幕| 欧美性受xxxx| 国产稀缺真实呦乱在线| 国产精品久久久久久久久免费桃花 | 亚洲女同精品视频| 国产美女自慰在线观看| 欧美视频不卡中文| 在线免费日韩av| 国产婷婷一区二区| 丰满人妻一区二区三区免费视频棣| 久久亚洲电影| a级黄色小视频| 天天av综合| 欧美午夜精品久久久久久蜜| 视频一区日韩| 成人国内精品久久久久一区| 韩国美女久久| 久久久之久亚州精品露出| 在线免费观看黄| 日韩av中文字幕在线播放| 99久久精品国产色欲| 日本福利一区二区| 久久免费播放视频| 中文字幕一区二区三区不卡| 亚洲专区区免费| 成人亚洲一区二区一| 九一精品久久久| 青椒成人免费视频| 免费观看日韩毛片| 亚洲看片一区| 毛片av在线播放| 亚洲理论电影网| 性欧美videosex高清少妇| 校园春色另类视频| 国产视色精品亚洲一区二区| jizzjizzjizz欧美| 不卡一区二区三区视频| crdy在线观看欧美| 国产精品色午夜在线观看| 欧美黑人疯狂性受xxxxx野外| 97国产一区二区精品久久呦 | 精品国产乱码久久久久夜深人妻| 精品伊人久久久久7777人| 亚洲综合色在线观看| 日本在线播放一区二区三区| 亚欧在线免费观看| 视频一区二区三区中文字幕| 久久美女福利视频| 国产精品腿扒开做爽爽爽挤奶网站| 欧美精品久久久久久久久久久| 欧美在线首页| 欧美视频在线第一页| 中文字幕一区二区三区乱码图片| 欧美aaa在线观看| 久久精品青草| 国产激情在线看| 亚洲无线视频| 成年网站在线免费观看| 六月婷婷一区| 国产aaaaa毛片| 麻豆精品一二三| 91在线第一页| 国产成a人亚洲| 伊人网综合视频| 久久久影视传媒| 国产精品美女高潮无套| 国产精品第13页| 欧美丰满艳妇bbwbbw| 亚洲一区二区在线视频| 日韩成人在线免费视频| 欧美日韩国产综合新一区 | 日韩免费av片| 狠狠躁天天躁日日躁欧美| 无码人妻丰满熟妇区五十路| 欧美性受xxxx黑人xyx性爽| 国产露脸国语对白在线| 日韩精品中文字幕一区| 男生女生差差差的视频在线观看| 中文字幕精品国产| 亚洲小说区图片区都市| 97国产精品久久| 欧美黄色成人| 国产成人成网站在线播放青青| 亚洲视频分类| 中文字幕综合在线观看| 在线精品一区二区| 成人在线免费播放视频| 黑人巨大精品欧美黑白配亚洲| 亚洲精品无码一区二区| 国产欧美一区二区三区网站| 老司机成人免费视频| 欧美日韩国产精品一区二区不卡中文| 成人免费毛片视频| 日韩一区二区三区电影| 奇米影视888狠狠狠777不卡| www.亚洲男人天堂| 国产传媒在线| 成人欧美在线观看| 私拍精品福利视频在线一区| 在线亚洲美日韩| 国产精品社区| 丰满人妻一区二区三区53视频| 久久久三级国产网站| 加勒比av在线播放| 欧美综合色免费| 免费激情视频网站| 久久久精品2019中文字幕神马| 涩涩视频在线免费看| 91午夜理伦私人影院| 国产九一精品| 日韩av中文字幕第一页| 极品少妇一区二区| 黄色短视频在线观看| 一区二区三区四区av| 亚洲精品国产欧美在线观看| 亚洲大尺度美女在线| 国产丝袜在线| 国产成人av网址| 美国成人xxx| av一区二区三区免费观看| 全国精品久久少妇| 丰满少妇一区二区三区| 亚洲一区二区在线免费观看视频 | 中文字幕精品在线播放| 喷水一区二区三区| 精品人妻少妇嫩草av无码| 亚洲一区二区三区中文字幕 | 亚洲加勒比久久88色综合| 国产午夜精品久久久久免费视| 国产精品久久久久福利| 亚洲人成网站77777在线观看| 欧美一级片免费播放| 国产精品一区二区不卡| 一区二区三区四区五区| 欧美日韩在线一区二区| 精品三级久久久久久久电影聊斋| 97国产精品人人爽人人做| 国产欧美三级电影| av在线播放天堂| 国产jizzjizz一区二区| 久久久久久久久久久97| 日韩亚洲欧美中文三级| 97caopor国产在线视频| 成人做爽爽免费视频| 久久日文中文字幕乱码| www.com操| 国产精品黄色在线观看| 亚洲天堂999| 日韩在线视频中文字幕| 日韩黄色碟片| 公共露出暴露狂另类av| 国产精品资源在线| 久久久久成人精品无码| 精品三级在线观看| 国产丝袜在线观看视频| 国产一区二区不卡视频在线观看| 影音先锋在线一区| 亚洲欧美日本一区| 色成年激情久久综合| h视频网站在线观看| 91精品国产自产在线老师啪| 久久精品国内一区二区三区水蜜桃| 在线播放免费视频| 一级做a爱片久久| 人妻妺妺窝人体色www聚色窝| 96精品视频在线| 国产影视一区| jizz18女人| 艳妇臀荡乳欲伦亚洲一区| 欧美一区二区三区黄片| 欧美一区二区三区免费观看| 成人影视亚洲图片在线| 久久精品亚洲天堂| 香蕉乱码成人久久天堂爱免费| 青青视频在线观| 国产精品久久久久久久久久久久| 99re久久最新地址获取| 精产国品一二三区| 精品久久久久久| 1024国产在线| 成人黄色片视频网站| 国产日韩欧美一区二区三区在线观看| 欧美 日韩 国产 成人 在线观看| 欧美电影一区二区三区| 国模雨婷捆绑高清在线| 日本在线高清视频一区| 精品一区二区三区欧美| 日韩av男人天堂| 中文字幕欧美国内| av成人资源网| 精品久久久久久久无码 | 丁香六月激情婷婷| 久久精品夜色噜噜亚洲a∨| h狠狠躁死你h高h| 欧美一区二区三区……| 91成人网在线观看| 91精品国产自产| 337p亚洲精品色噜噜狠狠| 涩涩av在线| 国产人妻人伦精品| 中文字幕成人网| 人妻偷人精品一区二区三区| 国产裸体写真av一区二区 | 欧美综合久久| 久草视频福利在线| 欧美日本在线一区| 成人美女黄网站| 成年人视频网站免费| 国产精品沙发午睡系列990531| 搡老岳熟女国产熟妇| 亚洲va电影大全| 青青草国产成人av片免费|