Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Тема
Описание
Доп.

TCP и UDP в Rust

Rust предоставляет работу с TCP и UDP через стандартную библиотеку (std::net) и асинхронно через tokio или async-std.

TCP_Rust_example

UDP_Rust_example

  1. Синхронное vs асинхронное программирование:

    • Синхронные TCP/UDP блокируют поток.
    • Асинхронные (Tokio, async-std) позволяют масштабировать с большим количеством соединений.
  2. Надёжность:

    • TCP гарантирует доставку, UDP — нет. Если нужна надежность на UDP (например, для QUIC), её нужно реализовать на уровне приложения.
  3. Выбор протокола для задач:

    • REST/API — TCP (HTTP/1.1, HTTP/2)
    • HTTP/3 — UDP (QUIC)
    • Онлайн-игры/стриминг — UDP
    • Чат или файлообмен — TCP

TCP (Transmission Control Protocol)

TCP (Transmission Control Protocol)

  • Надёжный потоковый протокол.

  • Гарантирует доставку пакетов в правильном порядке.

  • Контролирует потерю пакетов, перепроверяет данные.

  • Использует соединение «точка-точка» (handshake 3-way).

  • Подходит для:

    • HTTP/1.1, HTTP/2
    • FTP
    • Email (SMTP, IMAP, POP3)

Плюсы:

  • Надёжность
  • Поток данных
  • Контроль ошибок

Минусы:

  • Более медленный, из-за проверки и повторной передачи
  • Head-of-line blocking (пакет потерян → ждут все последующие)

TCP Синхронно:


use std::net::TcpStream;
use std::io::{Read, Write};

fn main() -> std::io::Result<()> {
    let mut stream = TcpStream::connect("example.com:80")?;
    stream.write_all(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")?;
    
    let mut response = String::new();
    stream.read_to_string(&mut response)?;
    println!("{}", response);
    Ok(())
}
 

TCP Асинхронно (Tokio):


use tokio::net::TcpStream;
use tokio::io::{AsyncReadExt, AsyncWriteExt};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut stream = TcpStream::connect("example.com:80").await?;
    stream.write_all(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n").await?;

    let mut response = vec![0; 1024];
    let n = stream.read(&mut response).await?;
    println!("{}", String::from_utf8_lossy(&response[..n]));
    Ok(())
}

UDP (User Datagram Protocol)

UDP (User Datagram Protocol)

  • Протокол без установления соединения.

  • Не гарантирует доставку, порядок или целостность.

  • «Просто» отправляет пакеты (датаграммы).

  • Подходит для:

    • DNS-запросов
    • Онлайн-игр
    • Видеостриминга
    • QUIC/HTTP/3

Плюсы:

  • Низкая задержка
  • Простота
  • Подходит для потоковой передачи и real-time приложений

Минусы:

  • Нет гарантии доставки
  • Нужно самим обрабатывать потери и порядок пакетов, если важно

UDP Синхронно:


use std::net::UdpSocket;

fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("0.0.0.0:0")?;
    socket.send_to(b"hello", "example.com:8080")?;

    let mut buf = [0; 1024];
    let (amt, src) = socket.recv_from(&mut buf)?;
    println!("Received {} bytes from {}: {:?}", amt, src, &buf[..amt]);
    Ok(())
}

UDP Асинхронно (Tokio):


use tokio::net::UdpSocket;

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let socket = UdpSocket::bind("0.0.0.0:0").await?;
    socket.send_to("hello".as_bytes(), "example.com:8080").await?;

    let mut buf = [0; 1024];
    let (amt, src) = socket.recv_from(&mut buf).await?;
    println!("Received {} bytes from {}: {:?}", amt, src, &buf[..amt]);
    Ok(())
}

HTTP/3 и QUIC

neqo-http3

HTTP/3: the past, the present, and the future

[Реализации HTTP/3](https://github.com/quicwg/base-drafts/wiki/Implementations

1. HTTP/3 и QUIC: что это

HTTP/3 — это новая версия протокола HTTP, которая пришла на смену HTTP/1.1 и HTTP/2. Она использует QUIC как транспортный протокол вместо TCP.

QUIC (Quick UDP Internet Connections) — это транспортный протокол, построенный поверх UDP, который объединяет функции TCP, TLS и управление потоками в одном протоколе.

По сути:

  • HTTP/3 = HTTP поверх QUIC
  • QUIC = современная альтернатива TCP + TLS, только быстрее и с лучшей устойчивостью к потерям пакетов.

2. Почему не TCP?

TCP имеет несколько ограничений, особенно для современных веб-приложений:

  1. Head-of-line blocking (Блокировка головы очереди)

    • В TCP, если один пакет теряется, все последующие пакеты ждут восстановления, даже если они уже получены.
    • Это сильно замедляет загрузку страниц и потоковое видео.
  2. Медленное установление соединения

    • TCP требует 3-way handshake, плюс отдельный handshake для TLS.
  3. Плохая мобильная производительность

    • При смене сети (например, с Wi-Fi на 4G) TCP-соединение разрывается и его нужно устанавливать заново.

3. Преимущества HTTP/3 и QUIC

  1. Быстрое соединение

    • QUIC объединяет handshake TCP и TLS, что позволяет быстрее устанавливать безопасное соединение.
  2. Меньше блокировок

    • Каждый поток данных в QUIC независим, поэтому потеря пакета не блокирует другие потоки.
  3. Лучше работает при плохой сети

    • QUIC адаптируется к потере пакетов и переходам между сетями.
  4. Встроенная безопасность

    • QUIC сразу шифрует весь трафик (аналог TLS).
  5. Оптимизирован для современных веб-приложений

    • Быстрая загрузка сайтов, видеостриминг, онлайн-игры, API с большим количеством параллельных запросов.

4. Где это уже используется

  • Браузеры: Chrome, Firefox, Edge, Safari поддерживают HTTP/3.
  • Сервера и CDN: Cloudflare, Google, Fastly, nginx (экспериментально), LiteSpeed.

Коротко:

HTTP/3 + QUIC нужен, чтобы веб был быстрее, надежнее и безопаснее, особенно на мобильных устройствах и при параллельной загрузке большого количества данных.

Истинное мультиплексирование с HTTP / 3 и QUIC

Введите HTTP / 3. Основное различие между HTTP / 2 и HTTP / 3 заключается в том, какой транспортный протокол они используют. Вместо TCP HTTP / 3 использует новый протокол под названием QUIC . QUIC - это транспортный протокол общего назначения, предназначенный для решения проблем блокировки заголовка строки, которые HTTP / 2 имеет с TCP. Он позволяет вам создавать серию потоков с отслеживанием состояния (подобных TCP) через UDP.

Сравнительная таблица для HTTP/1.1, HTTP/2 и HTTP/3 с ключевыми отличиями и объяснением роли QUIC:

ХарактеристикаHTTP/1.1HTTP/2HTTP/3 (с QUIC)
Транспортный протоколTCPTCPQUIC (UDP)
МультиплексированиеНет, один запрос за соединениеДа, несколько запросов в одном соединенииДа, несколько независимых потоков
Head-of-line blockingЕсть, один потерянный пакет блокирует очередьЕсть, TCP блокирует потоки при потере пакетаНет, потеря пакета блокирует только поток, другие продолжают
Установка соединения3-way handshake TCP + TLS отдельно3-way handshake TCP + TLS отдельноБыстрое соединение: handshake QUIC + TLS за один шаг
ЗашифрованностьTLS по выбору сервераTLS по выбору сервераВсегда TLS встроен в QUIC
Поддержка мобильных сетейПлохая, соединение теряется при смене сетиСредняя, соединение разрывается при смене сетиОтличная, QUIC позволяет менять сеть без разрыва соединения
Эффективность загрузкиНизкая, много соединений, блокировкиВыше, за счет мультиплексирования и сжатия заголовковОчень высокая, быстрые параллельные потоки, меньше задержек
Использование ресурсов сервераВыше, много TCP-соединенийНиже, меньше соединенийОптимизировано, меньше накладных расходов на соединения

Кратко:

  • HTTP/1.1 — базовый, простая модель, проблемы с блокировкой и множеством соединений.
  • HTTP/2 — добавляет мультиплексирование и сжатие заголовков, но всё ещё использует TCP, поэтому есть ограничения при потере пакетов.
  • HTTP/3 + QUIC — решает проблемы TCP: быстрый handshake, независимые потоки, встроенное шифрование и лучше работает в мобильных сетях.

В экосистеме Rust поддержка HTTP/3 активно развивается.

Основные библиотеки для HTTP/3 и QUIC в Rust

1. quiche

  • Описание: Реализация протоколов QUIC и HTTP/3 от Cloudflare, соответствующая спецификациям IETF. Предоставляет низкоуровневый API для обработки QUIC-пакетов и управления состоянием соединений.
  • Особенности: Позволяет создавать серверы и клиенты, поддерживающие HTTP/3.
  • Документация: docs.rs/quiche

2. quinn

  • Описание: Асинхронная реализация QUIC для Rust, ориентированная на удобство использования и производительность.
  • Особенности: Поддерживает HTTP/3 и интеграцию с Tokio.
  • Документация: docs.rs/quinn

3. neqo

  • Описание: Реализация QUIC от Mozilla, используемая в Firefox и других продуктах.
  • Особенности: Включает поддержку HTTP/3 и QPACK.
  • Документация: docs.rs/neqo

4. sec-http3

  • Описание: Асинхронная реализация HTTP/3 с поддержкой WebTransport.
  • Особенности: Предоставляет модули для клиента, сервера и расширений протокола.
  • Документация: docs.rs/sec-http3

5. h3

  • Описание: Библиотека для реализации HTTP/3 поверх предоставленного транспортного уровня QUIC.
  • Особенности: Позволяет фокусироваться на реализации HTTP/3, делегируя работу с транспортом внешним компонентам.
  • Документация: docs.rs/h3

Примеры использования

Ресурсы и сообщества