Ответ
Протоколы транспортного уровня (L4 модели OSI) отвечают за сквозную передачу данных между приложениями на разных хостах. Основные протоколы — TCP и UDP.
TCP (Transmission Control Protocol)
Протокол, ориентированный на установление соединения. Его главная цель — надежность.
Ключевые характеристики:
- Надежность: Гарантирует доставку данных в правильном порядке и без потерь. Потерянные пакеты запрашиваются и отправляются повторно.
- Установка соединения: Перед обменом данными происходит тройное рукопожатие (
SYN,SYN-ACK,ACK) для установки соединения. - Упорядоченность: Пакеты нумеруются (sequence numbers), что позволяет собрать их на принимающей стороне в правильном порядке.
- Контроль потока: Механизмы (например, скользящее окно) предотвращают переполнение буфера получателя.
Сценарии использования: Веб-трафик (HTTP/HTTPS), электронная почта (SMTP), передача файлов (FTP), подключение к базам данных.
UDP (User Datagram Protocol)
Протокол без установления соединения. Его главная цель — скорость и минимальные накладные расходы.
Ключевые характеристики:
- Ненадежность: Не гарантирует доставку, порядок и целостность данных. Пакеты (датаграммы) просто "выстреливаются" в сторону получателя.
- Без соединения: Нет рукопожатий, данные отправляются сразу.
- Высокая скорость: Минимальная задержка, так как нет механизмов контроля и повторной отправки.
- Простота: Заголовок UDP намного меньше и проще, чем у TCP.
Сценарии использования: Стриминг видео и аудио (VoIP), онлайн-игры, DNS-запросы, системы мониторинга, где потеря одного пакета не критична.
Сводка и примеры в Go
| Характеристика | TCP | UDP |
|---|---|---|
| Надежность | Высокая | Низкая |
| Соединение | Требуется | Не требуется |
| Скорость | Медленнее | Быстрее |
| Порядок пакетов | Гарантирован | Не гарантирован |
| Накладные расходы | Выше | Ниже |
Пример кода на Go:
// TCP-клиент: надежное соединение
conn, err := net.Dial("tcp", "example.com:80")
if err != nil {
// Обработка ошибки
}
defer conn.Close()
// UDP-клиент: быстрая отправка без гарантий
conn, err := net.Dial("udp", "8.8.8.8:53") // DNS-запрос к Google DNS
if err != nil {
// Обработка ошибки
}
defer conn.Close()