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

На каком уровне сетевой модели работает WebSocket?

2.0 Middle🔥 101 комментариев
#REST API и HTTP#Асинхронность и многопоточность

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

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

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

Уровни работы WebSocket

WebSocket — это протокол полнодуплексной коммуникации, который работает на прикладном уровне (Application Layer, уровень 7), но с использованием транспортного уровня (Transport Layer, уровень 4).

Модель OSI и WebSocket

Уровни, на которых работает WebSocket:

  1. Уровень 4 — Транспортный (Transport Layer)

    • WebSocket использует TCP как базовый протокол
    • Обеспечивает надёжную доставку данных
    • Установление и разрыв соединения через трёхфазный handshake (SYN, SYN-ACK, ACK)
  2. Уровень 5 — Сеансовый (Session Layer)

    • WebSocket поддерживает длительное соединение (persistent connection)
    • Управляет жизненным циклом сессии между клиентом и сервером
  3. Уровень 6 — Представительский (Presentation Layer)

    • Нет явного использования, но данные могут быть сжаты (compression)
    • Текстовые и бинарные фреймы обрабатываются на этом уровне
  4. Уровень 7 — Прикладной (Application Layer)

    • WebSocket работает здесь как высокоуровневый протокол
    • Основан на HTTP (начинает с HTTP upgrade handshake)
    • Предоставляет API для приложений

Как работает WebSocket подключение

# Python WebSocket сервер (библиотека websockets)
import asyncio
import websockets

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(f"Echo: {message}")

# Начинает на port 8765
async def main():
    async with websockets.serve(echo, "localhost", 8765):
        await asyncio.Future()  # run forever

asyncio.run(main())
# Python WebSocket клиент
import asyncio
import websockets

async def hello():
    uri = "ws://localhost:8765"
    async with websockets.connect(uri) as websocket:
        await websocket.send("Hello Server!")
        response = await websocket.recv()
        print(response)

asyncio.run(hello())

Процесс установки соединения

  1. HTTP Upgrade запрос (уровень 7)

    • GET /chat HTTP/1.1
    • Host: server.example.com
    • Connection: Upgrade
    • Upgrade: websocket
    • Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    • Sec-WebSocket-Version: 13
  2. Server ответ (уровень 7)

    • HTTP/1.1 101 Switching Protocols
    • Upgrade: websocket
    • Connection: Upgrade
    • Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  3. TCP соединение остаётся открытым (уровень 4)

    • Оба направления отправляют фреймы одновременно (полнодуплекс)

Различие с HTTP и других протоколов

ПротоколУровеньХарактеристика
HTTP7Request-response, однонаправленный (клиент инициирует)
WebSocket4-7Полнодуплекс, сервер может отправить данные первым
TCP4Надёжная доставка (как основа для WebSocket)
UDP4Ненадёжная доставка (не используется в WebSocket)

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

# Асинхронный чат с WebSocket (FastAPI + Starlette)
from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws/{client_id}")
async def websocket_endpoint(websocket: WebSocket, client_id: int):
    await websocket.accept()  # Принимаем соединение (уровень 7)
    try:
        while True:
            # Получаем данные в реальном времени
            data = await websocket.receive_text()
            # Отправляем ответ (уровень 7 работает поверх TCP)
            await websocket.send_text(f"Client {client_id}: {data}")
    except Exception as e:
        print(f"Error: {e}")
    finally:
        await websocket.close()  # Закрываем TCP соединение

Вывод

WebSocket — это протокол уровня 7 (Application Layer), который работает поверх TCP (уровень 4 — Transport Layer). Его особенность в том, что он поднимает TCP соединение на прикладной уровень, обеспечивая полнодуплексную коммуникацию в реальном времени.

На каком уровне сетевой модели работает WebSocket? | PrepBro