WebSocket — протокол за пълнодуплексна комуникация, осигуряващ постоянна връзка между клиент и сървър за обмен на данни в реално време. За разлика от традиционните HTTP заявки, този протокол установява една връзка и я използва за двупосочно предаване без повторни ръкостискания. Според данни на Mozilla Developer Network (2025), WebSocket намалява забавянията до 50% в сравнение с HTTP polling в приложения в реално време.
Основни точки
WebSocket — е комуникационен протокол, работещ през TCP и осигуряващ пълнодуплексен канал между клиент и сървър. Той е стандартизиран от IETF като RFC 6455 през 2011 г. и се поддържа от всички модерни браузъри, мобилни платформи и сървърни рамки.
За разлика от HTTP, където клиентът инициира заявка и получава отговор, WebSocket позволява на двете страни да изпращат съобщения по всяко време след установяване на връзката. Това го прави идеален за сценарии, изискващи незабавна доставка на данни: чатове, известия, съвместно редактиране на документи.
Протоколът WebSocket използва HTTP порт 80 или HTTPS порт 443 за начално ръкостискане, след което преминава към собствен протокол с минимална заглавка — само 2 байта вместо 800+ байта в HTTP. Това свойство дава значително предимство в производителността при голям брой съобщения.
WebSocket връзката започва с HTTP заявка за надграждане (Upgrade), след което протоколът преминава към двоичен формат на рамки. Размерът на рамката варира от 2 байта до 2^63 байта, което позволява предаване както на кратки текстови съобщения, така и на големи двоични данни. Поддържа се фрагментиране на съобщения, маскиране на данни от клиента към сървъра и ping/pong за поддържане на връзката.
Процесът на установяване на WebSocket връзка се състои от два етапа: ръкостискане и предаване на данни. На етапа на ръкостискане клиентът изпраща HTTP заявка със заглавка Upgrade: websocket, а сървърът потвърждава превключването на протокола със статус 101 Switching Protocols. След това връзката преминава в режим на пълнодуплексно предаване.
Всяко съобщение в WebSocket се разделя на рамки. Рамката съдържа opcode (текст, двоични данни, затваряне, ping/pong), дължина на полезния товар и ключ за маскиране на данни от клиента. Рамката може да бъде фрагментирана — контролните рамки (ping/pong) могат да се предават между фрагменти на съобщението, предотвратявайки прекъсване на връзката при дълго предаване.
const ws = new WebSocket('wss://example.com/chat')
ws.addEventListener('open', () => {
console.log('Връзката е установена')
ws.send('Здравей, сървър!')
})
ws.addEventListener('message', (event) => {
console.log('Получено:', event.data)
})
ws.addEventListener('close', () => {
console.log('Връзката е затворена')
})
В горния пример клиентът създава обект WebSocket, посочвайки защитен URL wss://. След отваряне на връзката се изпраща поздравително съобщение, а манипулаторът message приема отговори от сървъра. При затваряне се активира манипулаторът close — това е важно за повторно свързване при прекъсване на мрежата.
Основната разлика между WebSocket и HTTP е в модела на взаимодействие. HTTP работи по схемата заявка-отговор: клиентът инициира заявка, сървърът връща отговор, връзката се затваря. WebSocket обаче установява постоянен канал, през който и двете страни могат да инициират предаване по всяко време.
За приложения, изискващи ниско забавяне и постоянен поток от данни, WebSocket е значително по-ефективен. HTTP Long Polling — алтернатива, при която сървърът държи заявката отворена до появата на данни — създава допълнително натоварване на сървъра и увеличава консумацията на памет поради множество едновременни връзки.
| Параметър | WebSocket | HTTP |
|---|---|---|
| Модел | Пълнодуплексен | Заявка-отговор |
| Заглавка | 2–14 байта | 400–800 байта |
| Постоянна връзка | Да, една | Не, нова на заявка |
| Латентност | Ниска (1–5 ms) | Висока (50–200 ms) |
| Протокол | ws:// или wss:// | http:// или https:// |
Според High Performance Browser Networking (Grigorik, O’Reilly), WebSocket намалява мрежовите забавяния в сценарии в реално време с 40–60% в сравнение с HTTP Long Polling, а натоварването на сървъра намалява 3–5 пъти благодарение на елиминирането на повторни ръкостискания.
Благодарение на ниската латентност и двупосочната комуникация, WebSocket се използва в широк спектър от приложения. Ключовите сценарии включват незабавен обмен на съобщения, синхронизация на състояние в игри и предаване на пазарни данни във финансови системи.
WebSocket се превърна в де факто стандарт за чат приложения. Платформи като Slack, Telegram Web и WhatsApp Web използват WebSocket за незабавна доставка на съобщения. Протоколът позволява изпращане както на текстови съобщения, така и на файлове чрез единен канал, а механизмът ping/pong поддържа връзката активна дори при липса на активност.
Многоиграчните браузърни и мобилни игри изискват минимално забавяне за синхронизация на състоянието на играчите. WebSocket предава координати, действия и събития в реално време без забавянията на HTTP заявки. Рамки като Socket.IO и Colyseus абстрахират нисконивовата работа с протокола, добавяйки автоматично повторно свързване и стаи.
Борсовите терминали и търговските платформи използват WebSocket за получаване на котировки в реално време. Забавяне от няколко милисекунди може да струва милиони долари, поради което финансовите API — например Binance WebSocket Streams, Coinbase Pro — предоставят именно WebSocket интерфейси за пазарни данни.
В мобилното разработване WebSocket се използва чрез естествени API: URLSessionWebSocketTask на iOS и OkHttp WebSocket на Android. За Flutter съществува библиотеката web_socket_channel, а за React Native — react-native-websocket. IoT устройствата прилагат WebSocket за предаване на телеметрия и получаване на командни управления, тъй като протоколът консумира по-малко енергия от постоянния HTTP-polling.
Нека разгледаме пример за сървърна част в Node.js с библиотеката ws — най-популярната имплементация на WebSocket за JavaScript. Сървърът приема връзки, обработва съобщения и ги излъчва на всички свързани клиенти.
const WebSocket = require('ws')
const wss = new WebSocket.Server({ port: 8080 })
wss.on('connection', (ws) => {
console.log('Нов клиент е свързан')
ws.on('message', (data) => {
console.log('Получено:', data.toString())
ws.send('Сървърът получи вашето съобщение')
})
ws.on('close', () => {
console.log('Клиентът е изключен')
})
})
console.log('WebSocket сървърът е стартиран на порт 8080')
Сървърът създава инстанция на WebSocket.Server на порт 8080 и очаква връзки. На всеки нов клиент се присвоява отделен ws обект, чрез който сървърът може да изпраща индивидуални съобщения. Излъчването на съобщения до всички клиенти се осъществява чрез масово обхождане на масива от връзки. При голям брой клиенти (над 1000) се препоръчва използването на библиотеки с поддръжка на клъстериране като Socket.IO, които добавят мащабиране чрез Redis и автоматично повторно свързване.
wss.clients.forEach((client) => {
if (client.readyState === WebSocket.OPEN) {
client.send('Съобщение за всички участници')
}
})
Проверката на readyState преди изпращане е задължителна: ако клиентът вече се е изключил, извикването на send ще доведе до грешка. Флагът WebSocket.OPEN гарантира, че връзката е активна и съобщението ще бъде доставено.
За мобилни iOS приложения WebSocket се имплементира чрез URLSessionWebSocketTask, достъпен от iOS 13. Сесията създава задача с URL на протокола wss://, след което се извикват методите send и receive. Получаването на съобщения може да се организира чрез непрекъсната рекурсия на receive, която очаква следващото съобщение след обработка на предишното, осигурявайки непрекъснато приемане на данни без повторно свързване. За Android се използва OkHttp WebSocket, който предоставя подобен интерфейс с обратни извиквания onOpen, onMessage, onClosing и onClosed, както и автоматично повторно свързване при прекъсване на връзката.
При работа с WebSocket в мобилни приложения е важно да се вземе предвид управлението на жизнения цикъл: когато приложението премине във фонов режим, връзката може да бъде прекъсната от системата. На iOS е необходимо да се възстанови връзката при връщане на преден план чрез делегата sceneDidBecomeActive. На Android трябва да се използват Lifecycle-aware компоненти или Service за поддържане на връзката. Допълнително се препоръчва имплементиране на exponential backoff при повторно свързване — увеличаване на интервала между опитите от 1 до 30 секунди, за да не се създава прекомерно натоварване на сървъра при временни мрежови проблеми.
Често задавани въпроси
WebSocket установява постоянна пълнодуплексна връзка, по която двете страни могат да изпращат данни по всяко време. HTTP работи по схемата заявка-отговор, където всяка размяна изисква нова връзка и пълни заглавки. WebSocket използва един TCP канал и заглавки от само 2–14 байта, което драстично намалява забавянията.
WebSocket използва порт 80 за незащитени връзки (ws://) и порт 443 за защитени (wss://). Това позволява преминаване през повечето прокси сървъри и корпоративни защитни стени без допълнителна конфигурация. Порт 443 се препоръчва за продукционни среди поради TLS криптиране.
Да, WebSocket се поддържа на всички мобилни платформи. В iOS родният клас URLSessionWebSocketTask е достъпен от iOS 13. В Android — класът OkHttp WebSocket и стандартният java.net.WebSocket. За React Native съществува библиотеката react-native-websocket.
WebSocket Secure — защитена версия на протокола, работеща през TLS. Всички данни се криптират както в HTTPS. WSS е задължителен за продукционни приложения, особено при предаване на удостоверителни токени или лични данни чрез WebSocket.
Основните алтернативи: HTTP Long Polling (сървърът държи заявката отворена), Server-Sent Events (еднопосочен поток от сървъра) и WebRTC Data Channel (пирингова комуникация). Server-Sent Events са по-лесни за имплементиране, но не поддържат изпращане от клиент към сървър.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също