На каком уровне сетевой модели работает WebSocket?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Уровни работы WebSocket
WebSocket — это протокол полнодуплексной коммуникации, который работает на прикладном уровне (Application Layer, уровень 7), но с использованием транспортного уровня (Transport Layer, уровень 4).
Модель OSI и WebSocket
Уровни, на которых работает WebSocket:
-
Уровень 4 — Транспортный (Transport Layer)
- WebSocket использует TCP как базовый протокол
- Обеспечивает надёжную доставку данных
- Установление и разрыв соединения через трёхфазный handshake (SYN, SYN-ACK, ACK)
-
Уровень 5 — Сеансовый (Session Layer)
- WebSocket поддерживает длительное соединение (persistent connection)
- Управляет жизненным циклом сессии между клиентом и сервером
-
Уровень 6 — Представительский (Presentation Layer)
- Нет явного использования, но данные могут быть сжаты (compression)
- Текстовые и бинарные фреймы обрабатываются на этом уровне
-
Уровень 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())
Процесс установки соединения
-
HTTP Upgrade запрос (уровень 7)
- GET /chat HTTP/1.1
- Host: server.example.com
- Connection: Upgrade
- Upgrade: websocket
- Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
- Sec-WebSocket-Version: 13
-
Server ответ (уровень 7)
- HTTP/1.1 101 Switching Protocols
- Upgrade: websocket
- Connection: Upgrade
- Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
-
TCP соединение остаётся открытым (уровень 4)
- Оба направления отправляют фреймы одновременно (полнодуплекс)
Различие с HTTP и других протоколов
| Протокол | Уровень | Характеристика |
|---|---|---|
| HTTP | 7 | Request-response, однонаправленный (клиент инициирует) |
| WebSocket | 4-7 | Полнодуплекс, сервер может отправить данные первым |
| TCP | 4 | Надёжная доставка (как основа для WebSocket) |
| UDP | 4 | Ненадёжная доставка (не используется в 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 соединение на прикладной уровень, обеспечивая полнодуплексную коммуникацию в реальном времени.