В течение последних двух недель наши клиенты начинают видеть 100 из этих "SSLException error - Connection reset by peer", и я не могу понять, почему
-
Мы используем Retrofit с okhttp, без специальной конфигурации
public class OkHttpClientProvider implements IOkHttpClientProvider { OkHttpClient okHttpClient; public OkHttpClientProvider() { this.okHttpClient = createClient(); } public OkHttpClient getOkHttpClient() { return this.okHttpClient; } private OkHttpClient createClient() { return new OkHttpClient(); } }
Вышеуказанный клиентский провайдер является одноэлементным. RestAdapter построен с использованием этого вложенного клиента (мы используем кинжал) -
RestAdapter.Builder restAdapterBuilder = new RestAdapter.Builder()
.setConverter(converter)
.setEndpoint(networkRequestDetails.getServerUrl())
.setClient(new OkClient(okHttpClientProvider.getOkHttpClient()))
.setErrorHandler(new NetworkSynchronousErrorHandler(eventBus))
);
Основываясь на решениях переполнения стеллажей, что я обнаружил -
-
Продолжительность сохранения на сервере составляет 180 секунд, OkHttp имеет значение по умолчанию 300 секунд.
-
Сервер возвращает "Соединение: закрыть" в своем заголовке, но клиентский запрос отправляет "Connection: keepAlive"
-
Сервер поддерживает TLS 1.0/1.1/1.2 и использует Open SSL
-
Наши серверы недавно перешли на другой хостинг-провайдер в другой географии, поэтому я не знаю, являются ли эти DNS-сбои или нет.
-
Мы попытались настроить такие вещи, как keepAlive, перенастроить OpenSSL на сервере, но по какой-то причине клиент Android продолжает получать эту ошибку.
-
Это происходит немедленно, без каких-либо задержек, когда вы пытаетесь использовать приложение для публикации чего-либо или для обновления (оно даже не идет в сеть или не задерживается до того, как это исключение произойдет, что будет означать, что соединение уже сломаны). Но пытаюсь это несколько раз как-то "исправляет", и мы добиваемся успеха. Это происходит снова позже
-
Мы аннулировали наши записи DNS на сервере, чтобы узнать, не вызвало ли это то, что вызвало это, но это не помогло
-
В основном это происходит на LTE, но я видел его также на Wifi
Я не хочу отключать поддержку, потому что большинство современных клиентов этого не делают. Также мы используем OkHttp 2.4, и это проблема на почтовых устройствах сэндвич-мороженого, поэтому я надеюсь, что он должен позаботиться об этих проблемах с сетью. Клиент iOS также получает эти исключения, но почти в 100 раз меньше (клиент iOS использует AFNetworking 2.0). Я изо всех сил пытаюсь найти новые вещи, чтобы попробовать на этом этапе, любую помощь/идеи?
Обновление - добавление полной трассировки стека через okhttp
retrofit.RetrofitError: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:390)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source)
at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: javax.net.ssl.SSLException: Read error: ssl=0x9dd07200: I/O error during system call, Connection reset by peer
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:699)
at okio.Okio$2.read(Okio.java:137)
at okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
at okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
at okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
at com.squareup.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:917)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:793)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:439)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:384)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
at com.squareup.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
at com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at java.lang.reflect.Proxy.invoke(Proxy.java:397)
at $Proxy15.getAccessTokenUsingResourceOwnerPasswordCredentials(Unknown Source)
at com.company.droid.repository.network.NetworkRepository.getAccessTokenUsingResourceOwnerPasswordCredentials(NetworkRepository.java:76)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:88)
at com.company.droid.ui.login.LoginTask.doInBackground(LoginTask.java:23)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
]}