İletişim

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

HTTP yükseltme ve 101 yanıtıyla açılan WebSocket bağlantısında istemci ile sunucunun iki yönlü mesaj gönderdiği akış

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: 13

Sunucu 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öntemYönUygun olduğu durum
Pollingİstemci sorarSeyrek değişen veri, basit altyapı
Server-Sent EventsSunucudan istemciyeBildirim, 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 Upgrade ve Connection başlıklarını arka uca iletmesi gerekir. nginx'te bu proxy_set_header Upgrade $http_upgrade; ve proxy_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 bir proxy_read_timeout gerekir.
  • Ö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 Origin baş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.

İlgili terimler

← Sözlüğe dön