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

В чём разница между TCP и UDP?

2.0 Middle🔥 192 комментариев
#Сеть и мультиплеер

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Разница между TCP и UDP

При разработке сетевых функций в Unity, особенно для мультиплеерных игр, понимание различий между TCP (Transmission Control Protocol) и UDP (User Datagram Protocol) критически важно. Это два фундаментальных транспортных протокола, работающих поверх IP, но с диаметрально противоположной философией.

Ключевые различия

1. Гарантия доставки и порядок пакетов

  • TCP: Протокол с установкой соединения. Гарантирует доставку данных, их целостность и правильную последовательность. Использует подтверждения (ACK), повторные передачи (retransmission) и механизмы контроля потока.
  • UDP: Без установки соединения. Отправляет пакеты (датаграммы) без гарантий. Пакеты могут быть потеряны, продублированы или прийти в неправильном порядке. Разработчик сам должен обрабатывать эти сценарии, если они критичны.

2. Надёжность vs. Скорость и задержка (Latency)

  • TCP обеспечивает надёжность, но за это приходится платить:
    - Большими накладными расходами (заголовки, подтверждения).
    - **Задержками** из-за механизмов подтверждения и перепосылки потерянных пакетов ("head-of-line blocking").
  • UDP жертвует надёжностью ради:
    - Минимальных накладных расходов.
    - Предсказуемой и низкой **задержки**. Потерянный пакет не задерживает последующие.

3. Контроль потока и перегрузки

  • TCP динамически регулирует скорость отправки данных на основе загруженности сети и возможностей получателя, предотвращая "переполнение".
  • UDP не имеет встроенного контроля. Приложение может отправлять данные с любой скоростью, рискуя перегрузить сеть или сокет получателя.

Применение в разработке игр на Unity

Для большинства современных экшен-игр, шутеров, гонок и других динамичных жанров предпочтение отдаётся UDP. Низкая и стабильная задержка здесь важнее 100% доставки каждого бита информации.

// Пример использования UDPClient в Unity (C#)
using System;
using System.Net;
using System.Net.Sockets;
using UnityEngine;

public class SimpleUDPClient : MonoBehaviour
{
    private UdpClient udpClient;
    private IPEndPoint serverEndPoint;

    void Start()
    {
        // Создание UDP-клиента для отправки на сервер 127.0.0.1:9050
        udpClient = new UdpClient();
        serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
    }

    void Update()
    {
        // В играх отправка часто привязана к игровому циклу (Update/FixedUpdate)
        SendGameStateUpdate();
    }

    void SendGameStateUpdate()
    {
        byte[] playerPositionData = GetPlayerPositionBytes(); // Сериализация состояния
        udpClient.Send(playerPositionData, playerPositionData.Length, serverEndPoint);
    }

    private byte[] GetPlayerPositionBytes()
    {
        // Преобразование Vector3 в массив байт (пример упрощён)
        Vector3 pos = transform.position;
        byte[] bytes = new byte[12]; // 3 float * 4 bytes
        Buffer.BlockCopy(BitConverter.GetBytes(pos.x), 0, bytes, 0, 4);
        Buffer.BlockCopy(BitConverter.GetBytes(pos.y), 0, bytes, 4, 4);
        Buffer.BlockCopy(BitConverter.GetBytes(pos.z), 0, bytes, 8, 4);
        return bytes;
    }

    void OnApplicationQuit()
    {
        udpClient?.Close();
    }
}

TCP же может быть хорошим выбором для:

  • Пошаговых стратегий (TBS), карточных игр — где важна полная доставка, а задержка не критична.
  • Систем чата, передачи текстовых сообщений.
  • Начальной стадии соединения (handshake), загрузки контента или передачи критически важных данных, которые нельзя потерять, поверх того же UDP-канала.

Гибридные подходы и высокоуровневые решения

На практике в Unity редко используют "чистый" UDP или TCP напрямую через низкоуровневые сокеты. Вместо этого применяют:

  • Game-specific protocols: Собственные протоколы поверх UDP, реализующие частичную надёжность только для критичных данных (например, команда "игрок умер").
  • Транспортные библиотеки:
    *   **Unity Netcode / Netcode for GameObjects (NGO)**: Использует **Unity Transport Package (UTP)**, который построен на **продвинутой реализации UDP** (Relay, SIMD-сериализация).
    *   **Photon Engine, Mirror, DarkRift и другие**: Также часто используют UDP как основу, добавляя свои слои надёжности.
    *   **ENET, RakNet (идейный предшественник)**: Библиотеки, предоставляющие гибридную модель с несколькими каналами (надёжными, ненадёжными, упорядоченными) поверх UDP.

Вывод для геймдева: UDP — это "золотой стандарт" для геймплейного трафика в реальном времени благодаря низкой задержке. TCP — инструмент для задач, где важна гарантированная доставка, а время не является критичным фактором. Современные сетевые решения в Unity абстрагируют разработчика от прямой работы с протоколами, но понимание их принципов необходимо для оптимизации, отладки сетевого кода и выбора правильной архитектуры.