Каковы основные характеристики протокола TCP?

«Каковы основные характеристики протокола TCP?» — вопрос из категории Сети, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TCP (Transmission Control Protocol) — это протокол транспортного уровня стека TCP/IP, обеспечивающий надёжную, упорядоченную и проверенную на ошибки доставку потока байтов между приложениями, работающими на разных хостах.

Ключевые характеристики:

  1. Надёжность и подтверждение доставки:

    • Получатель отправляет отправителю подтверждения (ACK) о получении пакетов.
    • Отправитель повторно передаёт пакеты, если не получил подтверждение в течение таймаута.
  2. Упорядоченность данных:

    • Пакеты данных (сегменты) нумеруются. Получатель собирает их в правильном порядке, даже если они пришли в сети в другом.
  3. Контроль перегрузки и потока:

    • Управление потоком: Механизм «скользящего окна» предотвращает переполнение буфера получателя.
    • Управление перегрузкой: Алгоритмы (например, медленный старт, предотвращение перегрузки) динамически регулируют скорость отправки данных в зависимости от загруженности сети.
  4. Установка соединения (handshake):

    • Перед обменом данными происходит трёхэтапное рукопожатие (SYN, SYN-ACK, ACK) для установки виртуального канала.

Пример создания TCP-соединения на Java:

Сервер:

// Сервер слушает порт 8080
try (ServerSocket serverSocket = new ServerSocket(8080)) {
    System.out.println("Server listening on port 8080...");
    // accept() блокируется, пока клиент не подключится
    Socket clientSocket = serverSocket.accept();
    // Получение входного потока от клиента
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    String message = in.readLine();
    System.out.println("Received: " + message);
}

Клиент:

// Клиент подключается к серверу на localhost:8080
try (Socket socket = new Socket("localhost", 8080)) {
    // Отправка данных серверу
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    out.println("Hello from TCP client!");
}

Типичное применение: Веб-браузеры (HTTP/HTTPS), передача файлов (FTP, SFTP), электронная почта (SMTP, IMAP), удалённый доступ (SSH).