Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные признаки и свойства 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); // размер буфера приема
Выводы
- TCP — это надежный, упорядоченный, полнодуплексный протокол
- Цена надежности — задержка из-за подтверждений
- Отлично подходит для веб, почты, SSH
- UDP быстрее, но ненадежен (видео, игры)
- В Java используй Socket/ServerSocket для TCP