黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

Apache Tomcat如何高并發處理請求

瀏覽:256日期:2023-03-19 16:51:34
目錄
  • 介紹
  • 接收Socket請求
  • Socket請求輪詢
  • 請求具體處理
  • 總結
  • 參考:

介紹

作為常用的http協議服務器,tomcat應用非常廣泛。tomcat也是遵循Servelt協議的,Servelt協議可以讓服務器與真實服務邏輯代碼進行解耦。各自只需要關注Servlet協議即可。
對于tomcat是如何作為一個高性能的服務器的呢?你是不是也會有這樣的疑問?

tomcat是如何接收網絡請求?

如何做到高性能的http協議服務器?

tomcat從8.0往后開始使用了NIO非阻塞io模型,提高了吞吐量,本文的源碼是tomcat 9.0.48版本

接收Socket請求

org.apache.tomcat.util.net.Acceptor實現了Runnable接口,在一個單獨的線程中以死循環的方式一直進行socket的監聽

線程的初始化及啟動是在方法org.apache.tomcat.util.net.AbstractEndpoint#startAcceptorThread

有個很重要的屬性org.apache.tomcat.util.net.AbstractEndpoint;同時實現了run方法,方法中主要有以下功能:

  • 請求最大連接數限制: 最大為 8*1024;請你注意到達最大連接數后操作系統底層還是會接收客戶端連接,但用戶層已經不再接收
  • 獲取socketChannel
public void run() {int errorDelay = 0;try {    // Loop until we receive a shutdown command    while (!stopCalled) {					...if (stopCalled) {    break;}state = AcceptorState.RUNNING;try {    //if we have reached max connections, wait    // 如果連接超過了 8*1024,則線程阻塞等待; 是使用org.apache.tomcat.util.threads.LimitLatch類實現了分享鎖(內部實現了AbstractQueuedSynchronizer)    // 請你注意到達最大連接數后操作系統底層還是會接收客戶端連接,但用戶層已經不再接收。    endpoint.countUpOrAwaitConnection();    // Endpoint might have been paused while waiting for latch    // If that is the case, don"t accept new connections    if (endpoint.isPaused()) {continue;    }    U socket = null;    try {// Accept the next incoming connection from the server// socket// 抽象方法,不同的endPoint有不同的實現方法。NioEndPoint為例,實現方法為serverSock.accept(),這個方法主要看serverSock實例化時如果為阻塞,accept方法為阻塞;反之為立即返回,如果沒有socket鏈接,則為nullsocket = endpoint.serverSocketAccept();    } catch (Exception ioe) {// We didn"t get a socketendpoint.countDownConnection();if (endpoint.isRunning()) {    // Introduce delay if necessary    errorDelay = handleExceptionWithDelay(errorDelay);    // re-throw    throw ioe;} else {    break;}    }    // Successful accept, reset the error delay    errorDelay = 0;    // Configure the socket    if (!stopCalled && !endpoint.isPaused()) {// setSocketOptions() will hand the socket off to// an appropriate processor if successful// endPoint類的抽象方法,不同的endPoint有不同的實現。處理獲取到的socketChannel鏈接,如果該socket鏈接能正常處理,那么該方法會返回true,否則為falseif (!endpoint.setSocketOptions(socket)) {    endpoint.closeSocket(socket);}    } else {endpoint.destroySocket(socket);    }} catch (Throwable t) {    ...}    }} finally {    stopLatch.countDown();}state = AcceptorState.ENDED;    }

再來看下org.apache.tomcat.util.net.NioEndpoint#setSocketOptions方法的具體實現(NioEndpoint為例)

這個方法中主要做的事:

  • 創建NioChannel
  • 設置socket為非阻塞
  • 將socket添加到Poller的隊列中
 protected boolean setSocketOptions(SocketChannel socket) {NioSocketWrapper socketWrapper = null;try {    // Allocate channel and wrapper    // 優先使用已有的緩存nioChannel    NioChannel channel = null;    if (nioChannels != null) {channel = nioChannels.pop();    }    if (channel == null) {SocketBufferHandler bufhandler = new SocketBufferHandler(socketProperties.getAppReadBufSize(),socketProperties.getAppWriteBufSize(),socketProperties.getDirectBuffer());if (isSSLEnabled()) {    channel = new SecureNioChannel(bufhandler, this);} else {    channel = new NioChannel(bufhandler);}    }    // 將nioEndpoint與NioChannel進行包裝    NioSocketWrapper newWrapper = new NioSocketWrapper(channel, this);    channel.reset(socket, newWrapper);    connections.put(socket, newWrapper);    socketWrapper = newWrapper;    // Set socket properties    // Disable blocking, polling will be used    // 設置當前鏈接的socket為非阻塞    socket.configureBlocking(false);    if (getUnixDomainSocketPath() == null) {socketProperties.setProperties(socket.socket());    }    socketWrapper.setReadTimeout(getConnectionTimeout());    socketWrapper.setWriteTimeout(getConnectionTimeout());    socketWrapper.setKeepAliveLeft(NioEndpoint.this.getMaxKeepAliveRequests());    // 將包裝后的nioChannel與nioEndpoint進行注冊,注冊到Poller,將對應的socket包裝類添加到Poller的隊列中,同時喚醒selector    poller.register(socketWrapper);    return true;} catch (Throwable t) {    ExceptionUtils.handleThrowable(t);    try {log.error(sm.getString("endpoint.socketOptionsError"), t);    } catch (Throwable tt) {ExceptionUtils.handleThrowable(tt);    }    if (socketWrapper == null) {destroySocket(socket);    }}// Tell to close the socket if neededreturn false;    }

Socket請求輪詢

上一小節是接收到了socket請求,進行包裝之后,將socket添加到了Poller的隊列上,并可能喚醒了Selector,本小節就來看看,Poller是如何進行socket的輪詢的。

首先org.apache.tomcat.util.net.NioEndpoint.Poller也是實現了Runnable接口,是一個可以單獨啟動的線程

初始化及啟動是在org.apache.tomcat.util.net.NioEndpoint#startInternal

重要的屬性:

  • java.nio.channels.Selector:在Poller對象初始化的時候,就會啟動輪詢器
  • SynchronizedQueue<PollerEvent>:同步的事件隊列

再來看下具體處理邏輯,run方法的源碼

		public void run() {    // Loop until destroy() is called    while (true) {boolean hasEvents = false;try {    if (!close) {// 去SynchronizedQueue事件隊列中拉去,看是否已經有了事件,如果有,則返回true// 如果從隊列中拉取到了event(即上一步將NioSocketWrapper封裝為PollerEvent添加到次隊列中),將socketChannel注冊到Selector上,標記為SelectionKey.OP_READ,添加處理函數attachment(為Accetpor添加到Poller時的    // NioSocketWrapper)hasEvents = events();if (wakeupCounter.getAndSet(-1) > 0) {    // If we are here, means we have other stuff to do    // Do a non blocking select    keyCount = selector.selectNow();} else {    keyCount = selector.select(selectorTimeout);}wakeupCounter.set(0);    }    if (close) {events();timeout(0, false);try {    selector.close();} catch (IOException ioe) {    log.error(sm.getString("endpoint.nio.selectorCloseFail"), ioe);}break;    }    // Either we timed out or we woke up, process events first    if (keyCount == 0) {hasEvents = (hasEvents | events());    }} catch (Throwable x) {    ExceptionUtils.handleThrowable(x);    log.error(sm.getString("endpoint.nio.selectorLoopError"), x);    continue;}Iterator<SelectionKey> iterator =    keyCount > 0 ? selector.selectedKeys().iterator() : null;// Walk through the collection of ready keys and dispatch// any active event.// selector輪詢獲取已經注冊的事件,如果有事件準備好,此時通過selectKeys方法就能拿到對應的事件while (iterator != null && iterator.hasNext()) {    SelectionKey sk = iterator.next();    // 獲取到事件后,從迭代器刪除事件,防止事件重復輪詢    iterator.remove();    // 獲取事件的處理器,這個attachment是在event()方法中注冊的,后續這個事件的處理,就交給這個wrapper去處理    NioSocketWrapper socketWrapper = (NioSocketWrapper) sk.attachment();    // Attachment may be null if another thread has called    // cancelledKey()    if (socketWrapper != null) {processKey(sk, socketWrapper);    }}// Process timeoutstimeout(keyCount,hasEvents);    }    getStopLatch().countDown();}

在這里,有一個很重要的方法,org.apache.tomcat.util.net.NioEndpoint.Poller#events(),他是從Poller的事件隊列中獲取Acceptor接收到的可用socket,并將其注冊到Selector

		/** * Processes events in the event queue of the Poller. * * @return <code>true</code> if some events were processed, *   <code>false</code> if queue was empty */public boolean events() {    boolean result = false;    PollerEvent pe = null;    // 如果Acceptor將socket添加到隊列中,那么events.poll()方法就能拿到對應的事件,否則拿不到就返回false    for (int i = 0, size = events.size(); i < size && (pe = events.poll()) != null; i++ ) {result = true;NioSocketWrapper socketWrapper = pe.getSocketWrapper();SocketChannel sc = socketWrapper.getSocket().getIOChannel();int interestOps = pe.getInterestOps();if (sc == null) {    log.warn(sm.getString("endpoint.nio.nullSocketChannel"));    socketWrapper.close();} else if (interestOps == OP_REGISTER) {    // 如果是Acceptor剛添加到隊列中的事件,那么此時的ops就是OP_REGISTER    try {,// 將次socket注冊到selector上,標記為OP_READ事件,添加事件觸發時處理函數socketWrappersc.register(getSelector(), SelectionKey.OP_READ, socketWrapper);    } catch (Exception x) {log.error(sm.getString("endpoint.nio.registerFail"), x);    }} else {    // ??這里的邏輯,不清楚什么情況下會進入到這個分支里面    final SelectionKey key = sc.keyFor(getSelector());    if (key == null) {// The key was cancelled (e.g. due to socket closure)// and removed from the selector while it was being// processed. Count down the connections at this point// since it won"t have been counted down when the socket// closed.socketWrapper.close();    } else {final NioSocketWrapper attachment = (NioSocketWrapper) key.attachment();if (attachment != null) {    // We are registering the key to start with, reset the fairness counter.    try {int ops = key.interestOps() | interestOps;attachment.interestOps(ops);key.interestOps(ops);    } catch (CancelledKeyException ckx) {cancelledKey(key, socketWrapper);    }} else {    cancelledKey(key, socketWrapper);}    }}if (running && !paused && eventCache != null) {    pe.reset();    eventCache.push(pe);}    }    return result;}

還有一個重要方法就是org.apache.tomcat.util.net.NioEndpoint.Poller#processKey,上一個方法是獲取event,并注冊到selector,那這個方法就是通過Selector獲取到的數據準備好的event,并開始封裝成對應的業務處理線程SocketProcessorBase,扔到線程池里開始處理

	    protected void processKey(SelectionKey sk, NioSocketWrapper socketWrapper) {    try {if (close) {    cancelledKey(sk, socketWrapper);} else if (sk.isValid()) {    if (sk.isReadable() || sk.isWritable()) {if (socketWrapper.getSendfileData() != null) {    processSendfile(sk, socketWrapper, false);} else {    unreg(sk, socketWrapper, sk.readyOps());    boolean closeSocket = false;    // Read goes before write    if (sk.isReadable()) {//這里如果是異步的操作,就會走這里if (socketWrapper.readOperation != null) {    if (!socketWrapper.readOperation.process()) {closeSocket = true;    }} else if (socketWrapper.readBlocking) {    // readBlocking默認為false    synchronized (socketWrapper.readLock) {socketWrapper.readBlocking = false;socketWrapper.readLock.notify();    }} else if (!processSocket(socketWrapper, SocketEvent.OPEN_READ, true)) {    // 處理正常的事件,這里的processSocket就要正式開始處理請求了。    // 將對應的事件封裝成對應的線程,然后交給線程池去處理正式的請求業務    closeSocket = true;}    }    if (!closeSocket && sk.isWritable()) {if (socketWrapper.writeOperation != null) {    if (!socketWrapper.writeOperation.process()) {closeSocket = true;    }} else if (socketWrapper.writeBlocking) {    synchronized (socketWrapper.writeLock) {socketWrapper.writeBlocking = false;socketWrapper.writeLock.notify();    }} else if (!processSocket(socketWrapper, SocketEvent.OPEN_WRITE, true)) {    closeSocket = true;}    }    if (closeSocket) {cancelledKey(sk, socketWrapper);    }}    }} else {    // Invalid key    cancelledKey(sk, socketWrapper);}    } catch (CancelledKeyException ckx) {cancelledKey(sk, socketWrapper);    } catch (Throwable t) {ExceptionUtils.handleThrowable(t);log.error(sm.getString("endpoint.nio.keyProcessingError"), t);    }}

請求具體處理

上一步,Selector獲取到了就緒的請求socket,然后根據socket注冊的觸發處理函數等,將這些數據進行封裝,扔到了線程池里,開始具體的業務邏輯處理。本節就是從工作線程封裝開始,org.apache.tomcat.util.net.SocketProcessorBase為工作線程類的抽象類,實現了Runnable接口,不同的Endpoint實現具體的處理邏輯,本節以NioEndpoint為例

以下為org.apache.tomcat.util.net.AbstractEndpoint#processSocket方法源碼

    /**     * Process the given SocketWrapper with the given status. Used to trigger     * processing as if the Poller (for those endpoints that have one)     * selected the socket.     *     * @param socketWrapper The socket wrapper to process     * @param event The socket event to be processed     * @param dispatch      Should the processing be performed on a new     *  container thread     *     * @return if processing was triggered successfully     */    public boolean processSocket(SocketWrapperBase<S> socketWrapper,    SocketEvent event, boolean dispatch) {try {    if (socketWrapper == null) {return false;    }    // 優先使用已經存在的線程    SocketProcessorBase<S> sc = null;    if (processorCache != null) {sc = processorCache.pop();    }    if (sc == null) {sc = createSocketProcessor(socketWrapper, event);    } else {sc.reset(socketWrapper, event);    }    // 獲取線程池。線程池的初始化,是在Acceptor、Poller這兩個單獨線程啟動之前創建    // tomcat使用了自定義的org.apache.tomcat.util.threads.TaskQueue,這塊tomcat也進行了小的適配開發    // 核心線程為10個,最大200線程    Executor executor = getExecutor();    if (dispatch && executor != null) {executor.execute(sc);    } else {sc.run();    }} catch (RejectedExecutionException ree) {    getLog().warn(sm.getString("endpoint.executor.fail", socketWrapper) , ree);    return false;} catch (Throwable t) {    ExceptionUtils.handleThrowable(t);    // This means we got an OOM or similar creating a thread, or that    // the pool and its queue are full    getLog().error(sm.getString("endpoint.process.fail"), t);    return false;}return true;    }

上面的方法是得到了處理業務邏輯的線程SocketProcessorBase,NioEndpoint內部類org.apache.tomcat.util.net.NioEndpoint.SocketProcessor繼承了這個抽象類,也就是具體的業務處理邏輯在org.apache.tomcat.util.net.NioEndpoint.SocketProcessor#doRun方法中,最終調用到我們的Servlet

protected void doRun() {    /*     * Do not cache and re-use the value of socketWrapper.getSocket() in     * this method. If the socket closes the value will be updated to     * CLOSED_NIO_CHANNEL and the previous value potentially re-used for     * a new connection. That can result in a stale cached value which     * in turn can result in unintentionally closing currently active     * connections.     */    Poller poller = NioEndpoint.this.poller;    if (poller == null) {socketWrapper.close();return;    }    try {int handshake = -1;try {    // 握手相關判斷邏輯   ... } catch (IOException x) {  ...}// 三次握手成功了if (handshake == 0) {    SocketState state = SocketState.OPEN;    // Process the request from this socket    // event為SocketEvent.OPEN_READ,這個變量是org.apache.tomcat.util.net.NioEndpoint.Poller#processKey方法賦值    if (event == null) {state = getHandler().process(socketWrapper, SocketEvent.OPEN_READ);    } else {// 這里就開始正式處理請求了state = getHandler().process(socketWrapper, event);    }    if (state == SocketState.CLOSED) {poller.cancelledKey(getSelectionKey(), socketWrapper);    }} else if (handshake == -1 ) {    getHandler().process(socketWrapper, SocketEvent.CONNECT_FAIL);    poller.cancelledKey(getSelectionKey(), socketWrapper);} else if (handshake == SelectionKey.OP_READ){    socketWrapper.registerReadInterest();} else if (handshake == SelectionKey.OP_WRITE){    socketWrapper.registerWriteInterest();}    } catch (CancelledKeyException cx) {poller.cancelledKey(getSelectionKey(), socketWrapper);    } catch (VirtualMachineError vme) {ExceptionUtils.handleThrowable(vme);    } catch (Throwable t) {log.error(sm.getString("endpoint.processing.fail"), t);poller.cancelledKey(getSelectionKey(), socketWrapper);    } finally {socketWrapper = null;event = null;//return to cacheif (running && !paused && processorCache != null) {    processorCache.push(this);}    }}

總結

  • Tomcat是如何接收網絡請求?

    使用java nio的同步非阻塞去進行網絡監聽。

    org.apache.tomcat.util.net.AbstractEndpoint#bindWithCleanup中初始化網絡監聽、SSL

    		{	    ....    serverSock = ServerSocketChannel.open();    socketProperties.setProperties(serverSock.socket());    InetSocketAddress addr = new InetSocketAddress(getAddress(), getPortWithOffset());    // 當應用層面的連接數到達最大值時,操作系統可以繼續接收連接,那么操作系統能繼續接收的最大連接數就是這個隊列長度,可以通過acceptCount 參數配置,默認是 100    serverSock.bind(addr, getAcceptCount());}serverSock.configureBlocking(true); //mimic APR behavior

    org.apache.tomcat.util.net.NioEndpoint#startInternal中初始化業務處理的線程池、連接限制器、Poller線程、Acceptor線程

  • 如何做到高性能的http協議服務器?

    Tomcat把接收連接、檢測 I/O 事件以及處理請求進行了拆分,用不同規模的線程去做對應的事情,這也是tomcat能高并發處理請求的原因。不讓線程阻塞,盡量讓CPU忙起來

  • 是怎么設計的呢?

    通過接口、抽象類等,將不同的處理邏輯拆分,各司其職

    • org.apache.tomcat.util.net.AbstractEndpoint:I/O事件的檢測、處理邏輯都在這個類的實現類里面。使用模板方法,不同的協議有不同的實現方法。NioEndpoint/Nio2Endpoint/AprEndpoint
      • org.apache.tomcat.util.net.NioEndpoint.Poller:引用了java.nio.channels.Selector,內部有個事件隊列,監聽I/O事件具體就是在這里做的
      • org.apache.tomcat.util.net.NioEndpoint.NioSocketWrapper
      • org.apache.tomcat.util.net.NioEndpoint.SocketProcessor: 具體處理請求的線程類

參考:

到此這篇關于Apache Tomcat如何高并發處理請求 的文章就介紹到這了,更多相關Apache Tomcat高并發請求 內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: Tomcat
主站蜘蛛池模板: 中字幕视频在线永久在线观看免费 | 欧美一级免费视频 | 亚洲第一色站 | 狠狠色综合激情丁香五月 | av小四郎最新地址入口 | 久久机热精品 | 欧美成人免费网址 | 99久久婷婷国产精品综合 | 夜夜爽日日澡人人添 | av一区二区三区在线观看 | 一本大道东京热无码视频 | 国产一区二区内射最近更新 | 欧美色婷婷 | 欧美日本精品 | 亚洲91视频 | 真实的国产乱xxxx在线 | 91亚洲精品在线 | 不良网站在线免费观看 | 久久久久久国 | 狂野欧美性猛交免费视频 | 日本黄色美女视频 | 我要看黄色1级片 | 色天天综合网 | 亚洲欧美激情视频 | 亚洲性图av | 大巨胸乳美女做爰视频 | 少妇高潮太爽了中文字幕 | 夜鲁鲁鲁夜夜综合视频 | 欧美日韩精品一区二区在线观看 | 精品国产黄 | 欧美精品少妇 | 蜜臀aⅴ国产精品久久久国产老师 | 国产精品免费av | av青青| 色阁av| 午夜在线成人 | 久久久久久久久免费 | 欧美网站免费 | 性感美女一区 | 在线播放国产一区二区三区 | 国产又大又长又粗 | 明星换脸av一区二区三区网站 | 神马老子午夜 | 欧美精品一区二区久久婷婷 | 欧美精品性生活 | 激情欧美一区 | 韩日午夜在线资源一区二区 | 西方裸体在线观看 | 国产新婚疯狂做爰视频 | 欧美日韩国产成人一区 | aaaaa少妇高潮大片 | 丰满少妇又爽又紧又丰满在线观看 | 国产曰又深又爽免费视频 | 中文字幕高清在线免费播放 | 亚洲婷婷综合久久一本伊一区 | 漂亮瑜伽少妇高潮 | 国产精品99久久免费 | 国产精品久久久久久欧美 | 在线精品一区二区三区 | 五月色婷 | 久久青青草原国产毛片 | 少妇毛片 | 日韩特黄一级欧美毛片特黄 | www国产精| 污污视频在线观看网站 | 久久婷婷国产综合尤物精品 | 亚洲熟女www一区二区三区 | 国产又粗又长又黄的视频 | 美女免费视频网站 | a级老太婆毛片老太婆毛片 a级毛片,黄,免费观看 m | 欧美一区二区三区久久综合 | 少妇饥渴偷公乱h姚蕊 | 性感av在线 | 91美女片黄在线观看成欢阁 | 狠狠色婷婷狠狠狠亚洲综合 | 精品视频在线免费 | 中文字幕免费在线播放 | 成人av免费观看 | 黄色免费大片 | 久久婷婷五月综合色国产香蕉 | av观看在线免费 | 国产成人无遮挡在线视频 | 日韩亚洲欧美一区 | 国产亚洲精品久久久久婷婷瑜伽 | 一级黄色小视频 | 精品人妻无码区在线视频 | 亚洲 一区二区 在线 | 极品美女白嫩呻吟湿淋淋照片 | 亚洲伊人色综合网站小说 | 久久久噜噜噜 | 超碰人人网 | 国产美女高潮流白浆视频 | 亚洲精品白浆高清久久久久久 | 亚洲熟妇av一区 | 久久偷窥视频 | 日韩人妻无码精品久久久不卡 | 国产麻豆影视 | 日本久久久久久久久久久 | 91香蕉视频黄色 | 韩国日本三级在线观看 | 日韩黄视频在线观看 | 久久激情网 | 国产你懂得 | 亚洲午夜爱爱香蕉片 | 午夜精品久久99蜜桃的功能介绍 | 国产黄色在线免费看 | 熟女俱乐部五十路六十路av | 天天摸天天舔 | 国产精品亚洲精品一区二区三区 | 一区二区三区国产在线观看 | 新婚少妇紧窄白嫩av | 一本色道久久99精品综合蜜臀 | 欧美二区在线观看 | 男女做那个的全过程 | 日韩欧美激情视频 | 国产精品久久久一区二区三区 | 欧美激情在线一区二区 | 少妇高潮叫床片一级 | 久久av一区 | 亚洲天堂久久精品 | 欧美日韩亚洲中文字幕二区 | 一天天影影综合网 | 免费jizzjizz在线播放 | 亚洲国产中文字幕 | 天天舔天天插 | 国产精品三级在线观看无码 | 精品三级视频 | 国产精品人人爽人人爽 | 欧美精品成人一区二区三区四区 | 国产成人av一区二区三区 | 人人看人人草 | 日韩小视频在线观看 | 国产成人 综合 亚洲欧美 | 自拍超碰在线 | 最新精品国偷自产在线 | 天干夜天干夜天天免费视频 | eeuss国产一区二区三区四区 | 麻豆色淫网站av水蜜桃三级 | 人体做爰aaaa免费 | 一二三不卡视频 | 国产白嫩精品又爽又深呻吟 | 青草一区 | 亚洲天堂在线视频播放 | 国产做爰免费观看视频 | 丰满肥臀大屁股熟妇激情视频 | 午夜阳光精品一区二区三区 | 亚洲不卡av不卡一区二区 | 亚洲欧美精品 | 久久精品成人一区二区三区蜜臀 | 国产精品久久久免费 | 天天躁日日躁狠狠躁伊人 | 中国农村妇女hdxxxx | 中文精品久久 | 夜夜看| 国产精品美女视频 | 国产美女裸体无遮挡免费视频 | 99久久精品无免国产免费 | 韩国主播福利一区二区三区 | 精品久久久久久亚洲精品 | 国产中年夫妇交换高潮呻吟 | 在线亚洲天堂 | 91精品视频一区二区三区 | 午夜视频在线免费播放 | 中文字幕123伦 | 性色欲网站人妻丰满中文久久不卡 | 鲁死你av资源站 | 国产亚洲精品久久久久久网站 | 天天做爰裸体免费视频 | 美女三级黄色片 | 成人黄色激情视频 | av中文字幕网址 | 精品国产91久久久久 | beeg日本高清xxxx18 | 国产舌乚八伦偷品w中 | 国产精品国产自产拍高清av | 日韩av地址 | 亚洲一区二区三区四 | 国产精品日本一区二区不卡视频 | youjizz在线视频 | 中文字幕在线观看免费视频 | 成人欧美日韩 | www五月婷婷com| 四川丰满妇女毛片四川话 | 偷拍中国夫妇高潮视频 | 亚洲中文字幕久久精品蜜桃 | 亚洲精品中文字幕无码蜜桃 | 国产真实生活伦对白 | wwwcom国产| 九色九一| 国产一区二区三区四区五区六区 | 91精品视频一区 | 日本美女逼 | 成人性生交大片免费看vr | 久久久久国色av免费观看性色 | 韩日成人 | 日韩国产中文字幕 | 黑人一级黄色片 | 国产亚洲真人做受在线观看 | 色噜噜狠狠色综合av | 欧美日韩一区二区三区69堂 | 人人爽人人爽人人爽 | 女同一区二区免费aⅴ | 嫩草大剧院 | 欧美区一区二 | 免费成人av在线 | 欧洲熟妇色 欧美 | 一边吃奶一边做爰爽到爆视频 | 色噜噜日韩精品欧美一区二区 | 天堂av片| eeuss国产一区二区三区四区 | 亚洲午夜国产一区99re久久 | 久久人人妻人人爽人人爽 | 国产永久免费观看 | 2018天天干天天射 | 国产人妖ts重口系列 | 亚洲小说另类 | 国产黄网永久免费视频大全 | 午夜影院黄 | 三级网站在线看 | 45分钟免费真人视频 | 五月婷婷六月综合 | 国产伦精品一区二区三区视频网站 | av免费网站在线观看 | 真人黄色毛片 | 欧美日韩一区二区三区69堂 | 国产91脚交调教 | 美女穴穴| 亚洲影视在线 | 97在线看免费观看视频在线观看 | 91免费黄色| 91超碰中文字幕久久精品 | 欧美国产日韩一区二区 | 国产91色在线 | 免费 | www.久久久久久久久久 | 免费在线国产视频 | 精品动漫av| 玖玖爱av| 九九热在线播放 | 在线看三级 | 国产女高清在线看免费观看 | 国产极品美女在线精品图片 | 国产小视频在线看 | 波多野结衣黄色网址 | 视频国产一区 | 99久久国产露脸国语对白 | 欧美特黄aaa | 中文字幕狠狠 | 国产视频一区二区 | 日本va欧美va欧美va精品 | 国产区精品一区二区不卡中文 | 日本三级全黄 | 国产裸体永久免费无遮挡 | 国产无吗一区二区三区在线欢 | 男女乱淫真视频免费播放 | 国产大片aaa | 99在线观看精品 | 国产精品久久无码一区 | 色综合久久88色综合天天人守婷 | 成人高清视频在线观看 | 国产在线拍揄自揄视精品按摩 | 国产911视频 | 日本美女毛片 | 天天爱天天做天天爽 | 福利在线视频观看 | 妓女爽爽爽爽爽妓女8888 | 精品伦精品一区二区三区视频 | 国产成人a人亚洲精v品无码 | 天天干天天操天天爽 | 五月天婷婷影院 | 国产无在线观看软件 | 精品少妇一区二区三区日产乱码 | 无套内谢大学处破女www小说 | 五月天激情国产综合婷婷婷 | 亚洲伊人久久精品影院 | 88国产精品视频一区二区三区 | 午夜精品国产精品大乳美女 | 激情区 | 青青草黄色 | 手机在线观看av | 日日摸天天摸爽爽狠狠97 | av中文在线天堂 | 黄在线网站| 91精品国产99久久久久久红楼 | 亚洲一区国产一区 | 夜夜偷影视 | 欧美99精品 | 色噜噜狠狠色综合久 | 国产精品ww| 亚欧av在线| 成年人香蕉视频 | 日韩精品网 | 国产全肉乱妇杂乱视频1 | 午夜私人影院网站 | 粉嫩av一区二区三区在线播放 | 久久婷婷婷 | 粗大的内捧猛烈进出小视频 | 蜜桃视频在线观看免费视频网站www | 少妇太爽了 | 欧美多p视频 | 欧美综合社区 | 一区二区福利 | 国产蜜臀av在线一区尤物 | 国产精品久久久亚洲 | 中文字幕超清在线观看 | 国产午夜亚洲精品不卡 | 国产a√ | 91精品婷婷国产综合久久性色 | 极品美女销魂一区二区三区 | 国产一区二区91 | 99久久99久久精品 | 久久三级 | 亚洲免费av一区二区 | 欧美日韩新片 | 亚洲最大国产成人综合网站 | 91久久精品www人人做人人爽 | 国产三区二区 | 香蕉视频网站在线观看 | 亚洲精品国产偷自在线观看 | 琪琪午夜伦埋影院77 | 国产又粗又猛又爽 | 免费看aaaaa级少淫片 | 亚洲精品久久久日韩美女极品 | 色婷婷av一区二区三区gif | 人人人射 | 国产性精品 | 91精品国产日韩一区二区三区 | 亚洲欧美网站 | 欧美韩一区二区三区 | 单亲陪读乱淫口述 | 国产在线麻豆精品观看 | 欧美一级黄色片在线观看 | 色一情 | 精品久久www | 国产精品资源在线 | 久久久久国产a免费观看rela | 91久久夜色精品国产网站 | 一级片在线免费 | 色噜噜一区二区三区 | 99久久99久久精品国产片果冻 | 久久狠狠高潮亚洲精品 | 亚洲成av人片天堂网无码】 | 日本一卡2卡3卡四卡精品网站 | av在线有码 | 成人午夜影院 | 国产精品黑色高跟鞋丝袜 | 成人毛片一区二区 | 亚洲精品热 | 在线无码免费的毛片视频 | 伊人精品视频 | 成人在线免费 | 久久久亚洲国产精品 | 手机看片福利永久 | 极品主播超大尺度福利视频在线 | 成人黄色激情网 | 人妻夜夜爽天天爽 | 国产精品第一国产精品 | 么公的好大好硬好深好爽视频 | 六月婷婷久香在线视频 | 美女一区二区三区 | 久久妇女高潮喷水多 | а√天堂资源8在线官网在线 | 九九热伊人 | 中文字幕丰满子伦 | 男人天堂免费视频 | 26uuu国产精品 | 黄色国产精品视频 | 青青久草在线视频 | 国产做受高潮69 | 天天做天天爱夜夜爽 | 91成人海角社区 | 精品久久久久久久久久中文字幕 | 少妇一区二区三区 | 久久视频免费观看 | 中国人妻被两个老外三p | 国产精品黄色网 | 国产情侣自拍小视频 | 国产精品ai换脸张天爱 | 亚洲精品久久久久久下一站 | 国内国内在线自偷第68页 | 69久久成人精品 | 国产精品高潮呻吟久久aⅴ码 | 欧洲亚洲色一区二区色99 | 手机看片日韩在线 | 日本青草视频 | 免费久久av | 精品少妇一区二区三区免费观 | 久久久久久中文字幕 | 国产小视频在线观看免费 | 久久婷婷五月综合尤物色国产 | 伊甸园成人入口 | 亚洲爱爱网 | 激情伊人五月天久久综合 | 亚洲精品在线播放视频 | 亚洲狠狠丁香婷婷综合久久久 | 婷婷综合少妇啪啪喷水动态小说 | 1024av在线 | 男女拍拍拍网站 | 久久人人添人人爽添人人88v | 97夜夜澡人人爽人人喊中国片 | 欧亚日韩精品一区二区在线 | 久无码久无码av无码 | 特黄特色大片免费播放叫疼 | 亚洲国产一区二区三区 | 日日夜夜天天操 | 天天爽夜夜爽人人爽 | 一级片小视频 | 日本毛片视频 | 日本jizz在线观看 | 国产精品99久久久久的智能播放 | 国产91香蕉 | 日本少妇喂奶视频 | 99免费国产 | 久久盗摄 | 日本亲子乱子伦xxxx30路 | 日韩亚洲欧美在线 | 国内精品伊人久久久久777 | av黄色在线观看 | 黄网视频在线观看 | yy6080午夜八戒国产亚洲 | 欧美激情综合亚洲一二区 | 另类激情亚洲 | 欧美性生交大片18禁止 | 久久久一本精品99久久精品66 | aa视频免费在线观看 | 亚洲精品国产精品色诱一区 | 中文字幕无码免费久久 | 亚洲国产精品成人女人久久 | 日韩在线观看视频网站 | 日本黄页视频 | 免费黄色网址在线观看 | 综合激情四射 | 一个人在线免费观看www视频 | 真人性囗交69视频 | 韩日视频在线 | 午夜影院久久 | 4hu最新网址 | 久久99网| www一区二区www免费 | 欧美一区二区三区黄色 | 男女性动态激烈动全过程 | 97精品视频在线观看 | 在线免费观看av网 | 日本疯狂爆乳xxxx | 91国在线观看 | 色天天色 | 丝袜美腿亚洲一区二区图片 | 欧美成a | 国产国产精品人在线观看 | 欧美特级aaa| 六十路熟妇乱子伦 | 色妞av永久一区二区国产av | 欧美色爽 | 国产日产精品久久快鸭的功能介绍 | 日韩 国产 欧美 | 午夜免费视频 | 成人无遮挡裸免费视频在线观看 | 综合久久久久 | 国产精选在线 | 中文在线а√在线8 | 麻豆影音先锋 | 8x8ⅹ在线永久免费入口 | 中文字幕人妻第一区 | 99久久久无码国产精品性 | 另类异族videosex太狠了 | 在线看www| 乱人伦中文无码视频在线观看 | 一区二区在线免费观看视频 | 精品国产乱码久久久久久鸭王1 | 亚洲色图图片 | 美女久久久 | 老司机午夜免费精品视频 | 1000部羞羞视频在线看视频 | av网站在线免费 | 国产一区二区自拍视频 | 日本污ww视频网站 | 欧美三级视频 | 91精品国产九九九久久久亚洲 | 色www亚洲国产阿娇yao | 亚洲www在线观看 | 亚洲乱码一区av黑人高潮 | 亚洲同性同志一二三专区 | 日韩一区二区三区免费 | 午夜肉伦伦影院九七影网 | 久久久久久a亚洲欧洲av | 136fldh福利视频导在线 | 欧美 国产 综合 欧美 视频 | 亚洲精品无码国产 | 少妇高潮叫床片一级 | 日韩在线无 | 新狼窝色av性久久久久久 | 久爱视频在线观看 | 日日夜夜撸影院 | av夜夜| 免费999精品国产自在现线 | 野花社区www高清视频 | 十八禁视频网站在线观看 | 日韩一区二区三 | av毛片在线免费看 | 欧美日韩中文视频 | 91 免费看片 | 久久精品首页 | 成年片在线观看 | 日本三级黄色中文字幕 | 黄网av| 国产中文区3幕区2021 | 亚洲永久免费 | 国产成人精品日本亚洲直播 | 亚洲大色| 久久午夜激情 | 噜啦噜色姑娘综合 | 久久久精品国产sm调教网站 | 精品无码三级在线观看视频 | 久久ww精品w免费人成 | 中文字幕一区二区三区久久蜜桃 | 日韩精品视频在线 | 久久影库 | 爱情岛论坛亚洲品质有限公司18 | 黄色激情网址 | 亚洲欧美第一页 | 国产一区二区三区自拍 | 又大又粗欧美黑人aaaaa片 | 辽宁熟女高潮狂叫视频 | 大乳丰满人妻中文字幕日本 | 国产第一福利影院 | 亚洲第一页综合图片自拍 | 欧美三级又粗又硬 | 日日碰狠狠躁久久躁综合网 | 精品国产一区二区三区无码 | 黄频在线 | 男人av无码天堂 | 97久久超碰国产精品2021 | 丁香婷婷综合激情五月色 | 波多野结衣在线播放视频 | 精品国产一区二区三区四区阿崩 | 东北少妇不戴套对白第一次 | 国产精品成人国产乱 | 黄色免费在线视频 | 亚洲淫欲| 亚洲人成人网站色www | 国产极品粉嫩福利姬萌白酱 | 日韩黄色一级片 | 国产婷婷色综合av蜜臀av | 精品国偷自产在线视频 | 久久狠狠一本精品综合网 | 亚洲成网| 亚洲国产精品久久久久久 | 台湾极品xxx少妇 | 亚洲欧美人成电影在线观看 | 色天天| 青草青草久热精品视频在线观看 | 色噜噜狠狠色综合网图区 | 国产高潮视频在线观看 | 天堂国产一区二区三区四区不卡 | 午夜性色福利视频 | 青青青操 | 中文在线√天堂 | 亚洲色成人一区二区三区小说 | 99久久日韩精品免费热麻豆美女 | 亚洲人午夜射精精品日韩 | 日本特黄特色大片免费视频老年人 | 久色国产sm重口调教在线观看 | 日韩精品无码一区二区三区久久久 | 国产偷v国产偷v亚洲高清 | 国产精品久久久久久一区二区三区 | 黑人狂躁曰本人aⅴ | 欧美一级免费观看 | 国产免费内射又粗又爽密桃视频 | 91av国产精品 | 亚洲成av人影院 | 精品av天堂毛片久久久借种 | 亚洲天堂在线视频观看 | 久草在线看片 | 中文字幕涩涩久久乱小说 | 欧美一级做a爰片免费视频 欧美一级做性受免费大片免费 | 2019天天干夜夜操 | 国产精品夜夜春夜夜爽久久老牛 | 国产成人无码av在线播放dvd | 国产乱码精品一区二区三区五月婷 | 羞羞色院91蜜桃 | 色五月激情五月 | 日日干天天 | 少妇乳大丰满诱人2 | 国产精品久久久久久久久ktv | 精品中文字幕一区二区三区av | 一本色道久久综合狠狠躁 | 四虎永久免费 | 91精品在线免费观看 | 人妻精品无码一区二区三区 | 久久久久久久久久久久久9999 | 欧美大成色www永久网站婷 | av一区二区在线播放 | 日本少妇裸体做爰高潮片 | 国产成年无码v片在线 | 亚洲综合色丁香婷婷六月图片 | 国产亚洲精品久久777777 | 99久久久无码国产精品秋霞网 | 男生女生操操操 | 看全色黄大色黄大片大学生图片 | 国产产无码乱码精品久久鸭 | 中日韩无砖码一线二线 | 我爱avav色aⅴ爱avav | 成人免费视屏 | 制服 丝袜 激情 欧洲 亚洲 | 国产裸拍裸体视频在线观看 | 成年女人免费视频播放体验区 | 国产欲妇 | 日本熟妇成熟毛茸茸 | 农村寡妇一区二区三区 | 午夜寂寞影视在线观看 | 日本女人hd | 亚洲一区精品无码 | 国产小视频在线免费观看 | 国产一区二区三区在线电影 | 精品欧美久久久 | 成人免费做受小说 |