← Назад к вопросам

Что такое connection timeout в HTTPs?

2.3 Middle🔥 161 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Connection Timeout в HTTPS

Connection timeout — это максимальное время ожидания, в течение которого клиент пытается установить соединение с сервером. Если соединение не установлено за это время, выбрасывается исключение SocketTimeoutException или ConnectException.

Различие между типами таймаутов

В HTTP/HTTPS общепринято различать два основных типа таймаутов:

  • Connection Timeout (время подключения) — время на установку TCP соединения и выполнение TLS handshake
  • Read Timeout (время чтения) — время, в течение которого клиент ждёт ответ от сервера после отправки запроса
  • Write Timeout (время записи) — время на отправку данных серверу

Как работает Connection Timeout

При установке HTTPS соединения происходит следующее:

  1. TCP three-way handshake (SYN, SYN-ACK, ACK)
  2. TLS handshake (ClientHello, ServerHello, Certificate, Key Exchange и т.д.)
  3. Соединение готово к обмену данными

Если все эти этапы не завершены за отведённое время (connection timeout), соединение прерывается.

Пример с HttpURLConnection

import java.net.HttpURLConnection;
import java.net.URL;

public class HttpTimeoutExample {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://api.example.com/data");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            
            // Connection timeout: 5 секунд
            connection.setConnectTimeout(5000);
            
            // Read timeout: 10 секунд
            connection.setReadTimeout(10000);
            
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
            
            connection.disconnect();
        } catch (java.net.SocketTimeoutException e) {
            System.err.println("Connection timeout occurred: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }
    }
}

Пример с HttpClient (Java 11+)

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

public class HttpClientTimeoutExample {
    public static void main(String[] args) throws Exception {
        HttpClient httpClient = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(5))  // Connection timeout
            .build();
        
        HttpRequest request = HttpRequest.newBuilder()
            .uri(new java.net.URI("https://api.example.com/data"))
            .timeout(Duration.ofSeconds(10))  // Read timeout
            .GET()
            .build();
        
        try {
            HttpResponse<String> response = httpClient.send(request, 
                HttpResponse.BodyHandlers.ofString());
            System.out.println("Status: " + response.statusCode());
            System.out.println("Body: " + response.body());
        } catch (java.net.http.HttpTimeoutException e) {
            System.err.println("HTTP timeout: " + e.getMessage());
        }
    }
}

Пример с OkHttp

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.util.concurrent.TimeUnit;

public class OkHttpTimeoutExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient httpClient = new OkHttpClient.Builder()
            .connectTimeout(5, TimeUnit.SECONDS)  // Connection timeout
            .readTimeout(10, TimeUnit.SECONDS)    // Read timeout
            .writeTimeout(10, TimeUnit.SECONDS)   // Write timeout
            .build();
        
        Request request = new Request.Builder()
            .url("https://api.example.com/data")
            .build();
        
        try (Response response = httpClient.newCall(request).execute()) {
            System.out.println("Status: " + response.code());
            System.out.println("Body: " + response.body().string());
        } catch (java.net.SocketTimeoutException e) {
            System.err.println("Socket timeout: " + e.getMessage());
        }
    }
}

Рекомендуемые значения

  • Connection Timeout: 5-10 секунд (для локальной сети), 10-30 секунд (для интернета)
  • Read Timeout: 10-60 секунд (зависит от типа запроса)
  • Write Timeout: аналогично read timeout

Обработка исключений

try {
    // HTTP запрос
} catch (SocketTimeoutException e) {
    // Таймаут соединения или чтения
    logger.warn("Timeout occurred, retrying...");
} catch (ConnectException e) {
    // Ошибка подключения
    logger.error("Connection failed");
} catch (IOException e) {
    // Прочие ошибки IO
    logger.error("IO error occurred");
}

Важные моменты

  • TLS handshake может быть долгим, особенно на мобильных сетях
  • Connection pooling помогает избежать частых переподключений
  • Слишком короткие таймауты приводят к false positives
  • Слишком длинные таймауты замораживают приложение
  • При retry логике важно различать ошибки и не повторять non-idempotent операции

Connection timeout в HTTPS критичен для создания отказоустойчивых приложений, так как сеть всегда ненадёжна.