WebSocket Nedir?
Kısa tanım
WebSocket, istemci ile sunucu arasında tek bir TCP bağlantısı üzerinden sürekli açık kalan, çift yönlü iletişim sağlayan bir protokoldür. Bağlantı bir HTTP isteğiyle başlar, sunucu 101 Switching Protocols yanıtı verdikten sonra iki taraf da istediği an mesaj gönderebilir. 2011'de RFC 6455 ile standartlaşan protokol; sohbet, canlı bildirim, ortak düzenleme ve çok oyunculu oyunlar gibi düşük gecikmeli gerçek zamanlı uygulamalarda kullanılır.
Diğer adları: WebSocket protokolü, WS, WSS, web soketi

Sunucunun söz alamadığı model
Klasik HTTP istek ve yanıt modelinde konuşmayı her zaman istemci başlatır. Sunucuda yeni bir mesaj, yeni bir sipariş ya da değişen bir fiyat olduğunda bunu tarayıcıya kendiliğinden bildirmesinin yolu yoktur. Uzun yıllar bu sorun polling ile, yani birkaç saniyede bir “yeni bir şey var mı?” diye sorarak çözüldü. Bu yaklaşım hem gereksiz istek üretir hem de güncellemeyi ancak bir sonraki soruda fark eder. WebSocket, bağlantıyı açık tutup iki tarafa da istediği an konuşma imkânı vererek bu sınırı kaldırır.
El sıkışma: HTTP ile başlayıp protokol değiştirmek
Bağlantı sıradan görünen bir HTTP isteğiyle açılır. İstemci protokol yükseltmek istediğini başlıklarla bildirir:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Version: 13Sunucu kabul ederse 101 Switching Protocols döner ve Sec-WebSocket-Accept başlığında, istemcinin anahtarından türettiği değeri gönderir:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Bu andan sonra aynı TCP bağlantısı üzerinde artık HTTP değil, WebSocket çerçeveleri akar. Adresler ws:// ve TLS ile şifrelenmiş wss:// şemalarını kullanır; üretimde yalnızca wss:// tercih edilmelidir.
Çerçeveler ve tarayıcı tarafı
Mesajlar metin veya ikili veri taşıyan çerçeveler hâlinde gider. Ayrıca bağlantının canlı olduğunu doğrulayan ping/pong ve bağlantıyı düzgünce kapatan close kontrol çerçeveleri vardır. İstemciden sunucuya giden her çerçeve maskelenmek zorundadır; bu, araya giren önbellek sunucularının yanıltılmasını önlemek için konmuş bir kuraldır. Tarayıcıda kullanım oldukça sadedir:
const ws = new WebSocket("wss://example.com/canli");
ws.addEventListener("open", () => ws.send(JSON.stringify({ abone: "siparisler" })));
ws.addEventListener("message", (e) => console.log(JSON.parse(e.data)));
ws.addEventListener("close", () => { /* bekleyip yeniden bağlan */ });Polling, SSE ve WebSocket
| Yöntem | Yön | Uygun olduğu durum |
|---|---|---|
| Polling | İstemci sorar | Seyrek değişen veri, basit altyapı |
| Server-Sent Events | Sunucudan istemciye | Bildirim, ilerleme durumu, canlı akış |
| WebSocket | Çift yönlü | Sohbet, ortak düzenleme, oyun, sık iki yönlü mesajlaşma |
Yalnızca sunucudan veri akması gerekiyorsa SSE çoğu zaman daha basit bir çözümdür. WebSocket'in getirdiği ek karmaşıklık, iki yönlü ve sık mesajlaşma gerçekten gerektiğinde karşılığını verir.
Üretim ortamında dikkat edilecekler
- Proxy ayarları: Önde bir reverse proxy varsa
UpgradeveConnectionbaşlıklarını arka uca iletmesi gerekir. nginx'te buproxy_set_header Upgrade $http_upgrade;veproxy_set_header Connection "upgrade";satırlarıyla yapılır. nginx, arka uç 60 saniye boyunca veri göndermezse bağlantıyı varsayılan olarak kapatır; düzenli ping çerçeveleri veya daha uzun birproxy_read_timeoutgerekir. - Ölçekleme: Her bağlantı belirli bir sunucu örneğine bağlıdır. Birden fazla örnek varsa bir mesajın doğru kullanıcıya ulaşması için örnekler arasında Redis pub/sub gibi bir yayın katmanı kurulur; yük dengeleyicinin uzun ömürlü bağlantıları desteklemesi gerekir.
- Kimlik ve köken kontrolü: Tarayıcı el sıkışmada çerezleri gönderir. Sunucu
Originbaşlığını doğrulamazsa başka bir sitenin kullanıcı adına bağlantı açması mümkün olabilir. - Yeniden bağlanma: Mobil ağlarda bağlantı sık kopar. İstemci artan bekleme süreleriyle yeniden bağlanmalı, sunucu da kaçırılan mesajları telafi edecek bir yol sunmalıdır.

