# Что такое WebSocket и как проверить обрыв соединения?

### 🔹 Что такое **WebSocket**

**WebSocket** — это сетевой протокол поверх TCP, позволяющий устанавливать **постоянное двустороннее соединение** между клиентом и сервером.\
В отличие от HTTP (где клиент всегда инициирует запрос), WebSocket обеспечивает **реальное время**: сервер может сам отправлять данные клиенту без дополнительных запросов.

📌 Используется в:

* чаты, мессенджеры
* онлайн-игры
* торговые платформы (биржи)
* системы мониторинга

***

### Особенности

1. **Постоянное соединение**
   * В отличие от HTTP, где клиент должен каждый раз отправлять запрос, WebSocket создаёт соединение один раз и поддерживает его открытым.
2. **Двусторонняя передача данных**
   * Клиент и сервер могут отправлять сообщения друг другу **в реальном времени**, без дополнительных запросов.
3. **Меньше накладных расходов**
   * После установки соединения данные передаются без постоянных HTTP-заголовков → быстрее и эффективнее.
4. **Протоколы**
   * `ws://` — обычное соединение (без шифрования).
   * `wss://` — защищённое соединение (аналог HTTPS, поверх TLS/SSL).

***

### Жизненный цикл WebSocket

1. Клиент инициирует соединение через HTTP-запрос с заголовком `Upgrade: websocket`.
2. Сервер отвечает подтверждением (handshake).
3. После апгрейда соединение становится постоянным, обмен идёт по WebSocket-протоколу.
4. Клиент и сервер могут в любой момент отправлять сообщения.
5. Закрытие соединения (по инициативе клиента, сервера или при обрыве сети).

***

### Для QA важно проверять

* Установление и завершение соединения (handshake, закрытие).
* Обработку обрыва соединения и повторных подключений.
* Корректность передачи бинарных и текстовых сообщений.
* Работа с шифрованием (WSS).
* Нагрузку (много одновременных подключений).

***

### 🔹 Как проверить обрыв соединения

#### 1. **События WebSocket API (на клиенте):**

В JavaScript у объекта `WebSocket` есть события:

* `onopen` – соединение установлено
* `onmessage` – получены данные
* `onerror` – ошибка соединения
* `onclose` – соединение закрыто

Пример:

```javascript
const ws = new WebSocket("wss://example.com/socket");

ws.onopen = () => console.log("Соединение открыто");
ws.onmessage = (event) => console.log("Сообщение:", event.data);
ws.onerror = (err) => console.error("Ошибка:", err);
ws.onclose = () => console.warn("Соединение закрыто");
```

***

#### 2. **Ping/Pong (KeepAlive)**

Многие серверы и клиенты реализуют **ping/pong-механизм** для проверки активности:

* Клиент периодически отправляет `ping`
* Сервер отвечает `pong`
* Если ответа нет в течение N секунд → считаем соединение оборванным

***

#### 3. **Таймаут ожидания**

Можно завести таймер:

* Если за определённое время не пришло ни одного сообщения/ответа от сервера → разрываем соединение вручную и пробуем переподключиться.

***

#### 4. **TCP KeepAlive (на уровне сети)**

На более низком уровне можно включить keep-alive в TCP-соединении, но чаще в вебе это решают приложением (через ping/pong).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/web/chto-takoe-websocket-i-kak-proverit-obryv-soedineniya.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
