3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OkHttp3的连接池及连接建立过程分析

發(fā)布時間:2024/4/11 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OkHttp3的连接池及连接建立过程分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如我們前面在 OkHttp3 HTTP請求執(zhí)行流程分析 中的分析,OkHttp3通過Interceptor鏈來執(zhí)行HTTP請求,整體的執(zhí)行過程大體如下:


OkHttp Flow

這些Interceptor中每一個的職責,這里不再贅述。

在OkHttp3中,StreamAllocation是用來建立執(zhí)行HTTP請求所需網(wǎng)絡設施的組件,如其名字所顯示的那樣,分配Stream。但它具體做的事情根據(jù)是否設置了代理,以及請求的類型,如HTTP、HTTPS或HTTP/2的不同而有所不同。代理相關的處理,包括TCP連接的建立,在 OkHttp3中的代理與路由 一文中有詳細的說明。

在整個HTTP請求的執(zhí)行過程中,StreamAllocation 對象分配的比較早,在RetryAndFollowUpInterceptor.intercept(Chain chain)中就完成了:

@Override public Response intercept(Chain chain) throws IOException {Request request = chain.request();streamAllocation = new StreamAllocation(client.connectionPool(), createAddress(request.url()), callStackTrace);

StreamAllocation的對象構造過程沒有什么特別的:

public StreamAllocation(ConnectionPool connectionPool, Address address, Object callStackTrace) {this.connectionPool = connectionPool;this.address = address;this.routeSelector = new RouteSelector(address, routeDatabase());this.callStackTrace = callStackTrace;}

在OkHttp3中,okhttp3.internal.http.RealInterceptorChain將Interceptor連接成執(zhí)行鏈。RetryAndFollowUpInterceptor借助于RealInterceptorChain將創(chuàng)建的StreamAllocation對象傳遞給后面執(zhí)行的Interceptor。而在RealInterceptorChain中,StreamAllocation對象并沒有被真正用到。緊跟在RetryAndFollowUpInterceptor之后執(zhí)行的 okhttp3.internal.http.BridgeInterceptor 和 okhttp3.internal.cache.CacheInterceptor,它們的職責分別是補足用戶創(chuàng)建的請求中缺少的必須的請求頭和處理緩存,也沒有真正用到StreamAllocation對象。

在OkHttp3的HTTP請求執(zhí)行過程中,okhttp3.internal.connection.ConnectInterceptor和okhttp3.internal.http.CallServerInterceptor是與網(wǎng)絡交互的關鍵。

CallServerInterceptor負責將HTTP請求寫入網(wǎng)絡IO流,并從網(wǎng)絡IO流中讀取服務器返回的數(shù)據(jù)。而ConnectInterceptor則負責為CallServerInterceptor建立可用的連接。此處 可用的 含義主要為,可以直接寫入HTTP請求的數(shù)據(jù):

  • 設置了HTTP代理的HTTP請求,與代理建立好TCP連接;
  • 設置了HTTP代理的HTTPS請求,與HTTP服務器建立通過HTTP代理的隧道連接,并完成TLS握手;
  • 設置了HTTP代理的HTTP/2請求,與HTTP服務器建立通過HTTP代理的隧道連接,并完成與服務器的TLS握手及協(xié)議協(xié)商;
  • 設置了SOCKS代理的HTTP請求,通過代理與HTTP服務器建立好連接;
  • 設置了SOCKS代理的HTTPS請求,通過代理與HTTP服務器建立好連接,并完成TLS握手;
  • 設置了SOCKS代理的HTTP/2請求,通過代理與HTTP服務器建立好連接,并完成與服務器的TLS握手及協(xié)議協(xié)商;
  • 無代理的HTTP請求,與服務器建立好TCP連接;
  • 無代理的HTTPS請求,與服務器建立TCP連接,并完成TLS握手;
  • 無代理的HTTP/2請求,與服務器建立好TCP連接,完成TLS握手及協(xié)議協(xié)商。

后面我們更詳細地來看一下這個過程。

ConnectInterceptor的代碼看上去比較簡單:

public final class ConnectInterceptor implements Interceptor {public final OkHttpClient client;public ConnectInterceptor(OkHttpClient client) {this.client = client;}@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, doExtensiveHealthChecks);RealConnection connection = streamAllocation.connection();return realChain.proceed(request, streamAllocation, httpCodec, connection);} }

ConnectInterceptor從RealInterceptorChain獲取前面的Interceptor傳過來的StreamAllocation對象,執(zhí)行 streamAllocation.newStream() 完成前述所有的連接建立工作,并將這個過程中創(chuàng)建的用于網(wǎng)絡IO的RealConnection對象,以及對于與服務器交互最為關鍵的HttpCodec等對象傳遞給后面的Interceptor,也就是CallServerInterceptor。

OkHttp3的連接池

在具體地分析 streamAllocation.newStream() 的執(zhí)行過程之前,我們先來看一下OkHttp3的連接池的設計實現(xiàn)。

OkHttp3將客戶端與服務器之間的連接抽象為Connection/RealConnection,為了管理這些連接的復用而設計了ConnectionPool。共享相同Address的請求可以復用連接,ConnectionPool實現(xiàn)了哪些連接保持打開狀態(tài)以備后用的策略。

ConnectionPool是什么?

借助于ConnectionPool的成員變量聲明來一窺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 {/*** Background threads are used to cleanup expired connections. There will be at most a single* thread running per connection pool. The thread pool executor permits the pool itself to be* garbage collected.*/private static final Executor executor = new ThreadPoolExecutor(0 /* corePoolSize */,Integer.MAX_VALUE /* maximumPoolSize */, 60L /* keepAliveTime */, TimeUnit.SECONDS,new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp ConnectionPool", true));/** The maximum number of idle connections for each address. */private final int maxIdleConnections;private final long keepAliveDurationNs;private final Runnable cleanupRunnable = new Runnable() {@Override public void run() {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<>();final RouteDatabase routeDatabase = new RouteDatabase();boolean cleanupRunning;

ConnectionPool的核心是RealConnection的容器,且是順序容器,而不是關聯(lián)容器。ConnectionPool用雙端隊列Deque<RealConnection>來保存它所管理的所有RealConnection。

ConnectionPool還會對連接池中最大的空閑連接數(shù)及連接的保活時間進行控制,maxIdleConnections和keepAliveDurationNs成員分別體現(xiàn)對最大空閑連接數(shù)及連接保活時間的控制。這種控制通過匿名的Runnable cleanupRunnable在線程池executor中執(zhí)行,并在向連接池中添加新的RealConnection觸發(fā)。

連接池ConnectionPool的創(chuàng)建

OkHttp3的用戶可以自行創(chuàng)建ConnectionPool,對最大空閑連接數(shù)及連接的保活時間進行配置,并在OkHttpClient創(chuàng)建期間,將其傳給OkHttpClient.Builder,在OkHttpClient中啟用它。沒有定制連接池的情況下,則在OkHttpClient.Builder構造過程中以默認參數(shù)創(chuàng)建:

public Builder() {dispatcher = new Dispatcher();protocols = DEFAULT_PROTOCOLS;connectionSpecs = DEFAULT_CONNECTION_SPECS;proxySelector = ProxySelector.getDefault();cookieJar = CookieJar.NO_COOKIES;socketFactory = SocketFactory.getDefault();hostnameVerifier = OkHostnameVerifier.INSTANCE;certificatePinner = CertificatePinner.DEFAULT;proxyAuthenticator = Authenticator.NONE;authenticator = Authenticator.NONE;connectionPool = new ConnectionPool();

ConnectionPool的默認構造過程如下:

/*** 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) {this.maxIdleConnections = maxIdleConnections;this.keepAliveDurationNs = timeUnit.toNanos(keepAliveDuration);// Put a floor on the keep alive duration, otherwise cleanup will spin loop.if (keepAliveDuration <= 0) {throw new IllegalArgumentException("keepAliveDuration <= 0: " + keepAliveDuration);}}

在默認情況下,ConnectionPool 最多保存 5個 處于空閑狀態(tài)的連接,且連接的默認保活時間為 5分鐘

RealConnection的存/取

OkHttp內部的組件可以通過put()方法向ConnectionPool中添加RealConnection:

void put(RealConnection connection) {assert (Thread.holdsLock(this));if (!cleanupRunning) {cleanupRunning = true;executor.execute(cleanupRunnable);}connections.add(connection);}

在向ConnectionPool中添加RealConnection時,若發(fā)現(xiàn)cleanupRunnable還沒有運行會觸發(fā)它的運行。

cleanupRunnable的職責本就是清理無效的RealConnection,只要ConnectionPool中存在RealConnection,則這種清理的需求總是存在的,因而這里會去啟動cleanupRunnable。

根據(jù)需要啟動了cleanupRunnable之后,將RealConnection添加進雙端隊列connections。

這里先啟動 cleanupRunnable,后向 connections 中添加RealConnection。有沒有可能發(fā)生:

啟動cleanupRunnable之后,向connections中添加RealConnection之前,執(zhí)行 put() 的線程被搶占,cleanupRunnable的線程被執(zhí)行,它發(fā)現(xiàn)connections中沒有任何RealConnection,于是從容地退出而導致后面添加的RealConnection永遠不會得得清理。

這樣的情況呢?答案是 不會。為什么呢?put()執(zhí)行之前總是會用ConnectionPool對象鎖來保護,而在ConnectionPool.cleanup()中,遍歷connections也總是會先對ConnectionPool對象加鎖保護的。即使執(zhí)行 put() 的線程被搶占,cleanupRunnable的線程也會由于拿不到ConnectionPool對象鎖而等待 put() 執(zhí)行結束。

OkHttp內部的組件可以通過 get() 方法從ConnectionPool中獲取RealConnection:

/** Returns a recycled connection to {@code address}, or null if no such connection exists. */RealConnection get(Address address, StreamAllocation streamAllocation) {assert (Thread.holdsLock(this));for (RealConnection connection : connections) {if (connection.allocations.size() < connection.allocationLimit&& address.equals(connection.route().address)&& !connection.noNewStreams) {streamAllocation.acquire(connection);return connection;}}return null;}

get() 方法遍歷 connections 中的所有 RealConnection 尋找同時滿足如下三個條件的RealConnection:

  • RealConnection的allocations的數(shù)量小于allocationLimit。每個allocation代表在該RealConnection上正在執(zhí)行的一個請求。這個條件用于控制相同連接上,同一時間執(zhí)行的并發(fā)請求的個數(shù)。對于HTTP/2連接而言,allocationLimit限制是在連接建立階段由雙方協(xié)商的。對于HTTP或HTTPS連接而言,這個值則總是1。從RealConnection.establishProtocol()可以清晰地看到這一點:

    if (protocol == Protocol.HTTP_2) {socket.setSoTimeout(0); // Framed connection timeouts are set per-stream.Http2Connection http2Connection = new Http2Connection.Builder(true).socket(socket, route.address().url().host(), source, sink).listener(this).build();http2Connection.start();// Only assign the framed connection once the preface has been sent successfully.this.allocationLimit = http2Connection.maxConcurrentStreams();this.http2Connection = http2Connection;} else {this.allocationLimit = 1;}
  • RealConnection 的 address 與傳入的 Address 參數(shù)相等。RealConnection 的 address 描述建立連接所需的配置信息,包括對端的信息等,不難理解只有所有相關配置相等時 RealConnection 才是真正能復用的。具體看一下Address相等性比較的依據(jù):@Override public boolean equals(Object other) {if (other instanceof Address) {Address that = (Address) other;return this.url.equals(that.url)&& this.dns.equals(that.dns)&& this.proxyAuthenticator.equals(that.proxyAuthenticator)&& this.protocols.equals(that.protocols)&& this.connectionSpecs.equals(that.connectionSpecs)&& this.proxySelector.equals(that.proxySelector)&& equal(this.proxy, that.proxy)&& equal(this.sslSocketFactory, that.sslSocketFactory)&& equal(this.hostnameVerifier, that.hostnameVerifier)&& equal(this.certificatePinner, that.certificatePinner);}return false; } 這種相等性的條件給人感覺還是蠻苛刻的,特別是對url的對比。
    這難免會讓我們有些擔心,對 Address 如此苛刻的相等性比較,又有多大的機會能復用連接呢?
    我們的擔心其實是多余的。只有在 StreamAllocation.findConnection() 中,會通過Internal.instance 調用 ConnectionPool.get() 來獲取 RealConnection :
private RealConnection findConnection(int connectTimeout, int readTimeout, int writeTimeout,boolean connectionRetryEnabled) throws IOException {Route selectedRoute;synchronized (connectionPool) {if (released) throw new IllegalStateException("released");if (codec != null) throw new IllegalStateException("codec != null");if (canceled) throw new IOException("Canceled");RealConnection allocatedConnection = this.connection;if (allocatedConnection != null && !allocatedConnection.noNewStreams) {return allocatedConnection;}// Attempt to get a connection from the pool.RealConnection pooledConnection = Internal.instance.get(connectionPool, address, this);if (pooledConnection != null) {this.connection = pooledConnection;return pooledConnection;}selectedRoute = route;}if (selectedRoute == null) {selectedRoute = routeSelector.next();synchronized (connectionPool) {route = selectedRoute;refusedStreamCount = 0;}}RealConnection newConnection = new RealConnection(selectedRoute);synchronized (connectionPool) {acquire(newConnection);Internal.instance.put(connectionPool, newConnection);this.connection = newConnection;if (canceled) throw new IOException("Canceled");}

Internal.instance的實現(xiàn)在OkHttpClient 中:

static {Internal.instance = new Internal() {@Override public void addLenient(Headers.Builder builder, String line) {builder.addLenient(line);}@Override public void addLenient(Headers.Builder builder, String name, String value) {builder.addLenient(name, value);}@Override public void setCache(OkHttpClient.Builder builder, InternalCache internalCache) {builder.setInternalCache(internalCache);}@Override public boolean connectionBecameIdle(ConnectionPool pool, RealConnection connection) {return pool.connectionBecameIdle(connection);}@Override public RealConnection get(ConnectionPool pool, Address address, StreamAllocation streamAllocation) {return pool.get(address, streamAllocation);}@Override public void put(ConnectionPool pool, RealConnection connection) {pool.put(connection);}@Override public RouteDatabase routeDatabase(ConnectionPool connectionPool) {return connectionPool.routeDatabase;}@Override public StreamAllocation callEngineGetStreamAllocation(Call call) {return ((RealCall) call).streamAllocation();}

可見 ConnectionPool.get() 的 Address 參數(shù)來自于StreamAllocation。StreamAllocation的Address 在構造時由外部傳入。構造了StreamAllocation對象的RetryAndFollowUpInterceptor,其構造Address的過程是這樣的:

private Address createAddress(HttpUrl url) {SSLSocketFactory sslSocketFactory = null;HostnameVerifier hostnameVerifier = null;CertificatePinner certificatePinner = null;if (url.isHttps()) {sslSocketFactory = client.sslSocketFactory();hostnameVerifier = client.hostnameVerifier();certificatePinner = client.certificatePinner();}return new Address(url.host(), url.port(), client.dns(), client.socketFactory(),sslSocketFactory, hostnameVerifier, certificatePinner, client.proxyAuthenticator(),client.proxy(), client.protocols(), client.connectionSpecs(), client.proxySelector());}

Address 除了 uriHost 和 uriPort 外的所有構造參數(shù)均來自于OkHttpClient,而Address的url 字段正是根據(jù)這兩個參數(shù)構造的:

public Address(String uriHost, int uriPort, Dns dns, SocketFactory socketFactory,SSLSocketFactory sslSocketFactory, HostnameVerifier hostnameVerifier,CertificatePinner certificatePinner, Authenticator proxyAuthenticator, Proxy proxy,List<Protocol> protocols, List<ConnectionSpec> connectionSpecs, ProxySelector proxySelector) {this.url = new HttpUrl.Builder().scheme(sslSocketFactory != null ? "https" : "http").host(uriHost).port(uriPort).build();

可見 Address 的 url 字段僅包含HTTP請求url的 schema + host + port 這三部分的信息,而不包含 path 和 query 等信息。ConnectionPool主要是根據(jù)服務器的地址來決定復用的。

  • RealConnection還有可分配的Stream。對于HTTP或HTTPS而言,不能同時在相同的連接上執(zhí)行多個請求。即使對于HTTP/2而言,StreamID的空間也是有限的,同一個連接上的StreamID總有分配完的時候,而在StreamID被分配完了之后,該連接就不能再被使用了。

OkHttp內部對ConnectionPool的訪問總是通過Internal.instance來進行。整個OkHttp中也只有StreamAllocation 存取了 ConnectionPool,也就是我們前面列出的StreamAllocation.findConnection() 方法,相關的組件之間的關系大體如下圖:


OkHttp Connection Pool

RealConnection的清理

ConnectionPool 中對于 RealConnection 的清理在put()方法中觸發(fā),執(zhí)行 cleanupRunnable 來完成清理動作:

private final Runnable cleanupRunnable = new Runnable() {@Override public void run() {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) {}}}}}};

cleanupRunnable每執(zhí)行一次清理動作,都會等待一段時間再次執(zhí)行,而具體等待的時長由cleanup()方法決定,直到cleanup()方法返回-1退出。cleanup()方法定義如下:

/*** Performs maintenance on this pool, evicting the connection that has been idle the longest if* either it has exceeded the keep alive limit or the idle connections limit.** <p>Returns the duration in nanos to sleep until the next scheduled call to this method. Returns* -1 if no further cleanups are required.*/long cleanup(long now) {int inUseConnectionCount = 0;int idleConnectionCount = 0;RealConnection longestIdleConnection = null;long longestIdleDurationNs = Long.MIN_VALUE;// Find either a connection to evict, or the time that the next eviction is due.synchronized (this) {for (Iterator<RealConnection> i = connections.iterator(); i.hasNext(); ) {RealConnection connection = i.next();// If the connection is in use, keep searching.if (pruneAndGetAllocationCount(connection, now) > 0) {inUseConnectionCount++;continue;}idleConnectionCount++;// If the connection is ready to be evicted, we're done.long idleDurationNs = now - connection.idleAtNanos;if (idleDurationNs > longestIdleDurationNs) {longestIdleDurationNs = idleDurationNs;longestIdleConnection = connection;}}if (longestIdleDurationNs >= this.keepAliveDurationNs|| idleConnectionCount > this.maxIdleConnections) {// We've found a connection to evict. Remove it from the list, then close it below (outside// of the synchronized block).connections.remove(longestIdleConnection);} else if (idleConnectionCount > 0) {// A connection will be ready to evict soon.return keepAliveDurationNs - longestIdleDurationNs;} else if (inUseConnectionCount > 0) {// All connections are in use. It'll be at least the keep alive duration 'til we run again.return keepAliveDurationNs;} else {// No connections, idle or in use.cleanupRunning = false;return -1;}}closeQuietly(longestIdleConnection.socket());// Cleanup again immediately.return 0;}/*** Prunes any leaked allocations and then returns the number of remaining live allocations on* {@code connection}. Allocations are leaked if the connection is tracking them but the* application code has abandoned them. Leak detection is imprecise and relies on garbage* collection.*/private int pruneAndGetAllocationCount(RealConnection connection, long now) {List<Reference<StreamAllocation>> references = connection.allocations;for (int i = 0; i < references.size(); ) {Reference<StreamAllocation> reference = references.get(i);if (reference.get() != null) {i++;continue;}// We've discovered a leaked allocation. This is an application bug.StreamAllocation.StreamAllocationReference streamAllocRef =(StreamAllocation.StreamAllocationReference) reference;String message = "A connection to " + connection.route().address().url()+ " was leaked. Did you forget to close a response body?";Platform.get().logCloseableLeak(message, streamAllocRef.callStackTrace);references.remove(i);connection.noNewStreams = true;// If this was the last allocation, the connection is eligible for immediate eviction.if (references.isEmpty()) {connection.idleAtNanos = now - keepAliveDurationNs;return 0;}}return references.size();}

cleanup()方法遍歷connections,并從中找到處于空閑狀態(tài)時間最長的一個RealConnection,然后根據(jù)查找結果的不同,分為以下幾種情況處理:

  • 找到一個處于空閑狀態(tài)的RealConnection,且該RealConnection處于空閑狀態(tài)的時間超出了設置的保活時間,或者當前ConnectionPool中處于空閑狀態(tài)的連接數(shù)超出了設置的最大空閑連接數(shù),將該RealConnection從connections中移除,并關閉該RealConnection關聯(lián)的底層socket,然后返回0,以此請求cleanupRunnable立即再次檢查所有的連接。
  • 找到一個處于空閑狀態(tài)的RealConnection,但該RealConnection處于空閑狀態(tài)的時間尚未超出設置的保活時間,且當前ConnectionPool中處于空閑狀態(tài)的連接數(shù)尚未超出設置的最大空閑連接數(shù),則返回保活時間與該RealConnection處于空閑狀態(tài)的時間之間的差值,請求cleanupRunnable等待這么長一段時間之后再次檢查所有的連接。
  • 沒有找到處于空閑狀態(tài)的連接,但找到了使用中的連接,則返回保活時間,請求cleanupRunnable等待這么長一段時間之后再次檢查所有的連接。
  • 沒有找到處于空閑狀態(tài)的連接,也沒有找到使用中的連接,也就意味著連接池中尚沒有任何連接,則將 cleanupRunning 置為false,并返回 -1,請求 cleanupRunnable 退出。

cleanup() 通過 pruneAndGetAllocationCount() 檢查正在使用一個特定連接的請求個數(shù),并以此來判斷一個連接是否處于空閑狀態(tài)。后者通遍歷 connection.allocations 并檢查每個元素的StreamAllocation 的狀態(tài),若StreamAllocation 為空,則認為是發(fā)現(xiàn)了一個leak,它會更新連接的空閑時間為當前時間減去保活時間并返回0,以此請求 cleanup() 立即關閉、清理掉該 leak 的連接。

ConnectionPool的用戶接口

OkHttp的用戶可以自己創(chuàng)建 ConnectionPool 對象,這個類也提供了一些用戶接口以方便用戶獲取空閑狀態(tài)的連接數(shù)、總的連接數(shù),以及手動清除空閑狀態(tài)的連接:

/** Returns the number of idle connections in the pool. */public synchronized int idleConnectionCount() {int total = 0;for (RealConnection connection : connections) {if (connection.allocations.isEmpty()) total++;}return total;}/*** Returns total number of connections in the pool. Note that prior to OkHttp 2.7 this included* only idle connections and HTTP/2 connections. Since OkHttp 2.7 this includes all connections,* both active and inactive. Use {@link #idleConnectionCount()} to count connections not currently* in use.*/public synchronized int connectionCount() {return connections.size();}....../** Close and remove all idle connections in the pool. */public void evictAll() {List<RealConnection> evictedConnections = new ArrayList<>();synchronized (this) {for (Iterator<RealConnection> i = connections.iterator(); i.hasNext(); ) {RealConnection connection = i.next();if (connection.allocations.isEmpty()) {connection.noNewStreams = true;evictedConnections.add(connection);i.remove();}}}for (RealConnection connection : evictedConnections) {closeQuietly(connection.socket());}}

新建流

回到新建流的過程,連接建立的各種細節(jié)處理都在這里。 StreamAllocation.newStream() 完成新建流的動作:

public HttpCodec newStream(OkHttpClient client, boolean doExtensiveHealthChecks) {int connectTimeout = client.connectTimeoutMillis();int readTimeout = client.readTimeoutMillis();int writeTimeout = client.writeTimeoutMillis();boolean connectionRetryEnabled = client.retryOnConnectionFailure();try {RealConnection resultConnection = findHealthyConnection(connectTimeout, readTimeout,writeTimeout, connectionRetryEnabled, doExtensiveHealthChecks);HttpCodec resultCodec;if (resultConnection.http2Connection != null) {resultCodec = new Http2Codec(client, this, resultConnection.http2Connection);} else {resultConnection.socket().setSoTimeout(readTimeout);resultConnection.source.timeout().timeout(readTimeout, MILLISECONDS);resultConnection.sink.timeout().timeout(writeTimeout, MILLISECONDS);resultCodec = new Http1Codec(client, this, resultConnection.source, resultConnection.sink);}synchronized (connectionPool) {codec = resultCodec;return resultCodec;}} catch (IOException e) {throw new RouteException(e);}}

所謂的流,是封裝了底層的IO,可以直接用來收發(fā)數(shù)據(jù)的組件,它會將請求的數(shù)據(jù)序列化之后發(fā)送到網(wǎng)絡,并將接收的數(shù)據(jù)反序列化為應用程序方便操作的格式。在 OkHttp3 中,這樣的組件被抽象為HttpCodec。HttpCodec的定義如下 (okhttp/okhttp/src/main/java/okhttp3/internal/http/HttpCodec.java):

/** Encodes HTTP requests and decodes HTTP responses. */ public interface HttpCodec {/*** The timeout to use while discarding a stream of input data. Since this is used for connection* reuse, this timeout should be significantly less than the time it takes to establish a new* connection.*/int DISCARD_STREAM_TIMEOUT_MILLIS = 100;/** Returns an output stream where the request body can be streamed. */Sink createRequestBody(Request request, long contentLength);/** This should update the HTTP engine's sentRequestMillis field. */void writeRequestHeaders(Request request) throws IOException;/** Flush the request to the underlying socket. */void finishRequest() throws IOException;/** Read and return response headers. */Response.Builder readResponseHeaders() throws IOException;/** Returns a stream that reads the response body. */ResponseBody openResponseBody(Response response) throws IOException;/*** Cancel this stream. Resources held by this stream will be cleaned up, though not synchronously.* That may happen later by the connection pool thread.*/void cancel(); }

HttpCodec提供了這樣的一些操作:

  • 為發(fā)送請求而提供的,寫入請求頭部。
  • 為發(fā)送請求而提供的,創(chuàng)建請求體,以用于發(fā)送請求體數(shù)據(jù)。
  • 為發(fā)送請求而提供的,結束請求發(fā)送。
  • 為獲得響應而提供的,讀取響應頭部。
  • 為獲得響應而提供的,打開請求體,以用于后續(xù)獲取請求體數(shù)據(jù)。
  • 取消請求執(zhí)行。

StreamAllocation.newStream() 主要做的事情正是創(chuàng)建HttpCodec。StreamAllocation.newStream() 根據(jù) OkHttpClient中的設置,連接超時、讀超時、寫超時及連接失敗是否重試,調用 findHealthyConnection() 完成 連接,即RealConnection 的創(chuàng)建。然后根據(jù)HTTP協(xié)議的版本創(chuàng)建Http1Codec或Http2Codec。

findHealthyConnection() 根據(jù)目標服務器地址查找一個連接,如果它是可用的就直接返回,如果不可用則會重復查找直到找到一個可用的為止。在連接已被破壞而不可用時,還會釋放連接:

/*** Finds a connection and returns it if it is healthy. If it is unhealthy the process is repeated* until a healthy connection is found.*/private RealConnection findHealthyConnection(int connectTimeout, int readTimeout,int writeTimeout, boolean connectionRetryEnabled, boolean doExtensiveHealthChecks)throws IOException {while (true) {RealConnection candidate = findConnection(connectTimeout, readTimeout, writeTimeout,connectionRetryEnabled);// If this is a brand new connection, we can skip the extensive health checks.synchronized (connectionPool) {if (candidate.successCount == 0) {return candidate;}}// Do a (potentially slow) check to confirm that the pooled connection is still good. If it// isn't, take it out of the pool and start again.if (!candidate.isHealthy(doExtensiveHealthChecks)) {noNewStreams();continue;}return candidate;}}

連接是否可用的標準如下 (okhttp/okhttp/src/main/java/okhttp3/internal/connection/RealConnection.java):

/** Returns true if this connection is ready to host new streams. */public boolean isHealthy(boolean doExtensiveChecks) {if (socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown()) {return false;}if (http2Connection != null) {return true; // TODO: check framedConnection.shutdown.}if (doExtensiveChecks) {try {int readTimeout = socket.getSoTimeout();try {socket.setSoTimeout(1);if (source.exhausted()) {return false; // Stream is exhausted; socket is closed.}return true;} finally {socket.setSoTimeout(readTimeout);}} catch (SocketTimeoutException ignored) {// Read timed out; socket is good.} catch (IOException e) {return false; // Couldn't read; socket is closed.}}return true;}

首先要可以進行IO,此外對于HTTP/2,只要http2Connection存在即可。如我們前面在ConnectInterceptor 中看到的,如果HTTP請求的method不是 "GET" ,doExtensiveChecks為true時,需要做額外的檢查。

findHealthyConnection() 通過 findConnection()查找一個連接:

/*** 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,boolean connectionRetryEnabled) throws IOException {Route selectedRoute;synchronized (connectionPool) {if (released) throw new IllegalStateException("released");if (codec != null) throw new IllegalStateException("codec != null");if (canceled) throw new IOException("Canceled");RealConnection allocatedConnection = this.connection;if (allocatedConnection != null && !allocatedConnection.noNewStreams) {return allocatedConnection;}// Attempt to get a connection from the pool.RealConnection pooledConnection = Internal.instance.get(connectionPool, address, this);if (pooledConnection != null) {this.connection = pooledConnection;return pooledConnection;}selectedRoute = route;}if (selectedRoute == null) {selectedRoute = routeSelector.next();synchronized (connectionPool) {route = selectedRoute;refusedStreamCount = 0;}}RealConnection newConnection = new RealConnection(selectedRoute);synchronized (connectionPool) {acquire(newConnection);Internal.instance.put(connectionPool, newConnection);this.connection = newConnection;if (canceled) throw new IOException("Canceled");}newConnection.connect(connectTimeout, readTimeout, writeTimeout, address.connectionSpecs(),connectionRetryEnabled);routeDatabase().connected(newConnection.route());return newConnection;}

findConnection() 返回一個用于流執(zhí)行底層IO的連接。這個方法優(yōu)先復用已經(jīng)創(chuàng)建的連接;在沒有可復用連接的情況下新建一個。

在同一次 newStream() 的執(zhí)行過程中,有沒有可能兩次執(zhí)行 findConnection() ,第一次connection 字段為空,第二次不為空?這個地方對connection字段的檢查,看起來有點多余。執(zhí)行 findConnection() 時,connection 不為空的話,意味著 codec 不為空,而在方法的開始處已經(jīng)有對codec字段的狀態(tài)做過檢查。真的是這樣的嗎?

答案當然是否定的。同一次 newStream() 的執(zhí)行過程中,沒有可能兩次執(zhí)行findConnection(),第一次connection字段為空,第二次不為空,然而一個HTTP請求的執(zhí)行過程,又不是一定只調用一次newStream()。

newStream()的直接調用者是ConnectInterceptor,所有的Interceptor用RealInterceptorChain鏈起來,在Interceptor鏈中,ConnectInterceptor 和RetryAndFollowUpInterceptor 隔著 CacheInterceptor 和 BridgeInterceptor 。然而newStream() 如果出錯的話,則是會通過拋出Exception返回到RetryAndFollowUpInterceptor 來處理錯誤的。

RetryAndFollowUpInterceptor 中會嘗試基于相同的 StreamAllocation 對象來恢復對HTTP請求的處理。RetryAndFollowUpInterceptor 通過 hasMoreRoutes() 等方法,來檢查StreamAllocation 對象的狀態(tài),通過 streamFailed(IOException e)、release()、streamFinished(boolean noNewStreams, HttpCodec codec)等方法來reset StreamAllocation對象的一些狀態(tài)。

回到StreamAllocation的 findConnection()方法。沒有連接存在,且連接池中也沒有找到所需的連接時,它會新建一個連接。通過如下的步驟新建連接:

  • 為連接選擇一個Route。
  • 新建一個RealConnection對象。public RealConnection(Route route) {this.route = route; }
  • 將當前StreamAllocation對象的引用保存進RealConnection的allocations。如我們前面在分析ConnectionPool時所見的那樣,這主要是為了追蹤RealConnection。/*** Use this allocation to hold {@code connection}. Each call to this must be paired with a call to* {@link #release} on the same connection.*/ public void acquire(RealConnection connection) {assert (Thread.holdsLock(connectionPool));connection.allocations.add(new StreamAllocationReference(this, callStackTrace)); }
  • 將RealConnection保存進連接池。
  • 保存對RealConnection的引用。
  • 檢查請求是否被取消,若取消,則拋出異常。
  • 建立連接。
  • 更新RouteDatabase中Route的狀態(tài)。

ConnectionSpec

在OkHttp中,ConnectionSpec用于描述傳輸HTTP流量的socket連接的配置。對于https請求,這些配置主要包括協(xié)商安全連接時要使用的TLS版本號和密碼套件,是否支持TLS擴展等;對于http請求則幾乎不包含什么信息。

OkHttp有預定義幾組ConnectionSpec (okhttp/okhttp/src/main/java/okhttp3/ConnectionSpec.java):

/** A modern TLS connection with extensions like SNI and ALPN available. */public static final ConnectionSpec MODERN_TLS = new Builder(true).cipherSuites(APPROVED_CIPHER_SUITES).tlsVersions(TlsVersion.TLS_1_2, TlsVersion.TLS_1_1, TlsVersion.TLS_1_0).supportsTlsExtensions(true).build();/** A backwards-compatible fallback connection for interop with obsolete servers. */public static final ConnectionSpec COMPATIBLE_TLS = new Builder(MODERN_TLS).tlsVersions(TlsVersion.TLS_1_0).supportsTlsExtensions(true).build();/** Unencrypted, unauthenticated connections for {@code http:} URLs. */public static final ConnectionSpec CLEARTEXT = new Builder(false).build();

預定義的這些ConnectionSpec被組織為默認ConnectionSpec集合 (okhttp/okhttp/src/main/java/okhttp3/OkHttpClient.java):

public class OkHttpClient implements Cloneable, Call.Factory {private static final List<Protocol> DEFAULT_PROTOCOLS = Util.immutableList(Protocol.HTTP_2, Protocol.HTTP_1_1);private static final List<ConnectionSpec> DEFAULT_CONNECTION_SPECS = Util.immutableList(ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS, ConnectionSpec.CLEARTEXT);

OkHttp中由OkHttpClient管理ConnectionSpec集合 。OkHttp的用戶可以在構造OkHttpClient的過程中提供自己的ConnectionSpec集合。默認情況下OkHttpClient會使用前面看到的默認ConnectionSpec集合。

在RetryAndFollowUpInterceptor中創(chuàng)建Address時,ConnectionSpec集合被從OkHttpClient獲取,并由Address引用。

OkHttp還提供了ConnectionSpecSelector,用以從ConnectionSpec集合中選擇與SSLSocket匹配的ConnectionSpec,并對SSLSocket做配置的操作。

在StreamAllocation的findConnection()中,ConnectionSpec集合被從Address中取出來,以用于連接建立過程。

建立連接

回到連接建立的過程。RealConnection.connect()執(zhí)行連接建立的過程(okhttp/okhttp/src/main/java/okhttp3/internal/connection/RealConnection.java):

public void connect(int connectTimeout, int readTimeout, int writeTimeout,List<ConnectionSpec> connectionSpecs, boolean connectionRetryEnabled) {if (protocol != null) throw new IllegalStateException("already connected");RouteException routeException = null;ConnectionSpecSelector connectionSpecSelector = new ConnectionSpecSelector(connectionSpecs);if (route.address().sslSocketFactory() == null) {if (!connectionSpecs.contains(ConnectionSpec.CLEARTEXT)) {throw new RouteException(new UnknownServiceException("CLEARTEXT communication not enabled for client"));}String host = route.address().url().host();if (!Platform.get().isCleartextTrafficPermitted(host)) {throw new RouteException(new UnknownServiceException("CLEARTEXT communication to " + host + " not permitted by network security policy"));}}while (protocol == null) {try {if (route.requiresTunnel()) {buildTunneledConnection(connectTimeout, readTimeout, writeTimeout,connectionSpecSelector);} else {buildConnection(connectTimeout, readTimeout, writeTimeout, connectionSpecSelector);}} catch (IOException e) {closeQuietly(socket);closeQuietly(rawSocket);socket = null;rawSocket = null;source = null;sink = null;handshake = null;protocol = null;if (routeException == null) {routeException = new RouteException(e);} else {routeException.addConnectException(e);}if (!connectionRetryEnabled || !connectionSpecSelector.connectionFailed(e)) {throw routeException;}}}}

這里的執(zhí)行過程大體如下:

  • 檢查連接是否已經(jīng)建立,若已經(jīng)建立,則拋出異常,否則繼續(xù)執(zhí)行。連接是否建立由protocol 標識,它表示在整個連接建立,及可能的協(xié)議協(xié)商過程中選擇的所要使用的協(xié)議。
  • 根據(jù)ConnectionSpec集合connectionSpecs構造ConnectionSpecSelector。
  • 若請求不是安全的請求,會對請求再執(zhí)行一些額外的限制。這些限制包括:
    • ConnectionSpec集合中必須要包含ConnectionSpec.CLEARTEXT。這也就是說,OkHttp的用戶可以通過為OkHttpClient設置不包含ConnectionSpec.CLEARTEXT的ConnectionSpec集合來禁用所有的明文請求。
    • 平臺本身的安全策略允許向相應的主機發(fā)送明文請求。對于Android平臺而言,這種安全策略主要由系統(tǒng)的組件android.security.NetworkSecurityPolicy執(zhí)行 (okhttp/okhttp/src/main/java/okhttp3/internal/platform/AndroidPlatform.java):@Override public boolean isCleartextTrafficPermitted(String hostname) { try {Class<?> networkPolicyClass = Class.forName("android.security.NetworkSecurityPolicy");Method getInstanceMethod = networkPolicyClass.getMethod("getInstance");Object networkSecurityPolicy = getInstanceMethod.invoke(null);Method isCleartextTrafficPermittedMethod = networkPolicyClass.getMethod("isCleartextTrafficPermitted", String.class);return (boolean) isCleartextTrafficPermittedMethod.invoke(networkSecurityPolicy, hostname); } catch (ClassNotFoundException | NoSuchMethodException e) {return super.isCleartextTrafficPermitted(hostname); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {throw new AssertionError(); } } 平臺的這種安全策略并不是每個Android版本都有的。Android 6.0之后存在這種控制。
  • 根據(jù)請求是否需要建立隧道連接,而分別執(zhí)行buildTunneledConnection() 和 buildConnection()。是否需要建立隧道連接的依據(jù)為 (okhttp/okhttp/src/main/java/okhttp3/Route.java):/*** Returns true if this route tunnels HTTPS through an HTTP proxy. See <a* href="http://www.ietf.org/rfc/rfc2817.txt">RFC 2817, Section 5.2</a>.*/ public boolean requiresTunnel() {return address.sslSocketFactory != null && proxy.type() == Proxy.Type.HTTP; } 即對于設置了HTTP代理,且安全的連接 (SSL) 需要請求代理服務器建立一個到目標HTTP服務器的隧道連接,客戶端與HTTP代理建立TCP連接,以此請求HTTP代理服務在客戶端與HTTP服務器之間進行數(shù)據(jù)的盲轉發(fā)。

建立隧道連接

建立隧道連接的過程如下:

  • 構造一個 建立隧道連接 請求。
  • 與HTTP代理服務器建立TCP連接。
  • 創(chuàng)建隧道。這主要是將 建立隧道連接 請求發(fā)送給HTTP代理服務器,并處理它的響應。
  • 重復上面的第2和第3步,知道建立好了隧道連接。至于為什么要重復多次,及關于代理認證的內容,可以參考代理協(xié)議相關的內容。
  • 建立協(xié)議。
  • 關于建立隧道連接更詳細的過程可參考 OkHttp3中的代理與路由 的相關部分。

    建立普通連接

    建立普通連接的過程比較直接:

    /** Does all the work necessary to build a full HTTP or HTTPS connection on a raw socket. */private void buildConnection(int connectTimeout, int readTimeout, int writeTimeout,ConnectionSpecSelector connectionSpecSelector) throws IOException {connectSocket(connectTimeout, readTimeout);establishProtocol(readTimeout, writeTimeout, connectionSpecSelector);}
  • 建立一個TCP連接。
  • 建立協(xié)議。
  • 更詳細的過程可參考 OkHttp3中的代理與路由 的相關部分。

    建立協(xié)議

    不管是建立隧道連接,還是建立普通連接,都少不了 建立協(xié)議 這一步。這一步是在建立好了TCP連接之后,而在該TCP能被拿來收發(fā)數(shù)據(jù)之前執(zhí)行的。它主要為數(shù)據(jù)的加密傳輸做一些初始化,比如TLS握手,HTTP/2的協(xié)議協(xié)商等。

    private void establishProtocol(int readTimeout, int writeTimeout,ConnectionSpecSelector connectionSpecSelector) throws IOException {if (route.address().sslSocketFactory() != null) {connectTls(readTimeout, writeTimeout, connectionSpecSelector);} else {protocol = Protocol.HTTP_1_1;socket = rawSocket;}if (protocol == Protocol.HTTP_2) {socket.setSoTimeout(0); // Framed connection timeouts are set per-stream.Http2Connection http2Connection = new Http2Connection.Builder(true).socket(socket, route.address().url().host(), source, sink).listener(this).build();http2Connection.start();// Only assign the framed connection once the preface has been sent successfully.this.allocationLimit = http2Connection.maxConcurrentStreams();this.http2Connection = http2Connection;} else {this.allocationLimit = 1;}}
  • 對于加密的數(shù)據(jù)傳輸,創(chuàng)建TLS連接。對于明文傳輸,則設置protocol和socket。
    socket指向直接與應用層,如HTTP或HTTP/2,交互的Socket:
    對于明文傳輸沒有設置HTTP代理的HTTP請求,它是與HTTP服務器之間的TCP socket;
    對于明文傳輸設置了HTTP代理或SOCKS代理的HTTP請求,它是與代理服務器之間的TCP socket;
    對于加密傳輸沒有設置HTTP代理服務器的HTTP或HTTP2請求,它是與HTTP服務器之間的SSLScoket;
    對于加密傳輸設置了HTTP代理服務器的HTTP或HTTP2請求,它是與HTTP服務器之間經(jīng)過了代理服務器的SSLSocket,一個隧道連接;
    對于加密傳輸設置了SOCKS代理的HTTP或HTTP2請求,它是一條經(jīng)過了代理服務器的SSLSocket連接。

  • 對于HTTP/2,會建立HTTP/2連接,并進一步協(xié)商連接參數(shù),如連接上可同時執(zhí)行的并發(fā)請求數(shù)等。而對于非HTTP/2,則將連接上可同時執(zhí)行的并發(fā)請求數(shù)設置為1。

  • 建立TLS連接

    進一步來看建立協(xié)議過程中,為安全請求所做的建立TLS連接的過程:

    private void connectTls(int readTimeout, int writeTimeout,ConnectionSpecSelector connectionSpecSelector) throws IOException {Address address = route.address();SSLSocketFactory sslSocketFactory = address.sslSocketFactory();boolean success = false;SSLSocket sslSocket = null;try {// Create the wrapper over the connected socket.sslSocket = (SSLSocket) sslSocketFactory.createSocket(rawSocket, address.url().host(), address.url().port(), true /* autoClose */);// Configure the socket's ciphers, TLS versions, and extensions.ConnectionSpec connectionSpec = connectionSpecSelector.configureSecureSocket(sslSocket);if (connectionSpec.supportsTlsExtensions()) {Platform.get().configureTlsExtensions(sslSocket, address.url().host(), address.protocols());}// Force handshake. This can throw!sslSocket.startHandshake();Handshake unverifiedHandshake = Handshake.get(sslSocket.getSession());// Verify that the socket's certificates are acceptable for the target host.if (!address.hostnameVerifier().verify(address.url().host(), sslSocket.getSession())) {X509Certificate cert = (X509Certificate) unverifiedHandshake.peerCertificates().get(0);throw new SSLPeerUnverifiedException("Hostname " + address.url().host() + " not verified:"+ "\n certificate: " + CertificatePinner.pin(cert)+ "\n DN: " + cert.getSubjectDN().getName()+ "\n subjectAltNames: " + OkHostnameVerifier.allSubjectAltNames(cert));}// Check that the certificate pinner is satisfied by the certificates presented.address.certificatePinner().check(address.url().host(),unverifiedHandshake.peerCertificates());// Success! Save the handshake and the ALPN protocol.String maybeProtocol = connectionSpec.supportsTlsExtensions()? Platform.get().getSelectedProtocol(sslSocket): null;socket = sslSocket;source = Okio.buffer(Okio.source(socket));sink = Okio.buffer(Okio.sink(socket));handshake = unverifiedHandshake;protocol = maybeProtocol != null? Protocol.get(maybeProtocol): Protocol.HTTP_1_1;success = true;} catch (AssertionError e) {if (Util.isAndroidGetsocknameError(e)) throw new IOException(e);throw e;} finally {if (sslSocket != null) {Platform.get().afterHandshake(sslSocket);}if (!success) {closeQuietly(sslSocket);}}}

    TLS連接是對原始的TCP連接的一個封裝,以提供TLS握手,及數(shù)據(jù)收發(fā)過程中的加密解密等功能。在Java中,用SSLSocket來描述。上面建立TLS連接的過程大體為:

  • 用SSLSocketFactory基于原始的TCP Socket,創(chuàng)建一個SSLSocket。
  • 配置SSLSocket。
  • 在前面選擇的ConnectionSpec支持TLS擴展參數(shù)時,配置TLS擴展參數(shù)。
  • 啟動TLS握手。
  • TLS握手完成之后,獲取握手信息。
  • 對TLS握手過程中傳回來的證書進行驗證。
  • 檢查證書釘扎。
  • 在前面選擇的ConnectionSpec支持TLS擴展參數(shù)時,獲取TLS握手過程中順便完成的協(xié)議協(xié)商過程所選擇的協(xié)議。這個過程主要用于HTTP/2的ALPN擴展。
  • OkHttp主要使用Okio來做IO操作,這里會基于前面獲取的SSLSocket創(chuàng)建用于執(zhí)行IO的BufferedSource和BufferedSink等,并保存握手信息及所選擇的協(xié)議。
  • 具體來看ConnectionSpecSelector中配置SSLSocket的過程:

    /*** Configures the supplied {@link SSLSocket} to connect to the specified host using an appropriate* {@link ConnectionSpec}. Returns the chosen {@link ConnectionSpec}, never {@code null}.** @throws IOException if the socket does not support any of the TLS modes available*/public ConnectionSpec configureSecureSocket(SSLSocket sslSocket) throws IOException {ConnectionSpec tlsConfiguration = null;for (int i = nextModeIndex, size = connectionSpecs.size(); i < size; i++) {ConnectionSpec connectionSpec = connectionSpecs.get(i);if (connectionSpec.isCompatible(sslSocket)) {tlsConfiguration = connectionSpec;nextModeIndex = i + 1;break;}}if (tlsConfiguration == null) {// This may be the first time a connection has been attempted and the socket does not support// any the required protocols, or it may be a retry (but this socket supports fewer// protocols than was suggested by a prior socket).throw new UnknownServiceException("Unable to find acceptable protocols. isFallback=" + isFallback+ ", modes=" + connectionSpecs+ ", supported protocols=" + Arrays.toString(sslSocket.getEnabledProtocols()));}isFallbackPossible = isFallbackPossible(sslSocket);Internal.instance.apply(tlsConfiguration, sslSocket, isFallback);return tlsConfiguration;}

    這個過程分為如下的兩個步驟:

  • 從為OkHttp配置的ConnectionSpec集合中選擇一個與SSLSocket兼容的一個。SSLSocket與ConnectionSpec兼容的標準如下:

    public boolean isCompatible(SSLSocket socket) { if (!tls) {return false; }if (tlsVersions != null&& !nonEmptyIntersection(tlsVersions, socket.getEnabledProtocols())) {return false; }if (cipherSuites != null&& !nonEmptyIntersection(cipherSuites, socket.getEnabledCipherSuites())) {return false; }return true; }/** * An N*M intersection that terminates if any intersection is found. The sizes of both arguments * are assumed to be so small, and the likelihood of an intersection so great, that it is not * worth the CPU cost of sorting or the memory cost of hashing. */ private static boolean nonEmptyIntersection(String[] a, String[] b) { if (a == null || b == null || a.length == 0 || b.length == 0) {return false; } for (String toFind : a) {if (indexOf(b, toFind) != -1) {return true;} } return false; }

    即ConnectionSpec啟用的TLS版本及密碼套件,與SSLSocket啟用的有交集。
    2 將選擇的ConnectionSpec應用在SSLSocket上。OkHttpClient中ConnectionSpec的應用:

    @Overridepublic void apply(ConnectionSpec tlsConfiguration, SSLSocket sslSocket, boolean isFallback) {tlsConfiguration.apply(sslSocket, isFallback);}

    而在ConnectionSpec中:

    /** Applies this spec to {@code sslSocket}. */ void apply(SSLSocket sslSocket, boolean isFallback) { ConnectionSpec specToApply = supportedSpec(sslSocket, isFallback);if (specToApply.tlsVersions != null) {sslSocket.setEnabledProtocols(specToApply.tlsVersions); } if (specToApply.cipherSuites != null) {sslSocket.setEnabledCipherSuites(specToApply.cipherSuites); } }/** * Returns a copy of this that omits cipher suites and TLS versions not enabled by {@code * sslSocket}. */ private ConnectionSpec supportedSpec(SSLSocket sslSocket, boolean isFallback) { String[] cipherSuitesIntersection = cipherSuites != null? intersect(String.class, cipherSuites, sslSocket.getEnabledCipherSuites()): sslSocket.getEnabledCipherSuites(); String[] tlsVersionsIntersection = tlsVersions != null? intersect(String.class, tlsVersions, sslSocket.getEnabledProtocols()): sslSocket.getEnabledProtocols();// In accordance with https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00 // the SCSV cipher is added to signal that a protocol fallback has taken place. if (isFallback && indexOf(sslSocket.getSupportedCipherSuites(), "TLS_FALLBACK_SCSV") != -1) {cipherSuitesIntersection = concat(cipherSuitesIntersection, "TLS_FALLBACK_SCSV"); }return new Builder(this).cipherSuites(cipherSuitesIntersection).tlsVersions(tlsVersionsIntersection).build(); }

    主要是:

    • 求得ConnectionSpec啟用的TLS版本及密碼套件與SSLSocket啟用的TLS版本及密碼套件之間的交集,構造新的ConnectionSpec。
    • 重新為SSLSocket設置啟用的TLS版本及密碼套件為上一步求得的交集。
  • 我們知道HTTP/2的協(xié)議協(xié)商主要是利用了TLS的ALPN擴展來完成的。這里再來詳細的看一下配置TLS擴展的過程。對于Android平臺而言,這部分邏輯在AndroidPlatform:

    @Override public void configureTlsExtensions(SSLSocket sslSocket, String hostname, List<Protocol> protocols) {// Enable SNI and session tickets.if (hostname != null) {setUseSessionTickets.invokeOptionalWithoutCheckedException(sslSocket, true);setHostname.invokeOptionalWithoutCheckedException(sslSocket, hostname);}// Enable ALPN.if (setAlpnProtocols != null && setAlpnProtocols.isSupported(sslSocket)) {Object[] parameters = {concatLengthPrefixed(protocols)};setAlpnProtocols.invokeWithoutCheckedException(sslSocket, parameters);}}

    TLS擴展相關的方法不是SSLSocket接口的標準方法,不同的SSL/TLS實現(xiàn)庫對這些接口的支持程度不一樣,因而這里通過反射機制調用TLS擴展相關的方法。

    這里主要配置了3個TLS擴展,分別是session tickets,SNI和ALPN。session tickets用于會話回復,SNI用于支持單個主機配置了多個域名的情況,ALPN則用于HTTP/2的協(xié)議協(xié)商。可以看到為SNI設置的hostname最終來源于Url,也就意味著使用HttpDns時,如果直接將IP地址替換原來Url中的域名來發(fā)起HTTPS請求的話,SNI將是IP地址,這有可能使服務器下發(fā)不恰當?shù)淖C書。

    TLS擴展相關方法的OptionalMethod創(chuàng)建過程也在AndroidPlatform中:

    public AndroidPlatform(Class<?> sslParametersClass, OptionalMethod<Socket> setUseSessionTickets,OptionalMethod<Socket> setHostname, OptionalMethod<Socket> getAlpnSelectedProtocol,OptionalMethod<Socket> setAlpnProtocols) {this.sslParametersClass = sslParametersClass;this.setUseSessionTickets = setUseSessionTickets;this.setHostname = setHostname;this.getAlpnSelectedProtocol = getAlpnSelectedProtocol;this.setAlpnProtocols = setAlpnProtocols;}......public static Platform buildIfSupported() {// Attempt to find Android 2.3+ APIs.try {Class<?> sslParametersClass;try {sslParametersClass = Class.forName("com.android.org.conscrypt.SSLParametersImpl");} catch (ClassNotFoundException e) {// Older platform before being unbundled.sslParametersClass = Class.forName("org.apache.harmony.xnet.provider.jsse.SSLParametersImpl");}OptionalMethod<Socket> setUseSessionTickets = new OptionalMethod<>(null, "setUseSessionTickets", boolean.class);OptionalMethod<Socket> setHostname = new OptionalMethod<>(null, "setHostname", String.class);OptionalMethod<Socket> getAlpnSelectedProtocol = null;OptionalMethod<Socket> setAlpnProtocols = null;// Attempt to find Android 5.0+ APIs.try {Class.forName("android.net.Network"); // Arbitrary class added in Android 5.0.getAlpnSelectedProtocol = new OptionalMethod<>(byte[].class, "getAlpnSelectedProtocol");setAlpnProtocols = new OptionalMethod<>(null, "setAlpnProtocols", byte[].class);} catch (ClassNotFoundException ignored) {}return new AndroidPlatform(sslParametersClass, setUseSessionTickets, setHostname,getAlpnSelectedProtocol, setAlpnProtocols);} catch (ClassNotFoundException ignored) {// This isn't an Android runtime.}return null;}

    建立TLS連接的第7步,獲取協(xié)議的過程與配置TLS的過程類似,同樣利用反射調用SSLSocket的方法,在AndroidPlatform中:

    @Override public String getSelectedProtocol(SSLSocket socket) {if (getAlpnSelectedProtocol == null) return null;if (!getAlpnSelectedProtocol.isSupported(socket)) return null;byte[] alpnResult = (byte[]) getAlpnSelectedProtocol.invokeWithoutCheckedException(socket);return alpnResult != null ? new String(alpnResult, Util.UTF_8) : null;}

    至此我們分析了OkHttp3中,所有HTTP請求,包括設置了代理的明文HTTP請求,設置了代理的HTTPS請求,設置了代理的HTTP/2請求,無代理的明文HTTP請求,無代理的HTTPS請求,無代理的HTTP/2請求的連接建立過程,其中包括TLS的握手,HTTP/2的協(xié)議協(xié)商等。

    總結一下,OkHttp中,IO相關的組件的其關系大體如下圖所示:


    Connection Component

    Done。

    總結

    以上是生活随笔為你收集整理的OkHttp3的连接池及连接建立过程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    欧美肥老太牲交大战 | 88国产精品欧美一区二区三区 | 少妇激情av一区二区 | 一本大道久久东京热无码av | 小鲜肉自慰网站xnxx | 麻豆国产97在线 | 欧洲 | 中文字幕乱妇无码av在线 | 国产精品亚洲专区无码不卡 | 无码国产乱人伦偷精品视频 | 日本大香伊一区二区三区 | 伊人久久大香线蕉午夜 | 亚洲国产精品成人久久蜜臀 | 无码人妻出轨黑人中文字幕 | 中文字幕乱码亚洲无线三区 | 国产精品鲁鲁鲁 | 高潮毛片无遮挡高清免费 | 日本一卡2卡3卡四卡精品网站 | 无码人妻久久一区二区三区不卡 | 亚洲精品久久久久avwww潮水 | 国产黄在线观看免费观看不卡 | 丰满少妇熟乱xxxxx视频 | 亚洲乱码国产乱码精品精 | 欧美一区二区三区视频在线观看 | 日韩精品成人一区二区三区 | 好男人www社区 | 欧美老妇与禽交 | 久久天天躁夜夜躁狠狠 | 娇妻被黑人粗大高潮白浆 | 中文字幕中文有码在线 | 人妻天天爽夜夜爽一区二区 | 亚洲欧美中文字幕5发布 | 国产av人人夜夜澡人人爽麻豆 | 国产人妻人伦精品1国产丝袜 | 亚洲日韩av一区二区三区中文 | 自拍偷自拍亚洲精品10p | 99久久人妻精品免费一区 | 一个人看的www免费视频在线观看 | 久久综合久久自在自线精品自 | аⅴ资源天堂资源库在线 | 久久久久亚洲精品中文字幕 | 久久久久久久人妻无码中文字幕爆 | 小sao货水好多真紧h无码视频 | 国产精品国产三级国产专播 | 最近免费中文字幕中文高清百度 | 狠狠色噜噜狠狠狠7777奇米 | 色婷婷综合中文久久一本 | 国产精品理论片在线观看 | 黑人巨大精品欧美一区二区 | 久久午夜无码鲁丝片秋霞 | 东京热一精品无码av | 131美女爱做视频 | 亚洲一区二区三区香蕉 | 国产精品鲁鲁鲁 | 久久久www成人免费毛片 | 东京无码熟妇人妻av在线网址 | 麻豆md0077饥渴少妇 | 国产特级毛片aaaaaaa高清 | 精品午夜福利在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品人妻一区二区三区四 | 欧美猛少妇色xxxxx | 国产精品人人妻人人爽 | 国产精品久久久久9999小说 | 国产精品亚洲一区二区三区喷水 | 欧美成人家庭影院 | 久久久久久九九精品久 | 在线观看国产一区二区三区 | 免费无码一区二区三区蜜桃大 | 麻豆精品国产精华精华液好用吗 | 亚洲精品美女久久久久久久 | 国产在线精品一区二区高清不卡 | 国产97人人超碰caoprom | 国产av久久久久精东av | 捆绑白丝粉色jk震动捧喷白浆 | 国产真人无遮挡作爱免费视频 | 成人免费视频视频在线观看 免费 | 日本xxxx色视频在线观看免费 | 久久综合久久自在自线精品自 | 久久天天躁狠狠躁夜夜免费观看 | 天堂亚洲2017在线观看 | 欧美日韩在线亚洲综合国产人 | 中文字幕精品av一区二区五区 | 夫妻免费无码v看片 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 天天拍夜夜添久久精品 | 色一情一乱一伦一区二区三欧美 | 学生妹亚洲一区二区 | 久在线观看福利视频 | 图片小说视频一区二区 | 丰腴饱满的极品熟妇 | 成人欧美一区二区三区黑人 | 狠狠色噜噜狠狠狠7777奇米 | 国产精品欧美成人 | 国产人妻大战黑人第1集 | 色噜噜亚洲男人的天堂 | 2020最新国产自产精品 | 国产绳艺sm调教室论坛 | 国产成人一区二区三区别 | 亚洲精品一区三区三区在线观看 | 永久黄网站色视频免费直播 | 免费看少妇作爱视频 | 亚洲中文字幕乱码av波多ji | 国产精品爱久久久久久久 | 宝宝好涨水快流出来免费视频 | 欧美黑人巨大xxxxx | 日韩欧美成人免费观看 | 亚洲欧美综合区丁香五月小说 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 九月婷婷人人澡人人添人人爽 | 波多野42部无码喷潮在线 | 99久久久国产精品无码免费 | 波多野结衣乳巨码无在线观看 | 国产乱码精品一品二品 | 亚洲大尺度无码无码专区 | 国产97人人超碰caoprom | 久久久久久久人妻无码中文字幕爆 | 国产一区二区不卡老阿姨 | 一本加勒比波多野结衣 | 精品日本一区二区三区在线观看 | 日本精品高清一区二区 | 狂野欧美性猛交免费视频 | 嫩b人妻精品一区二区三区 | 骚片av蜜桃精品一区 | a在线观看免费网站大全 | 精品国偷自产在线视频 | 亚洲s码欧洲m码国产av | 亚洲精品午夜无码电影网 | 亚洲伊人久久精品影院 | 亚洲乱码国产乱码精品精 | 亚洲天堂2017无码 | 成人毛片一区二区 | 麻豆人妻少妇精品无码专区 | 久久这里只有精品视频9 | 久热国产vs视频在线观看 | 国语精品一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 一区二区传媒有限公司 | 欧美日韩综合一区二区三区 | 5858s亚洲色大成网站www | 国产综合色产在线精品 | 日韩精品无码一区二区中文字幕 | 亚洲国产精品一区二区美利坚 | 人妻少妇被猛烈进入中文字幕 | 精品国偷自产在线视频 | 在线a亚洲视频播放在线观看 | √8天堂资源地址中文在线 | 国产免费久久久久久无码 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产午夜无码精品免费看 | 成人性做爰aaa片免费看不忠 | 极品尤物被啪到呻吟喷水 | 国产美女极度色诱视频www | 亚洲成熟女人毛毛耸耸多 | 国产无遮挡吃胸膜奶免费看 | 中文字幕无码av波多野吉衣 | 国产亚洲人成在线播放 | 亚无码乱人伦一区二区 | 又大又黄又粗又爽的免费视频 | 国产精品久久久久影院嫩草 | 欧美一区二区三区 | 亚洲国产综合无码一区 | 婷婷丁香六月激情综合啪 | 99精品久久毛片a片 | 国产另类ts人妖一区二区 | 国产亚洲精品久久久ai换 | 免费观看激色视频网站 | 少妇的肉体aa片免费 | 学生妹亚洲一区二区 | 乌克兰少妇性做爰 | 波多野结衣av在线观看 | av小次郎收藏 | 国产手机在线αⅴ片无码观看 | 精品国产精品久久一区免费式 | 久久久久99精品国产片 | 在线精品国产一区二区三区 | 国产午夜福利100集发布 | 强辱丰满人妻hd中文字幕 | 久热国产vs视频在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 中文字幕av伊人av无码av | 国产成人无码a区在线观看视频app | 久久亚洲国产成人精品性色 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 正在播放东北夫妻内射 | 无码人妻丰满熟妇区五十路百度 | 国产精品毛片一区二区 | 国产无遮挡又黄又爽免费视频 | 久久久无码中文字幕久... | 成人精品天堂一区二区三区 | 少妇人妻av毛片在线看 | 日本精品少妇一区二区三区 | 麻豆精品国产精华精华液好用吗 | 无码人妻丰满熟妇区毛片18 | 成人亚洲精品久久久久软件 | 色诱久久久久综合网ywww | 国色天香社区在线视频 | 国产成人午夜福利在线播放 | 日本饥渴人妻欲求不满 | 蜜桃无码一区二区三区 | 国产人妻精品一区二区三区 | 亚洲熟妇色xxxxx亚洲 | 国产suv精品一区二区五 | 俺去俺来也在线www色官网 | 一本久久a久久精品亚洲 | 熟妇人妻无乱码中文字幕 | 亚洲 欧美 激情 小说 另类 | 亚洲国产av精品一区二区蜜芽 | 国产精品亚洲五月天高清 | 久久国产精品萌白酱免费 | 亚洲а∨天堂久久精品2021 | 国产小呦泬泬99精品 | 露脸叫床粗话东北少妇 | 丰满岳乱妇在线观看中字无码 | 精品国产一区二区三区四区 | 欧美人妻一区二区三区 | 国产av久久久久精东av | 色婷婷综合激情综在线播放 | 最新国产乱人伦偷精品免费网站 | 99久久久国产精品无码免费 | 日产精品高潮呻吟av久久 | 国产片av国语在线观看 | 一个人看的www免费视频在线观看 | 人人妻人人澡人人爽人人精品 | 国产精品第一国产精品 | 国产午夜精品一区二区三区嫩草 | 精品欧美一区二区三区久久久 | 成在人线av无码免观看麻豆 | 欧美喷潮久久久xxxxx | 麻豆国产人妻欲求不满谁演的 | 精品偷拍一区二区三区在线看 | 国产人妻人伦精品1国产丝袜 | 欧美xxxx黑人又粗又长 | 老司机亚洲精品影院无码 | 色噜噜亚洲男人的天堂 | 欧洲vodafone精品性 | 天天躁夜夜躁狠狠是什么心态 | 亚洲中文字幕av在天堂 | 乌克兰少妇xxxx做受 | 亚洲熟熟妇xxxx | 永久免费精品精品永久-夜色 | 无码人妻精品一区二区三区下载 | 久久国产自偷自偷免费一区调 | 日本高清一区免费中文视频 | 国色天香社区在线视频 | 亚洲国产高清在线观看视频 | 亚洲日韩精品欧美一区二区 | 亚洲码国产精品高潮在线 | 欧美性生交xxxxx久久久 | 在线看片无码永久免费视频 | 亚洲一区二区观看播放 | 99久久精品无码一区二区毛片 | 欧美日韩在线亚洲综合国产人 | 国内丰满熟女出轨videos | 青草青草久热国产精品 | 亚洲娇小与黑人巨大交 | 在线成人www免费观看视频 | 一本久久a久久精品亚洲 | 亚洲综合无码一区二区三区 | 国产片av国语在线观看 | 夜夜躁日日躁狠狠久久av | a国产一区二区免费入口 | 欧美自拍另类欧美综合图片区 | 国产suv精品一区二区五 | 日本精品人妻无码免费大全 | 午夜成人1000部免费视频 | 领导边摸边吃奶边做爽在线观看 | 久久99精品国产麻豆 | 亚洲男人av香蕉爽爽爽爽 | 国产av无码专区亚洲a∨毛片 | 少妇人妻偷人精品无码视频 | 亚洲熟女一区二区三区 | 日本va欧美va欧美va精品 | 大地资源网第二页免费观看 | 免费人成网站视频在线观看 | 亚洲成色www久久网站 | 欧美性生交活xxxxxdddd | 国产后入清纯学生妹 | 精品夜夜澡人妻无码av蜜桃 | 国产av剧情md精品麻豆 | 又大又黄又粗又爽的免费视频 | 欧美人与动性行为视频 | 麻豆精产国品 | 色诱久久久久综合网ywww | 97精品人妻一区二区三区香蕉 | 麻豆人妻少妇精品无码专区 | 久久精品99久久香蕉国产色戒 | 亚洲人成影院在线观看 | 亚洲色偷偷男人的天堂 | 精品国产一区二区三区av 性色 | 精品人妻人人做人人爽 | 日韩视频 中文字幕 视频一区 | 亚洲精品中文字幕久久久久 | 欧洲熟妇精品视频 | 波多野结衣av在线观看 | 成人无码精品一区二区三区 | 久久亚洲精品中文字幕无男同 | 欧美老人巨大xxxx做受 | 中文字幕亚洲情99在线 | 扒开双腿吃奶呻吟做受视频 | 水蜜桃av无码 | 麻豆国产97在线 | 欧洲 | 国产激情综合五月久久 | 久久zyz资源站无码中文动漫 | 成人一在线视频日韩国产 | 国产无套内射久久久国产 | 国产成人无码区免费内射一片色欲 | 国产高潮视频在线观看 | 男人和女人高潮免费网站 | 国产av一区二区三区最新精品 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 欧美日韩精品 | 18精品久久久无码午夜福利 | 2019nv天堂香蕉在线观看 | 国产成人一区二区三区别 | 99久久亚洲精品无码毛片 | 国产黄在线观看免费观看不卡 | 日韩少妇白浆无码系列 | 亚洲欧美国产精品专区久久 | 欧美性黑人极品hd | 国产农村乱对白刺激视频 | 亚洲另类伦春色综合小说 | 伊人久久大香线蕉午夜 | 国产福利视频一区二区 | 午夜福利电影 | av人摸人人人澡人人超碰下载 | 永久免费精品精品永久-夜色 | 人人澡人人透人人爽 | 国产亚洲欧美日韩亚洲中文色 | 国产亚洲精品久久久ai换 | 国产精品.xx视频.xxtv | 亚洲s码欧洲m码国产av | 荫蒂被男人添的好舒服爽免费视频 | 国产又粗又硬又大爽黄老大爷视 | 成人无码精品1区2区3区免费看 | 亚洲国产综合无码一区 | 国产精品久久国产三级国 | 天堂久久天堂av色综合 | 在线播放免费人成毛片乱码 | 少妇性l交大片 | 日本大香伊一区二区三区 | 亚洲精品久久久久久一区二区 | 丰满人妻一区二区三区免费视频 | 国产人妻久久精品二区三区老狼 | 国产黑色丝袜在线播放 | 青青青手机频在线观看 | 亚洲国产精品久久人人爱 | 色婷婷香蕉在线一区二区 | а√资源新版在线天堂 | 国产精品丝袜黑色高跟鞋 | 在线 国产 欧美 亚洲 天堂 | 亚洲va欧美va天堂v国产综合 | 亚洲国产精品久久久天堂 | аⅴ资源天堂资源库在线 | 99精品无人区乱码1区2区3区 | 国产精品二区一区二区aⅴ污介绍 | 永久免费观看美女裸体的网站 | 亚洲一区二区三区无码久久 | 久久国产精品萌白酱免费 | 18黄暴禁片在线观看 | 激情五月综合色婷婷一区二区 | 国产猛烈高潮尖叫视频免费 | 狠狠噜狠狠狠狠丁香五月 | 精品无码一区二区三区爱欲 | 精品国产aⅴ无码一区二区 | 国产精品丝袜黑色高跟鞋 | 少妇厨房愉情理9仑片视频 | 欧美黑人性暴力猛交喷水 | 无码精品国产va在线观看dvd | 午夜免费福利小电影 | 亚洲理论电影在线观看 | 成 人影片 免费观看 | 麻花豆传媒剧国产免费mv在线 | 国产在热线精品视频 | 老太婆性杂交欧美肥老太 | 在线欧美精品一区二区三区 | 亚洲精品一区二区三区在线 | 亚洲精品一区二区三区四区五区 | 精品国产精品久久一区免费式 | 欧洲欧美人成视频在线 | 天天做天天爱天天爽综合网 | 激情人妻另类人妻伦 | 亚洲中文字幕久久无码 | 亚洲色大成网站www | 女人被男人爽到呻吟的视频 | 国内综合精品午夜久久资源 | 人妻少妇精品无码专区动漫 | 亚洲熟妇色xxxxx欧美老妇 | 国产人妻精品午夜福利免费 | 成 人 网 站国产免费观看 | 少妇无码av无码专区在线观看 | 日本精品久久久久中文字幕 | √8天堂资源地址中文在线 | 奇米影视7777久久精品人人爽 | 日韩亚洲欧美精品综合 | 亚洲成在人网站无码天堂 | 欧美精品一区二区精品久久 | 国产精品久久久午夜夜伦鲁鲁 | 免费无码一区二区三区蜜桃大 | 亚洲成色www久久网站 | 国产精品理论片在线观看 | 国产熟女一区二区三区四区五区 | 久久精品无码一区二区三区 | 久久久中文字幕日本无吗 | 国产精品亚洲lv粉色 | 国产午夜无码视频在线观看 | 野外少妇愉情中文字幕 | 国产激情综合五月久久 | 国产亚洲美女精品久久久2020 | 精品无人区无码乱码毛片国产 | 欧美人与禽zoz0性伦交 | 欧美日韩视频无码一区二区三 | 99久久精品日本一区二区免费 | 亚洲精品中文字幕 | 日韩少妇内射免费播放 | 国产欧美亚洲精品a | 久久97精品久久久久久久不卡 | 成年美女黄网站色大免费视频 | 樱花草在线社区www | 中文字幕无码人妻少妇免费 | 久久久亚洲欧洲日产国码αv | 日韩成人一区二区三区在线观看 | 55夜色66夜色国产精品视频 | 日韩av无码一区二区三区 | 亚洲一区二区三区播放 | 99麻豆久久久国产精品免费 | 两性色午夜视频免费播放 | 亲嘴扒胸摸屁股激烈网站 | 性色av无码免费一区二区三区 | 人人澡人摸人人添 | 丁香花在线影院观看在线播放 | 丰满少妇人妻久久久久久 | 亚洲色偷偷偷综合网 | 国产在线aaa片一区二区99 | 久久97精品久久久久久久不卡 | 日韩欧美成人免费观看 | 男人和女人高潮免费网站 | 伊人久久大香线焦av综合影院 | 国模大胆一区二区三区 | 大地资源中文第3页 | 学生妹亚洲一区二区 | 久久久精品国产sm最大网站 | 久久精品成人欧美大片 | 色综合久久久无码网中文 | 奇米影视7777久久精品人人爽 | 亚洲а∨天堂久久精品2021 | 国产超碰人人爽人人做人人添 | 亚洲日韩av一区二区三区四区 | 欧美日韩在线亚洲综合国产人 | 97色伦图片97综合影院 | 少妇无码一区二区二三区 | 日本熟妇乱子伦xxxx | 国产高清不卡无码视频 | 最近免费中文字幕中文高清百度 | 精品国产一区二区三区四区 | 国产一区二区三区日韩精品 | 欧美放荡的少妇 | 无码一区二区三区在线 | 麻豆人妻少妇精品无码专区 | 人人澡人人妻人人爽人人蜜桃 | 桃花色综合影院 | 久久无码人妻影院 | 激情人妻另类人妻伦 | 亚洲精品一区二区三区大桥未久 | 青青草原综合久久大伊人精品 | 国产精品人人爽人人做我的可爱 | 国内揄拍国内精品人妻 | 国产成人久久精品流白浆 | 国产va免费精品观看 | 无码国模国产在线观看 | 欧美日韩视频无码一区二区三 | 亚洲日韩av一区二区三区四区 | 又大又黄又粗又爽的免费视频 | 狠狠色噜噜狠狠狠狠7777米奇 | 97无码免费人妻超级碰碰夜夜 | 麻豆精产国品 | 亚洲中文字幕va福利 | 精品国产一区二区三区四区在线看 | 国产精品久久精品三级 | 中文字幕无码av波多野吉衣 | 国产av一区二区三区最新精品 | 99视频精品全部免费免费观看 | 无码中文字幕色专区 | 亚洲国产精品成人久久蜜臀 | 精品久久久久久人妻无码中文字幕 | 亚洲人成网站免费播放 | 国产无套内射久久久国产 | 国产精品美女久久久 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲一区二区三区播放 | 少妇厨房愉情理9仑片视频 | 精品水蜜桃久久久久久久 | 午夜福利一区二区三区在线观看 | 伦伦影院午夜理论片 | 久久视频在线观看精品 | 欧美一区二区三区 | 精品偷自拍另类在线观看 | 国产午夜无码视频在线观看 | 亚无码乱人伦一区二区 | 国产精品久久久久久久影院 | 少妇久久久久久人妻无码 | 欧美人与物videos另类 | 亚洲国产精品美女久久久久 | 好爽又高潮了毛片免费下载 | 在线播放免费人成毛片乱码 | 欧美人与善在线com | 一二三四社区在线中文视频 | 一本色道久久综合狠狠躁 | 亚洲熟妇色xxxxx欧美老妇 | 奇米影视7777久久精品人人爽 | 亚洲色欲色欲欲www在线 | 波多野结衣一区二区三区av免费 | 国产激情综合五月久久 | 精品国产国产综合精品 | 午夜性刺激在线视频免费 | 国产午夜福利亚洲第一 | 俄罗斯老熟妇色xxxx | 99精品无人区乱码1区2区3区 | 中文字幕日产无线码一区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 欧美性猛交内射兽交老熟妇 | 国产午夜无码视频在线观看 | 亚洲乱码国产乱码精品精 | 在线观看国产午夜福利片 | 无码成人精品区在线观看 | 999久久久国产精品消防器材 | 亚洲精品无码国产 | 国产真实乱对白精彩久久 | 亚洲人成影院在线无码按摩店 | 99精品视频在线观看免费 | 久久精品成人欧美大片 | 精品国产一区二区三区四区 | 人人澡人人妻人人爽人人蜜桃 | 女人高潮内射99精品 | 老司机亚洲精品影院 | 国产电影无码午夜在线播放 | 大屁股大乳丰满人妻 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲国产精品无码一区二区三区 | 亚洲va中文字幕无码久久不卡 | 草草网站影院白丝内射 | 在线成人www免费观看视频 | 欧美丰满熟妇xxxx性ppx人交 | 少妇愉情理伦片bd | 一本久道久久综合婷婷五月 | 日韩亚洲欧美中文高清在线 | 久久亚洲精品成人无码 | 日本丰满护士爆乳xxxx | 亚洲色在线无码国产精品不卡 | 蜜桃无码一区二区三区 | 狠狠躁日日躁夜夜躁2020 | 日韩av无码一区二区三区不卡 | 夜夜高潮次次欢爽av女 | 两性色午夜免费视频 | 色偷偷人人澡人人爽人人模 | 爆乳一区二区三区无码 | 无码精品人妻一区二区三区av | 欧美性黑人极品hd | 色综合久久久无码网中文 | 日韩欧美成人免费观看 | 黑人巨大精品欧美一区二区 | 国产亚洲人成a在线v网站 | 欧美成人高清在线播放 | 国产色xx群视频射精 | 精品熟女少妇av免费观看 | 色狠狠av一区二区三区 | 综合激情五月综合激情五月激情1 | 欧美老妇交乱视频在线观看 | 精品日本一区二区三区在线观看 | 无人区乱码一区二区三区 | 亚洲成a人片在线观看无码3d | 国产色在线 | 国产 | 一个人看的视频www在线 | 午夜精品一区二区三区的区别 | 国产精品嫩草久久久久 | 无码人妻丰满熟妇区五十路百度 | 欧美猛少妇色xxxxx | 又大又黄又粗又爽的免费视频 | 精品无码av一区二区三区 | 国产亚洲美女精品久久久2020 | 激情亚洲一区国产精品 | 久久精品视频在线看15 | 亚洲欧洲无卡二区视頻 | 国产激情无码一区二区app | 无码帝国www无码专区色综合 | 亚洲无人区一区二区三区 | 午夜时刻免费入口 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 欧美刺激性大交 | 又大又硬又爽免费视频 | 伊人久久大香线蕉av一区二区 | 强伦人妻一区二区三区视频18 | 精品国产一区二区三区av 性色 | 99久久精品日本一区二区免费 | 女高中生第一次破苞av | 国产精品a成v人在线播放 | 丰满少妇弄高潮了www | 国产手机在线αⅴ片无码观看 | 国产成人无码区免费内射一片色欲 | 成 人影片 免费观看 | 欧美第一黄网免费网站 | 久久综合狠狠综合久久综合88 | 亚洲一区av无码专区在线观看 | 午夜时刻免费入口 | 欧洲熟妇精品视频 | 国产亚洲欧美日韩亚洲中文色 | 国产激情艳情在线看视频 | 国产性生交xxxxx无码 | 沈阳熟女露脸对白视频 | 国产精品毛多多水多 | 婷婷色婷婷开心五月四房播播 | 亚洲国产欧美国产综合一区 | 久久综合给久久狠狠97色 | 久久国内精品自在自线 | 无码av中文字幕免费放 | 久9re热视频这里只有精品 | 日本在线高清不卡免费播放 | 亚洲一区二区三区无码久久 | 亚洲人交乣女bbw | 午夜精品久久久久久久 | 色五月五月丁香亚洲综合网 | 国产成人午夜福利在线播放 | a在线观看免费网站大全 | 老头边吃奶边弄进去呻吟 | 男女猛烈xx00免费视频试看 | 国产综合色产在线精品 | 久久久成人毛片无码 | 我要看www免费看插插视频 | 男人扒开女人内裤强吻桶进去 | 2019nv天堂香蕉在线观看 | 无码人妻久久一区二区三区不卡 | 国产凸凹视频一区二区 | 久久久久se色偷偷亚洲精品av | 性欧美大战久久久久久久 | 乱码av麻豆丝袜熟女系列 | 人妻无码久久精品人妻 | 日韩精品无码一本二本三本色 | 扒开双腿吃奶呻吟做受视频 | 激情五月综合色婷婷一区二区 | 免费国产黄网站在线观看 | 国内精品久久久久久中文字幕 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产在线无码精品电影网 | 色综合久久久久综合一本到桃花网 | 人人妻人人澡人人爽人人精品 | 久久久久99精品国产片 | 在线观看国产一区二区三区 | 亚洲日韩av一区二区三区四区 | 真人与拘做受免费视频一 | 97精品人妻一区二区三区香蕉 | 国产精品对白交换视频 | 国产激情一区二区三区 | 久久久久av无码免费网 | 九九久久精品国产免费看小说 | 国产69精品久久久久app下载 | 日韩亚洲欧美中文高清在线 | 人人爽人人澡人人人妻 | 黑人粗大猛烈进出高潮视频 | 精品国产精品久久一区免费式 | 久久人人爽人人爽人人片ⅴ | 两性色午夜视频免费播放 | aⅴ亚洲 日韩 色 图网站 播放 | 丰满少妇人妻久久久久久 | 成人无码精品1区2区3区免费看 | 国产精品99久久精品爆乳 | 久久久亚洲欧洲日产国码αv | 99riav国产精品视频 | 97久久精品无码一区二区 | 婷婷丁香五月天综合东京热 | 亚洲男人av天堂午夜在 | 无码播放一区二区三区 | 99精品无人区乱码1区2区3区 | 国产精品igao视频网 | 久久久www成人免费毛片 | 无码av岛国片在线播放 | 亚洲s色大片在线观看 | 久久精品国产一区二区三区 | 免费看男女做好爽好硬视频 | 国产精品美女久久久久av爽李琼 | 日韩少妇白浆无码系列 | 搡女人真爽免费视频大全 | 国产亚洲美女精品久久久2020 | 欧美 丝袜 自拍 制服 另类 | 国产情侣作爱视频免费观看 | 日韩av无码一区二区三区 | 玩弄少妇高潮ⅹxxxyw | 国产精品视频免费播放 | 麻豆人妻少妇精品无码专区 | 免费人成在线视频无码 | 国产成人一区二区三区在线观看 | 亚洲另类伦春色综合小说 | 动漫av一区二区在线观看 | 高潮毛片无遮挡高清免费视频 | 无码国模国产在线观看 | 国产成人综合色在线观看网站 | 水蜜桃色314在线观看 | 精品aⅴ一区二区三区 | 国产网红无码精品视频 | 无人区乱码一区二区三区 | 又大又黄又粗又爽的免费视频 | 精品国产一区二区三区四区在线看 | 成人三级无码视频在线观看 | 免费看男女做好爽好硬视频 | 男人和女人高潮免费网站 | 亚洲国产精品久久人人爱 | 熟女俱乐部五十路六十路av | 少妇愉情理伦片bd | 少妇厨房愉情理9仑片视频 | 久久人人爽人人人人片 | 亚洲精品一区二区三区在线观看 | 欧美日韩精品 | 精品乱子伦一区二区三区 | 熟妇人妻激情偷爽文 | 亚洲综合在线一区二区三区 | 中文字幕 人妻熟女 | 少妇性俱乐部纵欲狂欢电影 | 蜜臀av在线播放 久久综合激激的五月天 | 国产99久久精品一区二区 | 人人澡人人透人人爽 | 婷婷色婷婷开心五月四房播播 | 亚洲精品www久久久 | 久久综合激激的五月天 | 99久久精品日本一区二区免费 | 丁香花在线影院观看在线播放 | 黑人巨大精品欧美一区二区 | 永久黄网站色视频免费直播 | 国产疯狂伦交大片 | 无码人中文字幕 | aⅴ亚洲 日韩 色 图网站 播放 | 岛国片人妻三上悠亚 | 一本久道高清无码视频 | 免费人成网站视频在线观看 | 国产农村妇女高潮大叫 | 欧美性生交xxxxx久久久 | 55夜色66夜色国产精品视频 | 欧美日韩一区二区免费视频 | 国产无遮挡吃胸膜奶免费看 | 伦伦影院午夜理论片 | 麻豆果冻传媒2021精品传媒一区下载 | 在线а√天堂中文官网 | 精品乱码久久久久久久 | 国产婷婷色一区二区三区在线 | 女人被男人爽到呻吟的视频 | 一本久久伊人热热精品中文字幕 | 欧美人与动性行为视频 | 男女下面进入的视频免费午夜 | 97久久国产亚洲精品超碰热 | 奇米影视7777久久精品人人爽 | 色欲av亚洲一区无码少妇 | 国产艳妇av在线观看果冻传媒 | 在线观看免费人成视频 | 亚洲呦女专区 | 久久综合九色综合欧美狠狠 | 精品一二三区久久aaa片 | 午夜精品一区二区三区在线观看 | 99国产精品白浆在线观看免费 | 狠狠色色综合网站 | 精品aⅴ一区二区三区 | 国产女主播喷水视频在线观看 | 国产午夜视频在线观看 | 日本大乳高潮视频在线观看 | 久久无码中文字幕免费影院蜜桃 | 久久伊人色av天堂九九小黄鸭 | 55夜色66夜色国产精品视频 | 一本久久伊人热热精品中文字幕 | 亚洲国产精品美女久久久久 | 国产成人精品久久亚洲高清不卡 | 学生妹亚洲一区二区 | 在线精品亚洲一区二区 | 天海翼激烈高潮到腰振不止 | 天海翼激烈高潮到腰振不止 | 亚洲乱码国产乱码精品精 | 国产香蕉尹人视频在线 | 亚洲の无码国产の无码影院 | 99精品国产综合久久久久五月天 | 久在线观看福利视频 | 久久人人爽人人爽人人片ⅴ | 男女超爽视频免费播放 | 久久亚洲国产成人精品性色 | 欧美zoozzooz性欧美 | 免费无码的av片在线观看 | 久久综合久久自在自线精品自 | 激情五月综合色婷婷一区二区 | 131美女爱做视频 | 久久午夜无码鲁丝片午夜精品 | 亚洲欧美国产精品久久 | 人人澡人人透人人爽 | 澳门永久av免费网站 | 综合网日日天干夜夜久久 | 日本又色又爽又黄的a片18禁 | 午夜福利一区二区三区在线观看 | 又色又爽又黄的美女裸体网站 | 日韩精品乱码av一区二区 | 午夜性刺激在线视频免费 | 亚洲最大成人网站 | 婷婷五月综合激情中文字幕 | 图片区 小说区 区 亚洲五月 | 日韩无码专区 | 纯爱无遮挡h肉动漫在线播放 | 小泽玛莉亚一区二区视频在线 | 久久久久国色av免费观看性色 | 免费无码肉片在线观看 | 狠狠亚洲超碰狼人久久 | 99久久精品无码一区二区毛片 | 日本精品久久久久中文字幕 | 亚洲色欲色欲欲www在线 | 欧美亚洲日韩国产人成在线播放 | 日韩人妻无码中文字幕视频 | 久久熟妇人妻午夜寂寞影院 | 成人三级无码视频在线观看 | 色婷婷av一区二区三区之红樱桃 | 六月丁香婷婷色狠狠久久 | 国产无套内射久久久国产 | 2020最新国产自产精品 | 无码纯肉视频在线观看 | 精品无码国产一区二区三区av | 一本久久伊人热热精品中文字幕 | 国产特级毛片aaaaaa高潮流水 | 性欧美videos高清精品 | 性色欲网站人妻丰满中文久久不卡 | 亚洲第一无码av无码专区 | 无遮无挡爽爽免费视频 | 国产综合久久久久鬼色 | 久久久精品欧美一区二区免费 | 牛和人交xxxx欧美 | 51国偷自产一区二区三区 | 久久精品国产大片免费观看 | 国产成人无码a区在线观看视频app | 亚洲国产欧美日韩精品一区二区三区 | 中文字幕无码乱人伦 | 夜精品a片一区二区三区无码白浆 | 国产无av码在线观看 | 国产香蕉97碰碰久久人人 | 小泽玛莉亚一区二区视频在线 | 乱中年女人伦av三区 | 99久久99久久免费精品蜜桃 | 中文字幕无码免费久久99 | 国产高潮视频在线观看 | 国产精品二区一区二区aⅴ污介绍 | 台湾无码一区二区 | 131美女爱做视频 | 欧美 日韩 亚洲 在线 | 国内少妇偷人精品视频免费 | 亚洲国产精品无码一区二区三区 | 天天综合网天天综合色 | 天天做天天爱天天爽综合网 | 日本丰满熟妇videos | 伊人久久大香线蕉av一区二区 | 久久久久久久久蜜桃 | 性欧美疯狂xxxxbbbb | 67194成是人免费无码 | 色综合久久久久综合一本到桃花网 | 日本护士xxxxhd少妇 | 国产免费观看黄av片 | 成人性做爰aaa片免费看不忠 | 国产亚洲人成在线播放 | 一本久道高清无码视频 | 亚洲一区av无码专区在线观看 | 日本丰满熟妇videos | 国产成人无码区免费内射一片色欲 | 天天躁日日躁狠狠躁免费麻豆 | 99国产欧美久久久精品 | 亚洲国产精华液网站w | 人妻少妇被猛烈进入中文字幕 | 丝袜足控一区二区三区 | 国产av无码专区亚洲a∨毛片 | 精品国产一区二区三区四区 | 亚洲成av人在线观看网址 | 中文亚洲成a人片在线观看 | 99精品无人区乱码1区2区3区 | 欧洲精品码一区二区三区免费看 | 中文字幕乱码人妻二区三区 | 亚洲无人区午夜福利码高清完整版 | 国产亚洲精品久久久久久国模美 | 国产激情无码一区二区 | 熟女俱乐部五十路六十路av | 欧美精品免费观看二区 | 国产无遮挡又黄又爽免费视频 | 无码福利日韩神码福利片 | 无码av最新清无码专区吞精 | 国产亲子乱弄免费视频 | 在线观看国产一区二区三区 | 男女下面进入的视频免费午夜 | 国产香蕉尹人综合在线观看 | 任你躁国产自任一区二区三区 | 一本久久伊人热热精品中文字幕 | 久久人人爽人人爽人人片ⅴ | 97精品国产97久久久久久免费 | 熟妇人妻中文av无码 | 波多野结衣av在线观看 | 亚洲国产精品久久人人爱 | 日日干夜夜干 | 亚洲中文字幕成人无码 | 大屁股大乳丰满人妻 | 国产黄在线观看免费观看不卡 | 久久久久久亚洲精品a片成人 | 少妇性荡欲午夜性开放视频剧场 | 伊人久久婷婷五月综合97色 | 红桃av一区二区三区在线无码av | 精品人妻人人做人人爽夜夜爽 | 国产成人无码a区在线观看视频app | 亚洲乱码国产乱码精品精 | 99riav国产精品视频 | 国产电影无码午夜在线播放 | 亚洲成a人片在线观看无码3d | 在线播放免费人成毛片乱码 | 亚洲精品国产a久久久久久 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 内射老妇bbwx0c0ck | 麻豆精品国产精华精华液好用吗 | 国内老熟妇对白xxxxhd | 国产内射爽爽大片视频社区在线 | 色综合视频一区二区三区 | av在线亚洲欧洲日产一区二区 | 中文字幕乱妇无码av在线 | 色婷婷香蕉在线一区二区 | 亚洲va欧美va天堂v国产综合 | 99久久久无码国产aaa精品 | 午夜无码人妻av大片色欲 | 老子影院午夜伦不卡 | 人妻熟女一区 | 又粗又大又硬毛片免费看 | 丝袜足控一区二区三区 | 国产精品鲁鲁鲁 | 欧美人与禽zoz0性伦交 | 日本一区二区三区免费高清 | 全球成人中文在线 | 亚洲精品国产第一综合99久久 | 女人被爽到呻吟gif动态图视看 | 精品无人国产偷自产在线 | 99麻豆久久久国产精品免费 | 中国女人内谢69xxxxxa片 | 欧美精品国产综合久久 | 熟女少妇人妻中文字幕 | 女人高潮内射99精品 | 老熟妇仑乱视频一区二区 | 国产成人av免费观看 | 久久久亚洲欧洲日产国码αv | 伊在人天堂亚洲香蕉精品区 | 色诱久久久久综合网ywww | 久久精品一区二区三区四区 | 国产无遮挡吃胸膜奶免费看 | 欧美 丝袜 自拍 制服 另类 | 樱花草在线社区www | 亚洲狠狠色丁香婷婷综合 | 对白脏话肉麻粗话av | 成在人线av无码免费 | 小鲜肉自慰网站xnxx | 99久久人妻精品免费二区 | 亚洲另类伦春色综合小说 | 白嫩日本少妇做爰 | 国产麻豆精品一区二区三区v视界 | 日本丰满护士爆乳xxxx | 动漫av网站免费观看 | 无遮无挡爽爽免费视频 | 动漫av网站免费观看 | yw尤物av无码国产在线观看 | 亚洲欧洲无卡二区视頻 | 久久久久亚洲精品中文字幕 | 免费国产成人高清在线观看网站 | 任你躁国产自任一区二区三区 | 粉嫩少妇内射浓精videos | 亚洲国产av美女网站 | 六月丁香婷婷色狠狠久久 | 波多野结衣av一区二区全免费观看 | 精品国产aⅴ无码一区二区 | av无码电影一区二区三区 | 国产真实伦对白全集 | 最近的中文字幕在线看视频 | 无码av最新清无码专区吞精 | 疯狂三人交性欧美 | 国产两女互慰高潮视频在线观看 | 精品成人av一区二区三区 | 国产免费久久久久久无码 | 午夜精品久久久久久久久 | 亚洲伊人久久精品影院 | 国产精品亚洲а∨无码播放麻豆 | 精品厕所偷拍各类美女tp嘘嘘 | 任你躁在线精品免费 | 国产成人午夜福利在线播放 | 亚洲 日韩 欧美 成人 在线观看 | 99er热精品视频 | 国产精品久久久一区二区三区 | 清纯唯美经典一区二区 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品理论片在线观看 | 午夜性刺激在线视频免费 | 中文字幕人成乱码熟女app | 人妻尝试又大又粗久久 | 亚洲男人av天堂午夜在 | 欧美乱妇无乱码大黄a片 | 色老头在线一区二区三区 | 亚洲日韩精品欧美一区二区 | 欧美成人高清在线播放 | 久久久久久国产精品无码下载 | 欧洲美熟女乱又伦 | 国产后入清纯学生妹 | 高清无码午夜福利视频 | 精品国产av色一区二区深夜久久 | 麻豆国产97在线 | 欧洲 | 久久无码中文字幕免费影院蜜桃 | 国产真人无遮挡作爱免费视频 | 麻豆国产人妻欲求不满 | 中文字幕无码日韩专区 | 精品熟女少妇av免费观看 | 亚洲大尺度无码无码专区 | 无码人妻久久一区二区三区不卡 | 色综合久久久无码中文字幕 | 久久精品中文字幕一区 | 日本大乳高潮视频在线观看 | 国产三级久久久精品麻豆三级 | 亚洲午夜福利在线观看 | 国产成人人人97超碰超爽8 | 一区二区三区高清视频一 | 久久久久免费精品国产 | 女人色极品影院 | 久久亚洲中文字幕精品一区 | 亚洲国产欧美日韩精品一区二区三区 | 狠狠色欧美亚洲狠狠色www | 久久久久久久人妻无码中文字幕爆 | 少妇无码一区二区二三区 | 中文字幕无码乱人伦 | aⅴ在线视频男人的天堂 | 国产在线aaa片一区二区99 | 99久久无码一区人妻 | 国产人成高清在线视频99最全资源 | 日本精品人妻无码77777 天堂一区人妻无码 | 天堂а√在线中文在线 | 亚洲国产精品美女久久久久 | 好男人www社区 | 影音先锋中文字幕无码 | 夜夜高潮次次欢爽av女 | 精品水蜜桃久久久久久久 | 久久久久免费精品国产 | 妺妺窝人体色www婷婷 | 国产综合色产在线精品 | 国产精品.xx视频.xxtv | 国产精品va在线播放 | 国产精品欧美成人 | 野外少妇愉情中文字幕 | 色婷婷香蕉在线一区二区 | 九月婷婷人人澡人人添人人爽 | 欧美人与动性行为视频 | 亚洲欧洲中文日韩av乱码 | 亚洲精品中文字幕乱码 | 国产精品亚洲五月天高清 | 国产片av国语在线观看 | 国产av一区二区精品久久凹凸 | 欧洲欧美人成视频在线 | 又粗又大又硬又长又爽 | 成熟人妻av无码专区 | 欧美人与牲动交xxxx | 性开放的女人aaa片 | 高潮毛片无遮挡高清免费 | 国产成人精品视频ⅴa片软件竹菊 | 国内精品久久毛片一区二区 | 亚洲欧美中文字幕5发布 | 婷婷五月综合激情中文字幕 | 天天av天天av天天透 | 日韩欧美中文字幕在线三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 欧美日韩亚洲国产精品 | 欧美 丝袜 自拍 制服 另类 | 精品国产一区二区三区四区在线看 | 99久久人妻精品免费一区 | 无套内谢的新婚少妇国语播放 | 中文字幕日产无线码一区 | 牲交欧美兽交欧美 | 亚洲国产精品久久久天堂 | 亚洲色成人中文字幕网站 | 免费人成网站视频在线观看 | 俺去俺来也在线www色官网 | 又紧又大又爽精品一区二区 | 国产人妻久久精品二区三区老狼 | 亲嘴扒胸摸屁股激烈网站 | 东京热无码av男人的天堂 | 一二三四社区在线中文视频 | 欧美xxxx黑人又粗又长 | 亚洲七七久久桃花影院 | 欧美精品一区二区精品久久 | 男女下面进入的视频免费午夜 | 国产成人精品三级麻豆 | 熟妇人妻中文av无码 | 伦伦影院午夜理论片 | 亚洲精品一区二区三区在线 | 人妻尝试又大又粗久久 | 国产va免费精品观看 | 99国产精品白浆在线观看免费 | 国产色视频一区二区三区 | 久久国产劲爆∧v内射 | 久久精品中文闷骚内射 | 纯爱无遮挡h肉动漫在线播放 | 精品国产一区二区三区av 性色 | 2020久久超碰国产精品最新 | 国产97色在线 | 免 | 欧美亚洲国产一区二区三区 | 亚洲国产精品久久久久久 | 婷婷五月综合激情中文字幕 | 宝宝好涨水快流出来免费视频 | 麻豆成人精品国产免费 | 色诱久久久久综合网ywww | 亚洲精品国偷拍自产在线麻豆 | 国内精品九九久久久精品 | 女人高潮内射99精品 | 性做久久久久久久免费看 | 国产人妖乱国产精品人妖 | 亚洲精品综合一区二区三区在线 | 精品欧美一区二区三区久久久 | 国产精品美女久久久久av爽李琼 | 99久久精品日本一区二区免费 | 欧美日韩一区二区综合 | 玩弄少妇高潮ⅹxxxyw | 精品国产av色一区二区深夜久久 | 国产无套内射久久久国产 | 99riav国产精品视频 | 国产精品久久久一区二区三区 | 久久久久免费看成人影片 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 伊人久久大香线蕉av一区二区 | 欧美日韩综合一区二区三区 | 欧美老妇交乱视频在线观看 | 日韩亚洲欧美中文高清在线 | 国产精品丝袜黑色高跟鞋 | 暴力强奷在线播放无码 | 国产97人人超碰caoprom | 国产黄在线观看免费观看不卡 | 无遮挡国产高潮视频免费观看 | 成人动漫在线观看 | 九九在线中文字幕无码 | 国产精品高潮呻吟av久久4虎 | 东京无码熟妇人妻av在线网址 | 天堂亚洲2017在线观看 | 强伦人妻一区二区三区视频18 | 女人被男人爽到呻吟的视频 | 99riav国产精品视频 | 中文字幕乱码中文乱码51精品 | 色五月五月丁香亚洲综合网 | 欧美性生交活xxxxxdddd | 国产成人人人97超碰超爽8 | 黑人巨大精品欧美一区二区 | 亚洲一区二区三区播放 | 国内精品一区二区三区不卡 | 成人av无码一区二区三区 | 麻花豆传媒剧国产免费mv在线 | 亚洲精品久久久久久久久久久 | 久久99精品久久久久久 | 欧美性生交xxxxx久久久 | 一本久久伊人热热精品中文字幕 | 人妻少妇精品视频专区 | 55夜色66夜色国产精品视频 | 日韩无码专区 | 免费视频欧美无人区码 | 亚洲一区二区三区四区 | 疯狂三人交性欧美 | 国产人妻精品一区二区三区 | а√天堂www在线天堂小说 | 久久综合激激的五月天 | 国产精品永久免费视频 | 永久黄网站色视频免费直播 | 99精品无人区乱码1区2区3区 | √天堂资源地址中文在线 | 国产特级毛片aaaaaaa高清 | 欧美激情综合亚洲一二区 | 性色欲网站人妻丰满中文久久不卡 | 亚洲综合无码久久精品综合 | 中文字幕无码乱人伦 | 乱人伦中文视频在线观看 | 九九热爱视频精品 | 亚洲伊人久久精品影院 | 曰韩无码二三区中文字幕 | 国产成人无码a区在线观看视频app | 日本大香伊一区二区三区 | 97se亚洲精品一区 | 国产精品美女久久久网av | 强辱丰满人妻hd中文字幕 | 欧美精品国产综合久久 | 97夜夜澡人人双人人人喊 | 波多野结衣av在线观看 | 最近免费中文字幕中文高清百度 | 亚洲精品中文字幕 | 宝宝好涨水快流出来免费视频 | 无码国产乱人伦偷精品视频 | 午夜精品一区二区三区的区别 | 香蕉久久久久久av成人 | 波多野结衣aⅴ在线 | 狂野欧美激情性xxxx | 秋霞成人午夜鲁丝一区二区三区 | 国产无av码在线观看 | 水蜜桃色314在线观看 | 亚洲国产高清在线观看视频 | 欧美日韩色另类综合 | 波多野结衣高清一区二区三区 | 乱人伦人妻中文字幕无码 | 亚洲精品www久久久 | v一区无码内射国产 | 成人免费视频视频在线观看 免费 | 亚洲区小说区激情区图片区 | 桃花色综合影院 | 亚洲一区av无码专区在线观看 | 国产香蕉尹人综合在线观看 | 无码人中文字幕 | 99久久亚洲精品无码毛片 | 草草网站影院白丝内射 | 18禁止看的免费污网站 | 亚洲国产精品一区二区美利坚 | 激情亚洲一区国产精品 | 亚洲国产欧美在线成人 | 夫妻免费无码v看片 | 国产成人综合在线女婷五月99播放 | 精品少妇爆乳无码av无码专区 | 国产无av码在线观看 | 国精产品一品二品国精品69xx | 在线а√天堂中文官网 | 成人精品视频一区二区三区尤物 | 日本精品久久久久中文字幕 | 午夜无码人妻av大片色欲 | 亚洲国产精品无码一区二区三区 | 99久久婷婷国产综合精品青草免费 | 玩弄中年熟妇正在播放 | 国产人成高清在线视频99最全资源 | 成人欧美一区二区三区黑人免费 | 久精品国产欧美亚洲色aⅴ大片 | 欧美熟妇另类久久久久久不卡 | 久久精品国产亚洲精品 | 女人被男人爽到呻吟的视频 | 无码毛片视频一区二区本码 | 久久久精品欧美一区二区免费 | 国产精品久免费的黄网站 | 亚洲第一无码av无码专区 | 偷窥日本少妇撒尿chinese | 四十如虎的丰满熟妇啪啪 | 成 人 网 站国产免费观看 | 亚洲欧洲无卡二区视頻 | 300部国产真实乱 | 亚洲の无码国产の无码影院 | 午夜肉伦伦影院 | 999久久久国产精品消防器材 | 亚洲精品久久久久avwww潮水 | 久久精品人妻少妇一区二区三区 | 久久综合色之久久综合 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 水蜜桃av无码 | 国产激情综合五月久久 | 无码中文字幕色专区 | 国精品人妻无码一区二区三区蜜柚 | 又紧又大又爽精品一区二区 | 激情综合激情五月俺也去 | 亚洲精品久久久久avwww潮水 | 精品无人国产偷自产在线 | 国产高潮视频在线观看 | 熟妇人妻无码xxx视频 | 夜夜高潮次次欢爽av女 | 国产亚洲tv在线观看 | 少妇被粗大的猛进出69影院 | 熟女体下毛毛黑森林 | 九一九色国产 | 精品无人区无码乱码毛片国产 | 国产精品美女久久久久av爽李琼 | 人人妻人人澡人人爽人人精品浪潮 | 初尝人妻少妇中文字幕 | 国产美女精品一区二区三区 | 久久精品国产日本波多野结衣 | 我要看www免费看插插视频 | 欧美xxxx黑人又粗又长 | 大肉大捧一进一出好爽视频 | 午夜丰满少妇性开放视频 | 国内精品九九久久久精品 | 亚洲综合无码一区二区三区 | av无码电影一区二区三区 | 国产欧美熟妇另类久久久 | 给我免费的视频在线观看 | 99精品无人区乱码1区2区3区 | 人妻无码久久精品人妻 | 狂野欧美性猛交免费视频 | 国产无遮挡又黄又爽免费视频 | 精品久久久中文字幕人妻 | 久久99久久99精品中文字幕 | 一本一道久久综合久久 | 亚洲日本va中文字幕 | 天天综合网天天综合色 | 精品国产一区二区三区四区 | 亚洲国产精品久久人人爱 | 国产sm调教视频在线观看 | 国産精品久久久久久久 | 亚洲人成影院在线观看 | 国产69精品久久久久app下载 | 99视频精品全部免费免费观看 | 国产suv精品一区二区五 | 亚洲精品久久久久久一区二区 | 午夜肉伦伦影院 | 免费国产成人高清在线观看网站 | 久久久久久久人妻无码中文字幕爆 | 日本欧美一区二区三区乱码 | 暴力强奷在线播放无码 | 青青久在线视频免费观看 | 无码毛片视频一区二区本码 | 四虎国产精品免费久久 | 国产亚洲精品久久久久久久 | 国产一区二区三区精品视频 | 精品久久8x国产免费观看 | 午夜时刻免费入口 | 久久精品国产亚洲精品 | 全黄性性激高免费视频 | 亚洲 a v无 码免 费 成 人 a v | 亚洲欧美中文字幕5发布 | 亚洲人成无码网www | 国产成人精品三级麻豆 | 国产亚洲美女精品久久久2020 | 亚洲中文字幕无码一久久区 | 久久久久久亚洲精品a片成人 | 人妻人人添人妻人人爱 | 久久人人爽人人爽人人片av高清 | 丝袜人妻一区二区三区 | 亚洲另类伦春色综合小说 | 日韩欧美成人免费观看 | 亚洲国精产品一二二线 | 亚洲精品无码国产 | 人人妻人人澡人人爽欧美精品 | 鲁鲁鲁爽爽爽在线视频观看 | 国产午夜亚洲精品不卡 | 无遮无挡爽爽免费视频 | 欧美人与禽猛交狂配 | 国产一区二区不卡老阿姨 | 国产乱码精品一品二品 | 蜜桃视频韩日免费播放 | 大地资源网第二页免费观看 | 波多野结衣一区二区三区av免费 | 久久久婷婷五月亚洲97号色 | 国产高清av在线播放 | 精品无码国产自产拍在线观看蜜 | 成熟人妻av无码专区 | 欧美老熟妇乱xxxxx | 国产成人一区二区三区在线观看 | 亚洲精品成a人在线观看 | 中文字幕无码av激情不卡 | 亚洲 a v无 码免 费 成 人 a v | 又大又黄又粗又爽的免费视频 | 沈阳熟女露脸对白视频 | 亚洲中文字幕在线观看 | 国产在线无码精品电影网 | 国产成人精品久久亚洲高清不卡 | 国产精品久久久午夜夜伦鲁鲁 | 美女张开腿让人桶 | 国内精品一区二区三区不卡 | 狠狠色噜噜狠狠狠狠7777米奇 | 色综合天天综合狠狠爱 | 国产 精品 自在自线 | 国产乱人偷精品人妻a片 | 亚洲精品鲁一鲁一区二区三区 | 亚洲小说春色综合另类 | 色婷婷综合激情综在线播放 | 国产一区二区三区影院 | 国产国语老龄妇女a片 | 国产在线一区二区三区四区五区 | 国产亚洲精品久久久久久大师 | 99久久婷婷国产综合精品青草免费 | 荫蒂被男人添的好舒服爽免费视频 | 麻豆人妻少妇精品无码专区 | 亚洲成av人影院在线观看 | 久激情内射婷内射蜜桃人妖 | 中文字幕+乱码+中文字幕一区 | 日本爽爽爽爽爽爽在线观看免 | 亚洲爆乳无码专区 | 国产一区二区三区影院 | √天堂资源地址中文在线 | 国产成人无码a区在线观看视频app | 日本成熟视频免费视频 | 97色伦图片97综合影院 | 清纯唯美经典一区二区 | 少妇性荡欲午夜性开放视频剧场 | 中文字幕+乱码+中文字幕一区 | 精品人人妻人人澡人人爽人人 | 精品少妇爆乳无码av无码专区 | 日日摸夜夜摸狠狠摸婷婷 | 高中生自慰www网站 | 亚洲一区二区观看播放 | 亚洲a无码综合a国产av中文 | 亚拍精品一区二区三区探花 | 免费国产成人高清在线观看网站 | 国产偷国产偷精品高清尤物 | 日本成熟视频免费视频 | 亚洲爆乳无码专区 | 亚洲 日韩 欧美 成人 在线观看 | 无码av免费一区二区三区试看 | 国精品人妻无码一区二区三区蜜柚 | 西西人体www44rt大胆高清 | 人妻少妇精品无码专区二区 | 精品国产乱码久久久久乱码 | 国产两女互慰高潮视频在线观看 | 无码任你躁久久久久久久 | 18禁止看的免费污网站 | 精品偷拍一区二区三区在线看 | 国产激情一区二区三区 | 国产在线精品一区二区三区直播 | 国产精品高潮呻吟av久久 | 欧美日韩亚洲国产精品 | 一个人免费观看的www视频 | 无码精品人妻一区二区三区av | 奇米影视888欧美在线观看 | 亚洲中文字幕久久无码 | 男女猛烈xx00免费视频试看 | 国产精品怡红院永久免费 | 18禁止看的免费污网站 | 亚洲国产精品久久人人爱 | 亚洲人亚洲人成电影网站色 | 国产亚洲美女精品久久久2020 | 日日橹狠狠爱欧美视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 中文字幕人成乱码熟女app | 粗大的内捧猛烈进出视频 | 久激情内射婷内射蜜桃人妖 | 在线看片无码永久免费视频 | 在线看片无码永久免费视频 | 奇米影视888欧美在线观看 | 久久久久免费精品国产 | 国产在线精品一区二区三区直播 | 丰满人妻精品国产99aⅴ | 国产午夜手机精彩视频 | 黑人巨大精品欧美一区二区 | 亚洲无人区午夜福利码高清完整版 | 国产亚洲人成a在线v网站 | 人人妻在人人 | 男女下面进入的视频免费午夜 | 国产精品欧美成人 | 狠狠噜狠狠狠狠丁香五月 | 秋霞成人午夜鲁丝一区二区三区 | 99久久久无码国产精品免费 | 成人aaa片一区国产精品 | 亚洲成av人片在线观看无码不卡 | 天堂亚洲免费视频 | 97夜夜澡人人爽人人喊中国片 | 国产九九九九九九九a片 | 东京热无码av男人的天堂 | 亚洲国精产品一二二线 | 中国女人内谢69xxxxxa片 | 久久99精品国产麻豆蜜芽 | 国产成人精品一区二区在线小狼 | 天天躁日日躁狠狠躁免费麻豆 | 无码av中文字幕免费放 | 狠狠躁日日躁夜夜躁2020 | 夜精品a片一区二区三区无码白浆 | 日韩少妇白浆无码系列 | 九九在线中文字幕无码 | 乱中年女人伦av三区 | 无码av岛国片在线播放 | 日韩欧美中文字幕公布 | 亚洲精品一区二区三区大桥未久 | 色偷偷人人澡人人爽人人模 | 国产内射爽爽大片视频社区在线 | 中国女人内谢69xxxx | 亚洲一区二区三区 | 国产va免费精品观看 | 国产xxx69麻豆国语对白 | 激情内射日本一区二区三区 | 亚洲а∨天堂久久精品2021 | 国产精品第一国产精品 | 中文久久乱码一区二区 | 黑人玩弄人妻中文在线 | 亚洲理论电影在线观看 | 人妻少妇精品无码专区二区 | 国产精品久久久久久亚洲影视内衣 | 国产精品va在线播放 | 特黄特色大片免费播放器图片 | 大屁股大乳丰满人妻 | 乱中年女人伦av三区 | 国内精品久久毛片一区二区 | 婷婷六月久久综合丁香 | 免费国产成人高清在线观看网站 | 女人被爽到呻吟gif动态图视看 | 激情亚洲一区国产精品 | 骚片av蜜桃精品一区 | 人人超人人超碰超国产 | 亚洲人成网站免费播放 | 国产午夜亚洲精品不卡 | 精品无码国产自产拍在线观看蜜 | 亚洲人成无码网www | 无码国产激情在线观看 | 少妇愉情理伦片bd | 伊人久久婷婷五月综合97色 | 成年美女黄网站色大免费视频 | 欧美成人家庭影院 | 亚洲色大成网站www | 国产明星裸体无码xxxx视频 | 激情爆乳一区二区三区 | 无码国内精品人妻少妇 | 人人澡人人妻人人爽人人蜜桃 | 精品国精品国产自在久国产87 | 无码人妻丰满熟妇区毛片18 | 久久久精品欧美一区二区免费 | 欧美一区二区三区 | 欧美人与禽猛交狂配 | 久久久精品人妻久久影视 | 天天综合网天天综合色 | av在线亚洲欧洲日产一区二区 | 国产精品高潮呻吟av久久 | 国产亚洲欧美日韩亚洲中文色 | 东京热男人av天堂 | 少妇性l交大片 | 亚洲欧洲中文日韩av乱码 | 未满成年国产在线观看 | 国产性生大片免费观看性 | 精品无码国产自产拍在线观看蜜 | √8天堂资源地址中文在线 | 天天摸天天透天天添 | 欧美乱妇无乱码大黄a片 | 国产舌乚八伦偷品w中 | 午夜福利试看120秒体验区 | 野狼第一精品社区 | 激情国产av做激情国产爱 | 久久久国产精品无码免费专区 | 国产成人无码午夜视频在线观看 | 在线а√天堂中文官网 | 国产精品人妻一区二区三区四 | 欧洲极品少妇 | 亚洲爆乳无码专区 | 欧美午夜特黄aaaaaa片 | 综合人妻久久一区二区精品 | 国产后入清纯学生妹 | 中文字幕无码日韩欧毛 | 麻豆国产人妻欲求不满谁演的 | 欧美国产日韩亚洲中文 | 暴力强奷在线播放无码 | 香港三级日本三级妇三级 | 全黄性性激高免费视频 | 亚洲一区二区三区无码久久 | 国产亚洲日韩欧美另类第八页 | 在线欧美精品一区二区三区 | 波多野结衣乳巨码无在线观看 | 玩弄中年熟妇正在播放 | 国产色在线 | 国产 | 丰满人妻被黑人猛烈进入 | 又湿又紧又大又爽a视频国产 | 国内丰满熟女出轨videos | 偷窥村妇洗澡毛毛多 | 久久亚洲中文字幕精品一区 | 国内丰满熟女出轨videos | 娇妻被黑人粗大高潮白浆 | 国产香蕉97碰碰久久人人 | 亚洲午夜久久久影院 | 精品少妇爆乳无码av无码专区 | 日韩人妻少妇一区二区三区 | 国产成人综合在线女婷五月99播放 | 亚洲aⅴ无码成人网站国产app | 麻花豆传媒剧国产免费mv在线 | 欧美精品一区二区精品久久 | 爽爽影院免费观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲精品久久久久中文第一幕 | 国产精品鲁鲁鲁 | 美女扒开屁股让男人桶 | 亚洲一区二区三区在线观看网站 | 欧美日韩视频无码一区二区三 | 久久熟妇人妻午夜寂寞影院 | 在线播放免费人成毛片乱码 | 精品国产一区av天美传媒 | 亚洲欧洲日本无在线码 | 日本精品高清一区二区 | 扒开双腿吃奶呻吟做受视频 | 久久亚洲中文字幕无码 | 国产极品美女高潮无套在线观看 | 色妞www精品免费视频 | 特大黑人娇小亚洲女 | 亚洲精品一区二区三区婷婷月 | 男人和女人高潮免费网站 | 免费看少妇作爱视频 | 在线视频网站www色 | 国产精品高潮呻吟av久久4虎 | 熟妇人妻无乱码中文字幕 | 免费无码肉片在线观看 | 亚洲熟妇自偷自拍另类 | 夜夜躁日日躁狠狠久久av | 丰满岳乱妇在线观看中字无码 | 亚洲一区二区三区在线观看网站 | 国产成人无码a区在线观看视频app | 露脸叫床粗话东北少妇 | 久久亚洲中文字幕精品一区 | 熟女少妇在线视频播放 | 少妇无码一区二区二三区 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲精品一区二区三区在线观看 | 日韩精品a片一区二区三区妖精 | 欧美人与禽猛交狂配 | 性欧美疯狂xxxxbbbb | 久久综合狠狠综合久久综合88 | 中文字幕无码免费久久99 | 国产三级久久久精品麻豆三级 | 大肉大捧一进一出好爽视频 | 中文字幕无码人妻少妇免费 | www国产亚洲精品久久久日本 | 人人妻人人澡人人爽欧美精品 | 色五月五月丁香亚洲综合网 | 久久久亚洲欧洲日产国码αv | 国产精品无码永久免费888 | 玩弄人妻少妇500系列视频 | 亚洲精品午夜无码电影网 | 偷窥村妇洗澡毛毛多 | 在线播放亚洲第一字幕 | 欧美激情内射喷水高潮 | 少妇激情av一区二区 | 亚洲精品鲁一鲁一区二区三区 | 亚洲精品中文字幕 | 中文字幕乱码中文乱码51精品 | 久久久久se色偷偷亚洲精品av | 无码毛片视频一区二区本码 | 乌克兰少妇性做爰 | 国产亚洲精品精品国产亚洲综合 | 在教室伦流澡到高潮hnp视频 | 久久国内精品自在自线 | 日本va欧美va欧美va精品 | 午夜精品久久久内射近拍高清 | 麻豆md0077饥渴少妇 | 日韩精品久久久肉伦网站 | 欧美日韩综合一区二区三区 | 久久综合色之久久综合 | 亚洲a无码综合a国产av中文 | 精品一二三区久久aaa片 | 久久午夜夜伦鲁鲁片无码免费 | 成人一区二区免费视频 | 亚洲国产欧美日韩精品一区二区三区 | 99久久人妻精品免费二区 | 国产精品久久久久久亚洲影视内衣 | 亚洲精品久久久久久一区二区 | 国产精品久久久久7777 | 久久久久av无码免费网 | 2019nv天堂香蕉在线观看 | 国产成人无码av一区二区 | 久久综合九色综合欧美狠狠 | 国产精品视频免费播放 | 成人免费视频视频在线观看 免费 | 国产av人人夜夜澡人人爽麻豆 | 国产九九九九九九九a片 | 亚洲国产欧美日韩精品一区二区三区 | 中文无码伦av中文字幕 | 中文字幕+乱码+中文字幕一区 | 99久久人妻精品免费二区 | 无码人妻丰满熟妇区毛片18 | 中文字幕无线码 | 老太婆性杂交欧美肥老太 | 国产情侣作爱视频免费观看 | 欧美zoozzooz性欧美 | 亚洲中文字幕无码中文字在线 | 精品 日韩 国产 欧美 视频 | 国产国产精品人在线视 | 精品国产aⅴ无码一区二区 | 亚洲欧洲日本无在线码 | 国产一区二区三区影院 | 亚洲日本va午夜在线电影 | 又大又硬又爽免费视频 | 十八禁视频网站在线观看 | 国产精品人人妻人人爽 | 国产熟妇另类久久久久 | 波多野结衣 黑人 | 久久99精品国产.久久久久 | 伊人久久大香线焦av综合影院 | 国内少妇偷人精品视频 | 国产深夜福利视频在线 | 国产成人精品视频ⅴa片软件竹菊 | 精品久久久久久亚洲精品 | 超碰97人人射妻 | 亚洲精品成a人在线观看 | 久久国产精品二国产精品 | 一本无码人妻在中文字幕免费 | 人人爽人人澡人人高潮 | 久久五月精品中文字幕 | 福利一区二区三区视频在线观看 | 妺妺窝人体色www在线小说 | 久久天天躁狠狠躁夜夜免费观看 | 免费观看的无遮挡av | 人人超人人超碰超国产 | 红桃av一区二区三区在线无码av | 成人影院yy111111在线观看 | 亚洲日韩中文字幕在线播放 | 国产精品美女久久久 | 内射爽无广熟女亚洲 | 精品厕所偷拍各类美女tp嘘嘘 | 红桃av一区二区三区在线无码av |