久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

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

探究Android客戶端網絡預連接優化機制

瀏覽:3日期:2022-09-18 08:12:07
目錄一、連接復用二、預連接實現三、源碼分析四、優化五、問答一、連接復用

對于一個普通的接口請求,通過charles抓包,查看網絡請求Timing欄信息,我們可以看到類似如下請求時長信息:

Duration 175 ms DNS 6 ms Connect 50 msTLS Handshake 75 ms Request 1 ms Response 1 ms Latency 42 ms

同樣的請求,再來一次,時長信息如下所示:

Duration 39 ms DNS - Connect - TLS Handshake - Request 0 ms Response 0 ms Latency 39 ms

我們發現,整體網絡請求時間從175ms降低到了39ms。其中DNS,Connect,TLS Handshake 后面是個橫線,表示沒有時長信息,于是整體請求時長極大的降低了。這就是Http(s)的連接復用的效果。那么問題來了,什么是連接復用,為什么它能降低請求時間?

在解決這個疑問之前,我們先來看看一個網絡請求發起,到收到返回的數據,這中間發生了什么?

客戶端發起網絡請求 通過DNS服務解析域名,獲取服務器IP (基于UDP協議的DNS解析) 建立TCP連接(3次握手) 建立TLS連接(https才會用到) 發送網絡請求request 服務器接收request,構造并返回response TCP連接關閉(4次揮手)

上面的連接復用直接讓上面2,3,4步都不需要走了。這中間省掉的時長應該怎么算?如果我們定義網絡請求一次發起與收到響應的一個來回(一次通信來回)作為一個RTT(Round-trip delay time)。

1)DNS默認基于UDP協議,解析最少需要1-RTT;

2)建立TCP連接,3次握手,需要2-RTT;

探究Android客戶端網絡預連接優化機制

3)建立TLS連接,根據TLS版本不同有區別,常見的TLS1.2需要2-RTT。

Client                                               Server

ClientHello                  -------->

                                                ServerHello

                                               Certificate*

                                         ServerKeyExchange*

                                        CertificateRequest*

                             <--------      ServerHelloDone

Certificate*

ClientKeyExchange

CertificateVerify*

[ChangeCipherSpec]

Finished                     -------->

                                         [ChangeCipherSpec]

                             <--------             Finished

Application Data             <------->     Application Data

                   TLS 1.2握手流程(來自 RFC 5246)

注:TLS1.3版本相比TLS1.2,支持0-RTT數據傳輸(可選,一般是1-RTT),但目前支持率比較低,用的很少。

http1.0版本,每次http請求都需要建立一個tcp socket連接,請求完成后關閉連接。前置建立連接過程可能就會額外花費4-RTT,性能低下。

http1.1版本開始,http連接默認就是持久連接,可以復用,通過在報文頭部中加上Connection:Close來關閉連接 。如果并行有多個請求,可能還是需要建立多個連接,當然我們也可以在同一個TCP連接上傳輸,這種情況下,服務端必須按照客戶端請求的先后順序依次回送結果。

注:http1.1默認所有的連接都進行了復用。然而空閑的持久連接也可以隨時被客戶端與服務端關閉。不發送Connection:Close不意味著服務器承諾連接永遠保持打開。

http2 更進一步,支持二進制分幀,實現TCP連接的多路復用,不再需要與服務端建立多個TCP連接了,同域名的多個請求可以并行進行。

探究Android客戶端網絡預連接優化機制

還有個容易被忽視的是,TCP有擁塞控制,建立連接后有慢啟動過程(根據網絡情況一點一點的提高發送數據包的數量,前面是指數級增長,后面變成線性),復用連接可以避免這個慢啟動過程,快速發包。

二、預連接實現

客戶端常用的網絡請求框架如OkHttp等,都能完整支持http1.1與HTTP2的功能,也就支持連接復用。了解了這個連接復用機制優勢,那我們就可以利用起來,比如在APP閃屏等待的時候,就預先建立首頁詳情頁等關鍵頁面多個域名的連接,這樣我們進入相應頁面后可以更快的獲取到網絡請求結果,給予用戶更好體驗。在網絡環境偏差的情況下,這種預連接理論上會有更好的效果。

具體如何實現?

第一反應,我們可以簡單的對域名鏈接提前發起一個HEAD請求(沒有body可以省流量),這樣就能提前建立好連接,下次同域名的請求就可以直接復用,實現起來也是簡單方便。于是寫了個demo,試了個簡單接口,完美,粗略統計首次請求速度可以提升40%以上。

于是在游戲中心App啟動Activity中加入了預連接相關邏輯,跑起來試了下,竟然沒效果...

抓包分析,發現連接并沒有復用,每次進去詳情頁后都重新創建了連接,預連接可能只是省掉了DNS解析時間,demo上的效果無法復現??礃幼臃治鯫kHttp連接復用相關源碼是跑不掉了。

三、源碼分析

OKHttp通過幾個默認的Interceptor用于處理網絡請求相關邏輯,建立連接在ConnectInterceptor類中;

public final class ConnectInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { RealInterceptorChain realChain = (RealInterceptorChain) chain; Request request = realChain.request(); StreamAllocation streamAllocation = realChain.streamAllocation();​ // We need the network to satisfy this request. Possibly for validating a conditional GET. boolean doExtensiveHealthChecks = !request.method().equals('GET'); HttpCodec httpCodec = streamAllocation.newStream(client, chain, doExtensiveHealthChecks); RealConnection connection = streamAllocation.connection();​ return realChain.proceed(request, streamAllocation, httpCodec, connection); }}

RealConnection即為后面使用的connection,connection生成相關邏輯在StreamAllocation類中;

public HttpCodec newStream( OkHttpClient client, Interceptor.Chain chain, boolean doExtensiveHealthChecks) { ... RealConnection resultConnection = findHealthyConnection(connectTimeout, readTimeout,writeTimeout, pingIntervalMillis, connectionRetryEnabled, doExtensiveHealthChecks); HttpCodec resultCodec = resultConnection.newCodec(client, chain, this); ...}​private RealConnection findHealthyConnection(int connectTimeout, int readTimeout, int writeTimeout, int pingIntervalMillis, boolean connectionRetryEnabled, boolean doExtensiveHealthChecks) throws IOException { while (true) { RealConnection candidate = findConnection(connectTimeout, readTimeout, writeTimeout, pingIntervalMillis, connectionRetryEnabled); ... return candidate; }} /** * Returns a connection to host a new stream. This prefers the existing connection if it exists, * then the pool, finally building a new connection. */ private RealConnection findConnection(int connectTimeout, int readTimeout, int writeTimeout, int pingIntervalMillis, boolean connectionRetryEnabled) throws IOException { ...// 嘗試從connectionPool中獲取可用connection Internal.instance.acquire(connectionPool, address, this, null); if (connection != null) { foundPooledConnection = true; result = connection; } else { selectedRoute = route; } ... if (!foundPooledConnection) { ... // 如果最終沒有可復用的connection,則創建一個新的result = new RealConnection(connectionPool, selectedRoute); } ...}

這些源碼都是基于okhttp3.13版本的代碼,3.14版本開始這些邏輯有修改。

StreamAllocation類中最終獲取connection是在findConnection方法中,優先復用已有連接,沒可用的才新建立連接。獲取可復用的連接是在ConnectionPool類中;

/** * Manages reuse of HTTP and HTTP/2 connections for reduced network latency. HTTP requests that * share the same {@link Address} may share a {@link Connection}. This class implements the policy * of which connections to keep open for future use. */public final class ConnectionPool { private final Runnable cleanupRunnable = () -> { while (true) { long waitNanos = cleanup(System.nanoTime()); if (waitNanos == -1) return; if (waitNanos > 0) {long waitMillis = waitNanos / 1000000L;waitNanos -= (waitMillis * 1000000L);synchronized (ConnectionPool.this) { try { ConnectionPool.this.wait(waitMillis, (int) waitNanos); } catch (InterruptedException ignored) { }} } } }; // 用一個隊列保存當前的連接 private final Deque<RealConnection> connections = new ArrayDeque<>(); /** * Create a new connection pool with tuning parameters appropriate for a single-user application. * The tuning parameters in this pool are subject to change in future OkHttp releases. Currently * this pool holds up to 5 idle connections which will be evicted after 5 minutes of inactivity. */ public ConnectionPool() { this(5, 5, TimeUnit.MINUTES); } public ConnectionPool(int maxIdleConnections, long keepAliveDuration, TimeUnit timeUnit) { ... } void acquire(Address address, StreamAllocation streamAllocation, @Nullable Route route) { assert (Thread.holdsLock(this)); for (RealConnection connection : connections) { if (connection.isEligible(address, route)) {streamAllocation.acquire(connection, true);return; } } }

由上面源碼可知,ConnectionPool默認最大維持5個空閑的connection,每個空閑connection5分鐘后自動釋放。如果connection數量超過最大數5個,則會移除最舊的空閑connection。

最終判斷空閑的connection是否匹配,是在RealConnection的isEligible方法中;

/** * Returns true if this connection can carry a stream allocation to {@code address}. If non-null * {@code route} is the resolved route for a connection. */ public boolean isEligible(Address address, @Nullable Route route) { // If this connection is not accepting new streams, we’re done. if (allocations.size() >= allocationLimit || noNewStreams) return false; // If the non-host fields of the address don’t overlap, we’re done. if (!Internal.instance.equalsNonHost(this.route.address(), address)) return false; // If the host exactly matches, we’re done: this connection can carry the address. if (address.url().host().equals(this.route().address().url().host())) { return true; // This connection is a perfect match. } // At this point we don’t have a hostname match. But we still be able to carry the request if // our connection coalescing requirements are met. See also: // https://hpbn.co/optimizing-application-delivery/#eliminate-domain-sharding // https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing/ // 1. This connection must be HTTP/2. if (http2Connection == null) return false; // 2. The routes must share an IP address. This requires us to have a DNS address for both // hosts, which only happens after route planning. We can’t coalesce connections that use a // proxy, since proxies don’t tell us the origin server’s IP address. if (route == null) return false; if (route.proxy().type() != Proxy.Type.DIRECT) return false; if (this.route.proxy().type() != Proxy.Type.DIRECT) return false; if (!this.route.socketAddress().equals(route.socketAddress())) return false; // 3. This connection’s server certificate’s must cover the new host. if (route.address().hostnameVerifier() != OkHostnameVerifier.INSTANCE) return false; if (!supportsUrl(address.url())) return false; // 4. Certificate pinning must match the host. try { address.certificatePinner().check(address.url().host(), handshake().peerCertificates()); } catch (SSLPeerUnverifiedException e) { return false; } return true; // The caller’s address can be carried by this connection. }

這塊代碼比較直白,簡單解釋下比較條件:

如果該connection已達到承載的流上限(即一個connection可以承載幾個請求,http1默認是1個,http2默認是Int最大值)則不符合;

如果2個Address除Host之外的屬性有不匹配,則不符合(如果2個請求用的okhttpClient不同,復寫了某些重要屬性,或者服務端端口等屬性不一樣,那都不允許復用);

如果host相同,則符合,直接返回true(其它字段已經在上一條比較了);

如果是http2,則判斷無代理、服務器IP相同、證書相同等條件,如果都符合也返回true;

整體看下來,出問題的地方應該就是ConnectionPool 的隊列容量太小導致的。游戲中心業務復雜,進入首頁后,觸發了很多接口請求,導致連接池直接被占滿,于是在啟動頁做好的預連接被釋放了。通過調試驗證了下,進入詳情頁時,ConnectionPool中的確已經沒有之前預連接的connection了。

四、優化

在http1.1中,瀏覽器一般都是限定一個域名最多保留5個左右的空閑連接。然而okhttp的連接池并沒有區分域名,整體只做了默認最大5個空閑連接,如果APP中不同功能模塊涉及到了多個域名,那這默認的5個空閑連接肯定是不夠用的。有2個修改思路:

重寫ConnectionPool,將連接池改為根據域名來限定數量,這樣可以完美解決問題。然而OkHttp的ConnectionPool是final類型的,無法直接重寫里面邏輯,另外OkHttp不同版本上,ConnectionPool邏輯也有區別,如果考慮在編譯過程中使用ASM等字節碼編寫技術來實現,成本很大,風險很高。 直接調大連接池數量和超時時間。這個簡單有效,可以根據自己業務情況適當調大這個連接池最大數量,在構建OkHttpClient的時候就可以傳入這個自定義的ConnectionPool對象。

我們直接選定了方案2。

五、問答

1、如何確認連接池最大數量值?

這個數量值有2個參數作為參考:頁面最大同時請求數,App總的域名數。也可以簡單設定一個很大的值,然后進入APP后,將各個主要頁面都點一遍,看看當前ConnectionPool中留存的connection數量,適當做一下調整即可。

2、調大了連接池會不會導致內存占用過多?

經測試:將connectionPool最大值調成50,在一個頁面上,用了13個域名鏈接,總共重復4次,也就是一次發起52個請求之后,ConnectionPool中留存的空閑connection平均22.5個,占用內存為97Kb,ConnectionPool中平均每多一個connection會占用4.3Kb內存。

3、調大了連接池會影響到服務器嗎?

理論上是不會的。連接是雙向的,即使客戶端將connection一直保留,服務端也會根據實際連接數量和時長調整,自動關閉連接的。比如服務端常用的nginx就可以自行設定最大保留的connection數量,超時也會自動關閉舊連接。因此如果服務器定義的最大連接數和超時時間比較小,可能我們的預連接會無效,因為連接被服務端關閉了。

探究Android客戶端網絡預連接優化機制

用charles可以看到這種連接被服務端關閉的效果:TLS大類中Session Resumed里面看到復用信息。

這種情況下,客戶端會重新建立連接,會有tcp和tls連接時長信息。

4、預連接會不會導致服務器壓力過大?

由于進入啟動頁就發起了網絡請求進行預連接,接口請求數增多了,服務器肯定會有影響,具體需要根據自己業務以及服務器壓力來判斷是否進行預連接。

5、如何最大化預連接效果?

由上面第3點問題可知,我們的效果實際是和服務器配置息息相關,此問題涉及到服務器的調優。

服務器如果將連接超時設置的很小或關閉,那可能每次請求都需要重新建立連接,這樣服務器在高并發的時候會因為不斷創建和銷毀TCP連接而消耗很多資源,造成大量資源浪費。

服務器如果將連接超時設置的很大,那會由于連接長時間未釋放,導致服務器服務的并發數受到影響,如果超過最大連接數,新的請求可能會失敗。

可以考慮根據客戶端用戶訪問到預連接接口平均用時來調節。比如游戲中心詳情頁接口預連接,那可以統計一下用戶從首頁平均瀏覽多長時間才會進入到詳情頁,根據這個時長和服務器負載情況來適當調節。

以上就是探究Android客戶端網絡預連接優化機制的詳細內容,更多關于Android客戶端網絡 預連接優化的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 伦理一区 | 欧美一区二区三区 | 中文字幕第9页 | 国产一区二区视频在线观看 | 欧美日韩一区二区在线 | 日韩在线小视频 | 久久国产精品无码网站 | 久久久精品久久久 | 99精品视频网 | 91亚洲日本aⅴ精品一区二区 | 国产人成精品一区二区三 | 午夜午夜精品一区二区三区文 | 亚洲成人精品在线观看 | 免费xxxx大片国产在线 | 色啪网站 | 久久mm| 亚洲精品中文字幕在线观看 | 国产亚洲欧美一区二区三区 | 精品99视频| 国产精品嫩草55av | 精品久久久久香蕉网 | 色婷婷一区二区三区四区 | 久久精品国产99国产精2020新增功能 | 四虎网址 | 九九热免费精品视频 | 国产日韩一区 | 91色在线观看 | 伊人二区 | 国产精品日产欧美久久久久 | 激情欧美一区二区 | 超碰官网 | 成人黄页在线观看 | 精品久久久久久久人人人人传媒 | 伊人久久一区二区三区 | 国产亚洲欧美一区 | 欧美一区亚洲二区 | 99久久精品一区二区成人 | 中文字幕视频免费观看 | 一级黄色短片 | 91精品在线播放 | 91免费版在线观看 | 欧美精品乱码久久久久久按摩 | h片观看 | 国产精品永久免费视频 | 91精品国产乱码久久久久久 | 日韩视频―中文字幕 | 久久久久久九九九九九九 | 色约约精品免费看视频 | 精品1区2区 | 日本在线观看一区二区 | 国产精品成人在线观看 | 亚洲一区二区在线播放 | 黄色毛片在线观看 | 色欧美综合 | 中文字幕一区二区三区免费视频 | 美女主播精品视频一二三四 | 国产成人精品在线观看 | 免费黄色欧美 | www久| 久久久久久亚洲 | 韩日视频在线观看 | 日韩欧美~中文字幕 | 久久不射网 | 日韩激情一区二区 | 国产激情偷乱视频一区二区三区 | 天天色天天看 | 日韩第一区 | 精品免费视频 | 欧美日韩一区二区三区在线观看 | 天堂亚洲网 | 九色91视频 | 国产精品欧美久久久久一区二区 | 亚洲高清在线观看 | 欧美午夜视频在线观看 | 在线99| 天天曰 | 91激情视频| 香蕉91| 国产高清av在线一区二区三区 | 亚洲第一免费视频网站 | 欧美日韩免费看 | 精品日韩一区二区三区 | 亚洲视频 欧美视频 | 色九九 | 日韩在线播放视频 | 精品视频在线免费观看 | 久久精品亚洲一区二区 | 欧美中文在线 | 国产女人高潮视频在线观看 | 国产亚洲精品美女久久久久久久久久 | 在线观看免费的网站www | 中文字幕在线免费视频 | 久久99精品久久久 | 国产精品一区二区久久久久 | www.国产一区 | 一区二区三区观看视频 | 成人黄页在线观看 | 日韩精品视频三区 | 一级免费毛片 | 亚洲精品一 | 91免费版在线观看 | www国产成人免费观看视频,深夜成人网 | 伊人久久国产 | 在线色站| 亚洲 精品 综合 精品 自拍 | 日韩欧美精品一区二区三区 | 国产精品美女久久久久久免费 | 成人午夜sm精品久久久久久久 | 国产一区 | 免费视频爱爱太爽了 | 欧美视频在线播放 | 自拍一区视频 | 国产精品一区二区三区四区 | 国产一区二区免费电影 | 91免费版在线观看 | 精品一区二区三区四区五区 | 亚洲精品大片 | 久草热8精品视频在线观看 亚洲区在线 | 91在线观看视频 | www.国产 | 婷婷午夜激情网 | 午夜午夜精品一区二区三区文 | 国产三级在线 | 性培育学校羞耻椅子调教h 欧美精品网站 | 久久久久久久国产精品 | 欧美中文字幕在线观看 | 亚洲精品视频一区 | 成人欧美一区二区三区黑人孕妇 | 亚洲欧洲无码一区二区三区 | 人人草天天草 | 国产精品久久久久久久久晋中 | 日本成人午夜影院 | 国产精品三级在线 | 久久精品国产99精品国产亚洲性色 | 成人片免费看 | 国产视频一二区 | 成人在线观看免费视频 | 国产一区亚洲 | 亚洲精品视频在线看 | 天天久| 国产二区三区 | 亚洲精品乱码久久久久久蜜桃图片 | 99这里只有精品 | 国产欧美精品一区 | 美女久久久久 | 精品一区二区久久久久久久网站 | 日韩黄视频 | 在线看91 | 欧美不卡一区二区三区 | 免费av在线| 久久久久久久久99精品 | 二区视频 | 国产一区精品视频 | 国产中文字幕亚洲 | 91免费在线看 | 老汉色影院 | 国产精品久久久99 | 97久久精品午夜一区二区 | 精品香蕉一区二区三区 | 国产区在线 | 国产成人av在线播放 | 91久久国产精品 | 亚洲黄色一级毛片 | 亚洲视频一区二区三区四区 | 99精品网 | 亚洲精品视频免费 | 亚洲精品视频在线观看网站 | 成人免费一区二区三区视频网站 | 成人免费视频观看 | 久草免费福利 | 夜夜超碰 | 91久久久久久久久 | av日韩一区| 波多野结衣一区二区三区中文字幕 | 国产精品99久久免费观看 | 国产精品福利在线 | 亚洲综合无码一区二区 | 中文字幕 在线观看 | 国产成人精品一区二区在线 | 欧美日韩一区二区在线 | 在线观看成人 | 欧美电影一区 | 综合色爱 | 国产精品久久久久久 | 九色av| 97在线视频免费 | 国产精品久久久久久福利一牛影视 | 日韩精品一区二区在线观看 | 黄色天堂网 | 国产成人av在线 | 激情久久av一区av二区av三区 | 天天操天天干视频 | 久热久爱| 亚洲精品欧美 | 久久综合九色综合欧美狠狠 | 久久成人国产精品 | 久久精品综合 | 日韩欧美在线观看视频 | 日韩视频一区二区 | 波多野结衣一区二 | 奇米成人影视 | 免费成人在线观看视频 | 欧美一级片毛片免费观看视频 | 人人插 | 欧美精品1区2区3区 免费亚洲婷婷 | 日韩成人在线影院 | 麻豆精品国产91久久久久久 | 国产999免费视频 | 波多野结衣先锋影音 | 婷婷综合一区 | 成人在线视频免费观看 | 日韩欧美亚洲 | 国产99久久精品一区二区永久免费 | 久久91精品国产91久久跳 | 精品久久网 | 久久久91 | 国产精品777一区二区 | 国产91九色| 九九热在线视频免费观看 | 日日操操| 色婷婷国产精品 | 成人午夜影院 | 免费一级 国产 | 欧美福利在线观看 | 国产美女一区 | 成人午夜啪啪好大 | 国产精品一区二区精品 | 国产精品欧美日韩 | 国产91亚洲精品久久久 | 久久久精品免费观看 | 午夜视频| 国产免费自拍 | 久久男人| 国产欧美一区二区精品性色 | 欧美日韩视频网站 | 国产色 | 欧美成人一区二区三区片免费 | 亚洲精品久久久久久下一站 | 免费黄色录像视频 | 视频网站免费观看 | 这里有精品在线视频 | 亚洲免费国产视频 | 在线精品一区 | 婷婷毛片| 91精品国产综合久久久久久丝袜 | 亚洲毛片在线观看 | 久久久久亚洲国产 | 国产日韩精品一区二区 | 精品国产不卡一区二区三区 | 欧美高清一区 | 日韩欧美一级精品久久 | 呦一呦二在线精品视频 | 免费观看一区二区三区毛片软件 | 精品亚洲永久免费精品 | 国产亚洲一区在线 | 成人免费毛片高清视频 | 最新日韩视频 | 精品无码久久久久国产 | 午夜精品久久久久久久白皮肤 | 亚洲欧美日韩另类精品一区二区三区 | 日韩精品一区二区在线观看 | 在线成人av | 91精品国产综合久久福利软件 | 高清国产一区二区三区四区五区 | 国产一区日韩在线 | 国产精品视频免费播放 | 在线看国产 | www.亚洲精品| 亚洲精品在线免费 | 91免费视频在线 | 亚洲欧美激情视频 | 性色网站 | 一级片日韩 | 一区二区不卡 | 不卡一区二区三区四区 | 99精品热视频 | 国产精品日韩欧美一区二区 | 成年入口无限观看网站 | 午夜免费福利视频 | 国产综合亚洲精品一区二 | 羞羞色影院 | 成人精品鲁一区一区二区 | 免费国产一区 | 国产特一级黄色片 | 久久久av一区 | 日韩精品一区二区三区 | 欧美男人天堂 | 夏同学福利网 | 国产精品久久在线观看 | 日本久久久久久久久久久久 | 久久久久国产精品 | 精品免费视频 | 91精品国产综合久久久亚洲 | www中文字幕 | 国产精品视频一区二区三区四蜜臂 | 午夜网 | 久久91久久久久麻豆精品 | 成人在线黄色 | 国产偷国产偷精品高清尤物 | 狠狠的干 | 午夜天堂精品久久久久 | 亚洲欧美在线免费 | 成人午夜激情 | 伊人网站 | 97色在线观看免费视频 | 国产乱码精品一品二品 | 真人一级毛片 | 久久久久久国产免费 | 精品一区在线 | 欧美久久一级特黄毛片 | 国产成人免费网站 | 狠狠操综合网 | 在线播放亚洲 | 国产成人精品免高潮在线观看 | 日本不卡一二三 | 欧美日韩中文 | 成人在线免费 | 午夜在线电影 | 伊人狠狠干 | 99精品一区二区三区 | 天堂成人av| 日韩综合在线 | 一级特黄色大片 | 免费看片国产 | 亚洲一区二区三区日韩 | 欧美在线观看一区 | 久久丁香 | 日韩91 | 明里在线观看 | 日韩99 | 午夜影院普通用户体验区 | 欧美一区二区在线观看 | 国产精品一区二区av | 中文字幕av在线播放 | 精品久久久久久久久久久久久久 | 午夜寂寞影视在线观看 | 2018自拍偷拍 | 一区二区免费视频 | 亚洲第一区在线 | 国产精品二区一区二区aⅴ污介绍 | 日韩在线欧美 | jizz国产免费 | 日韩极品在线 | 成人中文网 | 亚洲国产精品久久久久婷婷老年 | 九九热精品视频 | 91亚洲免费| 免费在线看a | 国产精品毛片久久久久久久 | 国产精品资源在线 | 狠狠操网站| 国产精品久久久久久久久久妞妞 | 亚洲h视频在线观看 | 国产成人精品亚洲日本在线观看 | 在线亚洲一区 | 久久久久久久久国产 | 激情欧美一区二区三区中文字幕 | 91精品国产一区二区三区蜜臀 | 91精品国产欧美一区二区成人 | 男人的天堂一级片 | 国产精品久久久久久亚洲影视 | 久久久国产精品视频 | 欧美中文字幕一区二区 | 91在线一区二区 | 中文字幕在线观看视频一区 | 国产av毛片 | 91精品国产色综合久久不卡98口 | 亚洲黄色av网站 | 日本在线免费观看 | 君岛美绪一区二区三区在线视频 | 日韩一区二区在线观看 | 成人亚洲免费视频 | 欧美理论片在线 | 国产视频黄在线观看 | 亚洲精品一区中文字幕乱码 | 中文字幕综合在线 | 欧美激情在线狂野欧美精品 | 羞羞视频网站 | 国产九九av| 蜜桃一区二区 | v片网站 | 成人av免费 | 精品亚洲一区二区三区四区五区 | 日韩中文一区二区三区 | 亚洲一区二区三区免费在线 | 自拍在线| 中国一级大黄大黄大色毛片 | 蜜臀一区 | 久久久精品456亚洲影院 | 欧美日韩福利视频 | 黄色免费高清视频 | 五月婷婷中文 | 高清久久| 日韩快播电影 | 99免费观看 | 99精品电影 | 国产一级免费视频 | 国产精品999 | 成人日韩 | 亚洲一区二区黄 | 日韩欧美视频 | 国产成人午夜视频 | 久久精品1 | 精品一区二区三区免费毛片爱 | 中文在线a在线 | 求av网址| 日韩一区二区三区在线 | 国产精品免费在线 | 成人日韩在线观看 | 日韩成人av在线 | 青青草一区二区三区 | 免费在线精品视频 | 午夜精品网站 | 99久久电影 | 欧日韩在线视频 | 一区二区三区国产 | 色视频网站在线观看 | 久久久精品一区二区三区 | 亚洲一区久久 | 日韩福利一区 | 久久精品欧美一区二区三区不卡 | a免费网站| 日韩久草 | 久久高清 | 综合久久综合 | 99免费精品 | 久久国内免费视频 | 日本免费网站 | 日本妇人成熟免费视频 | 视频精品一区二区三区 | 在线观看一区二区三区四区 | 色网在线 | 国产高清一区二区 | 欧美精品成人一区二区三区四区 | 欧美精品一区在线 | 日韩av成人 | 成人福利在线观看 | 欧洲成人在线观看 | 91午夜精品一区二区三区 | 欧美成人久久 | 这里有精品视频 | 国产免费拔擦拔擦8x高清在线人 | 日韩中文一区 | 一级免费毛片 | 美女视频黄又黄又免费 | 精品日韩一区二区三区 | 亚洲视频一区二区三区 | 综合色久 | 日韩精品| 成人亚洲电影 | 日本久久网站 | 久久人人爽人人爽人人片av不 | 麻豆自拍偷拍 | 黄色国产 | 丁香五月亚洲综合在线 | 国产激情99| 免费日韩 | 亚洲午夜精品 | 能在线观看的黄色网址 | 国产精品毛片无码 | 国产第一区在线观看 | 亚洲激情久久 | 中文字幕精品一区久久久久 | 国产一区二区三区在线免费观看 | 国产日韩精品一区二区 | 综合伊人 | 在线中文字幕第一页 | 男人的天堂亚洲 | 91国内外精品自在线播放 | 欧美日韩视频在线观看免费 | 国产伦精品一区二区三区高清 | 国产成人网 | 九九久久影视 | 国产视频亚洲精品 | 亚洲社区在线 | 欧美精品一区二区三区在线播放 | 国产ts人妖另类 | 五月激情六月婷婷 | 国产视频一区二区在线 | 五月激情天| 亚洲1级片 | 一本一道久久a久久精品综合 | 精品国产91乱码一区二区三区 | 99re6热在线精品视频播放 | 成人在线视频一区二区 | 在线观看成人小视频 | 一区二区日韩精品 | 亚洲精品免费在线观看 | 日韩精品一区二区三区中文在线 | 91精品国产日韩91久久久久久 | 99精品视频免费在线观看 | 亚洲精品一区二区在线 | 国产黄色网址在线观看 | 国厂毛片| 美女黄视频网站 | 久久国产精品免费一区二区三区 | 一区自拍 | 黄免费看 | 91免费在线视频 | www九九热| 91在线观看视频 | 成人av播放 | 亚洲成人精品 | 欧美在线视频网 | 高清一区二区三区 | 一区二区三区四区免费观看 | 国产精品一区二区三 | 日本高清视频在线播放 | 成人免费福利视频 | 欧美在线视频一区 | 在线观看91视频 | 免费一区 | 黑人巨大精品欧美一区免费视频 | 视频一区二区三区中文字幕 | 亚洲欧美综合一区 | 精品视频一区二区三区 | 麻豆自拍偷拍 | 日本三级在线观看网站 | 欧美一区二区三区四区不卡 | 午夜大片网 | 日韩欧美在线视频观看 | 91久久在线 | 欧美亚洲啪啪 | 欧美在线不卡 | 日本久久精品视频 | 精品国产一区二区在线 | 色综合天天综合网国产成人网 | 成人精品一区二区三区 | 国产精品揄拍一区二区久久国内亚洲精 | 久久国产综合 | 秋霞电影院午夜伦 | 亚洲精色 | 亚洲精品电影网在线观看 | 日韩电影三级 | 国产一级片在线播放 | 久久综合香蕉 | 亚洲精品第一 | 亚洲视频二区 | 免费观看在线午夜影视 | 精品视频在线免费观看 | 黄网免费| 欧美日韩在线视频免费 | 夏同学福利网 | 日本一本视频 | 91久久综合亚洲鲁鲁五月天 | 综合久久久 | 亚洲一区二区三区高清 | 亚洲视频一区二区三区四区 | 亚洲欧美激情另类 | 午夜成人免费电影 | 久久精品电影网 | 久久99国产精一区二区三区 | 欧美激情一区二区三级高清视频 | 欧美日韩在线播放 | 成人一区二区在线 | 日韩一区二区三区在线观看 | 91精品国产91久久综合桃花 | 日韩精品一区二区三区中文字幕 | 中文av在线免费观看 | 亚洲一区国产精品 | 国产精品视频播放 | 欧美全黄| 精品中文字幕在线观看 | 日韩大片免费播放 | 天天干天天操天天干 | 欧美极品一区二区 | 日韩中文在线观看 | 精品一区二区三区蜜桃 | 久久久www成人免费无遮挡大片 | 欧美精品91 | 一区二区精品 | 国产福利一区二区 | ririsao久久精品一区 | 国产精品资源在线 | 欧美日韩一区二区三区在线观看 | 国产日韩一区二区 | 精产国产伦理一二三区 | 区一区二区三在线观看 | 日本黄色激情片 | 99精品电影| 久久久精品一区二区三区 | 日韩大尺度在线观看 | 欧美夜夜爽 | 日韩欧美一区二区三区视频 | av伊人网| 91精品国产一区二区三区四区在线 | 天天摸夜夜摸爽爽狠狠婷婷97 | av网站网址 | 欧美综合一区二区三区 | 九九热这里都是精品 | 亚洲一区观看 | 黄色网在线看 | 一区在线视频 | 99热69 | 午夜影院在线观看视频 | 成人亚洲欧美 | 精品国产91久久 | av片在线观看网站 | 国产精品综合一区二区 | 一区二区三区在线观看国产 | 欧美精品国产精品 | www.久久99| 国产精国产精品 | 国产精品久久久久久久久久ktv | 一级毛片一级毛片一级毛片 | 美女毛片免费看 | 亚洲精品自在在线观看 | 伊人一二三区 | 涩涩久久 | 日韩一区二区精品 | 狠狠综合久久 | 国产不卡在线视频 | 亚洲一区视频在线播放 | 日韩亚洲一区二区 | 午夜国产羞羞视频免费网站 |