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

Как работает протокол транспортного уровня?

1.0 Junior🔥 112 комментариев
#Сетевые протоколы и API

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

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

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

Как работает протокол транспортного уровня

Протокол транспортного уровня в компьютерных сетях — это ключевой компонент стека протоколов (например, TCP/IP), который обеспечивает сквозную (end-to-end) коммуникацию между приложениями, работающими на разных хостах. Его основная задача — абстрагировать приложения от сложностей сетевого уровня (например, маршрутизации, фрагментации пакетов), предоставляя надежные или быстрые каналы связи в зависимости от требований.

Основные функции транспортного уровня

  1. Мультиплексирование и демультиплексирование
    Позволяет нескольким приложениям на одном хосте одновременно использовать сетевые ресурсы. Транспортный уровень добавляет к данным номера портов, которые идентифицируют конкретное приложение. Например, веб-сервер «слушает» порт 80 для HTTP, а почтовый клиент использует порт 25 для SMTP. При получении пакета операционная система по номеру порта определяет, какому процессу его передать.

  2. Гарантия доставки и надежность
    Протоколы вроде TCP (Transmission Control Protocol) обеспечивают надежную доставку данных через механизмы подтверждения (ACK), повторной передачи (retransmission) и контрольных сумм. Если пакет теряется или приходит с ошибками, TCP организует его повторную отправку.

  3. Контроль потока (Flow Control)
    Регулирует скорость передачи данных, чтобы отправитель не «перегружал» получателя. В TCP для этого используется окно передачи (sliding window), которое динамически меняется в зависимости от возможностей приемника.

  4. Контроль перегрузки (Congestion Control)
    Предотвращает перегрузку сети, снижая скорость передачи при обнаружении признаков заторов (например, потерь пакетов). Алгоритмы вроде Slow Start и AIMD (Additive Increase Multiplicative Decrease) позволяют TCP адаптироваться к условиям сети.

  5. Установление и завершение соединения
    TCP использует трёхстороннее рукопожатие (three-way handshake) для установки соединения (SYN, SYN-ACK, ACK) и четырёхэтапный процесс для его корректного закрытия (FIN, ACK).

Примеры протоколов транспортного уровня

  • TCP (Transmission Control Protocol) — ориентированный на соединение, надежный, но с накладными расходами на установку соединения и гарантии доставки.
  • UDP (User Datagram Protocol) — дейтаграммный, без установки соединения, ненадежный, но быстрый и с минимальными задержками.
  • QUIC — современный протокол (на основе UDP), разработанный Google, который комбинирует преимущества TCP и UDP, добавляя шифрование и ускорение установки соединения.

Практический пример на Go: TCP-сервер и клиент

Ниже приведён упрощённый код TCP-сервера и клиента на Go, демонстрирующий базовое взаимодействие через транспортный уровень.

TCP-сервер (слушает порт 8080)

package main

import (
    "bufio"
    "fmt"
    "net"
    "strings"
)

func handleConnection(conn net.Conn) {
    defer conn.Close()
    reader := bufio.NewReader(conn)
    for {
        message, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("Ошибка чтения:", err)
            return
        }
        fmt.Print("Получено: ", message)
        response := strings.ToUpper(message)
        conn.Write([]byte(response + "\n"))
    }
}

func main() {
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        panic(err)
    }
    defer listener.Close()
    fmt.Println("Сервер запущен на порту 8080")
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Ошибка подключения:", err)
            continue
        }
        go handleConnection(conn)
    }
}

TCP-клиент (подключается к серверу)

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "localhost:8080")
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    go func() {
        reader := bufio.NewReader(conn)
        for {
            response, err := reader.ReadString('\n')
            if err != nil {
                fmt.Println("Сервер закрыл соединение")
                return
            }
            fmt.Print("Ответ сервера: ", response)
        }
    }()

    consoleReader := bufio.NewReader(os.Stdin)
    for {
        fmt.Print("Введите сообщение: ")
        text, _ := consoleReader.ReadString('\n')
        conn.Write([]byte(text))
    }
}

Отличие транспортного уровня от сетевого

Важно понимать разницу: сетевой уровень (например, IP) отвечает за маршрутизацию пакетов между сетями и использует логические адреса (IP-адреса). Транспортный уровень работает поверх него, добавляя адресацию на уровне портов и обеспечивая качество связи (надёжность, порядок доставки) именно для приложений.

Заключение

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

Как работает протокол транспортного уровня? | PrepBro