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

Какие знаешь признаки TCP?

2.0 Middle🔥 201 комментариев
#REST API и микросервисы

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

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

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

Основные признаки и свойства TCP (Transmission Control Protocol)

TCP — это один из самых важных протоколов в интернете. Как Java разработчик, нужно понимать его ключевые характеристики.

1. Ориентированность на соединение (Connection-oriented)

Перед передачей данных TCP устанавливает соединение (Three-way handshake):

Клиент                    Сервер
   |------SYN------>|
   |<------SYN+ACK--|
   |------ACK------>|
   ✓ Соединение установлено

Такой подход гарантирует, что сервер готов получать данные.

// В Java
ServerSocket serverSocket = new ServerSocket(8080);
Socket clientSocket = serverSocket.accept(); // ждет подключения

2. Надежность (Reliable delivery)

ТCP гарантирует, что все пакеты придут в правильном порядке и без потерь:

[Пакет 1] → Потерян
[Пакет 2] → Пришел

Сервер: "Жди, не хватает пакета 1!"
Клиент: "Сейчас переошлю пакет 1"
[Пакет 1] → Пришел

[Пакет 1][Пакет 2] ✓ Все в порядке

Механизм: последовательные номера (Sequence numbers) + подтверждения (ACK):

// Если пакет не подтвержден за таймаут → переотправка
// Это автоматически, приложение видит только надежный поток
OutputStream out = socket.getOutputStream();
out.write(data); // гарантированная доставка

3. Упорядоченность (In-order delivery)

Данные придут в том же порядке, в котором были отправлены:

// Отправляю
out.write("Hello ".getBytes());
out.write("World".getBytes());

// Получу в том же порядке
InputStream in = socket.getInputStream();
String received = new String(in.readAllBytes()); // "Hello World"

4. Управление потоком (Flow control)

Сервер может сказать клиенту: "Стоп, я не успеваю обрабатывать!"

Клиент отправляет со скоростью 1MB/sec
Сервер: "Мой буфер заполнился"
Клиент: автоматически снижает скорость

Это осуществляется через Window Size в TCP заголовке:

Socket socket = new Socket("server.com", 80);
// TCP автоматически регулирует скорость отправки
// в зависимости от возможности приемника

5. Управление перегруженностью (Congestion control)

ТCP умный: если в сети много трафика и потери растут, он снижает скорость:

Отправляю 100 пакетов - все приходят ✓
Отправляю 200 пакетов - 10 потеряны
ТCP: "Ладно, буду отправлять медленнее"
Отправляю 150 пакетов - все приходят ✓

Алгоритмы: Slow Start, Congestion Avoidance, Fast Recovery.

6. Полнодуплексность (Full-duplex)

Я могу одновременно отправлять И получать данные:

OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();

// В одном потоке отправляю
out.write("ping".getBytes());

// Одновременно в другом потоке получаю ответ
System.out.println(new String(in.readAllBytes())); // "pong"

7. Graceful shutdown (корректное завершение)

ТCP позволяет корректно закрыть соединение (Four-way handshake):

Клиент                    Сервер
   |-------FIN------->|
   |<------ACK--------|
   |<-------FIN-------|
   |--------ACK------>|
   ✓ Соединение закрыто, все данные доставлены
try (Socket socket = new Socket("server.com", 80)) {
  // использование
} // автоматический корректный closet (FIN отправляется)

8. Задержка (Latency) vs Пропускная способность (Throughput)

RTT (Round Trip Time):

Отправляю SYN → ждаю SYN+ACK → отправляю ACK
Это занимает 50ms (в среднем для интернета)

Throughput (пропускная способность):

Можно передать 1MB/sec если канал стабилен

9. Порты

ТCP использует порты для разных сервисов:

80  - HTTP
443 - HTTPS
22  - SSH
3306 - MySQL
5432 - PostgreSQL
ServerSocket server = new ServerSocket(8080);
// Слушаю на порту 8080

Сравнение с UDP

ТCP:              UDP:
✓ Надежный      ✗ Ненадежный (может потеряться)
✓ Упорядочен    ✗ Может быть не в порядке
✗ Медленнее      ✓ Быстрее (нет подтверждений)
✓ Соединение     ✗ Без соединения

Узе:             Видео/аудио потоки
Играки           VoIP, DNS
Э-мейл

На Java: Сокеты

// Сервер
ServerSocket server = new ServerSocket(8080);
Socket client = server.accept();
InputStream in = client.getInputStream();
OutputStream out = client.getOutputStream();
out.write("Hello".getBytes());

// Клиент
Socket socket = new Socket("localhost", 8080);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
String response = new String(in.readAllBytes());

Важные параметры TCP в Java

socket.setTcpNoDelay(true);      // отключить алгоритм Nagle
socket.setSoTimeout(5000);        // таймаут на read
socket.setKeepAlive(true);        // отправлять keep-alive пакеты
socket.setReceiveBufferSize(65536); // размер буфера приема

Выводы

  1. TCP — это надежный, упорядоченный, полнодуплексный протокол
  2. Цена надежности — задержка из-за подтверждений
  3. Отлично подходит для веб, почты, SSH
  4. UDP быстрее, но ненадежен (видео, игры)
  5. В Java используй Socket/ServerSocket для TCP