Ana içeriğe geç

Yan yana

HTTPvsWebSocket

HTTP ile WebSocket arasındaki fark nedir?

Güncellendi 2 dk okuma7 fark

Kısaca

HTTP istek-yanıt modelidir: istemci sorar, sunucu bir kez cevap verir. WebSocket ise tek bağlantıyı açık tutar; böylece iki taraf da her an mesaj gönderebilir.

HTTP

Hiper Metin Aktarım Protokolü

HTTP, tarayıcıların, uygulamaların ve sunucuların basit bir istek-yanıt döngüsüyle web sayfaları ve veri alışverişi yapmasını sağlayan protokoldür.

HTTP sayfasını oku

WebSocket

WebSocket, tarayıcı ile sunucu arasında tek bir bağlantıyı açık tutarak her iki tarafın istediği an birbirine anında mesaj göndermesini sağlayan protokoldür.

WebSocket sayfasını oku

HTTP ve WebSocket karşılaştırması

ÖzellikHTTPWebSocket
Modelİstek ve yanıt: istemci sorar, sunucu cevaplarHer an, iki yönde mesajlar
BağlantıKısa alışverişler; bağlantı sonraki istekler için yeniden kullanılabilirİstemci başına tek bir kalıcı bağlantı
Kim başlatabilirYalnızca istemciBağlandıktan sonra iki taraf da
Mesaj başına ek yükHer istekte başlıklarBirkaç baytlık bir çerçeve başlığı
URL şemasıhttp:// ve https://ws:// ve wss://
Önbellek ve araçlarÖnbellekler, proxy'ler ve CDN'ler onu anlarHTTP önbelleği yok; proxy'ler yükseltmeyi desteklemeli
En uygun olduğu yerSayfalar, REST API'leri, indirmeler, form gönderimleriSohbet, oyunlar, canlı panolar, iş birliği

Fark, açıklamalı

HTTP turlar hâlinde çalışır: istemci bir istek gönderir, sunucu tek bir yanıt döner ve o alışveriş biter. Web sayfalarının, REST API'lerinin ve dosya indirmelerinin arkasındaki protokoldür ve durumsuzdur (stateless); bu yüzden her istek, sunucunun ihtiyaç duyduğu cookie ya da token gibi bilgileri yanında taşır. WebSocket ise istemci ile sunucu arasında uzun ömürlü, iki yönlü bir kanal için ayrı bir protokoldür.

Bir WebSocket bağlantısı aslında HTTP olarak başlar. İstemci Upgrade: websocket başlığı taşıyan sıradan bir GET isteği gönderir, sunucu 101 Switching Protocols ile cevap verir ve o andan itibaren aynı TCP bağlantısı iki yönde küçük WebSocket çerçeveleri taşır. Taraflardan biri bağlantıyı kapatana kadar iki taraf da, yeni bir isteğin başlıkları olmadan, istediği an mesaj gönderebilir.

Fark, sunucunun bir haberi olduğunda önem kazanır. Yalnızca HTTP ile istemci polling ya da long polling yoluyla sürekli sormak zorundadır; bu da gecikme ve boşa giden istekler demektir. WebSocket ile sunucu her güncellemeyi gerçekleştiği anda iter; bu da sohbet, çok oyunculu oyunlar, ortak düzenleme ve canlı panolar için uygundur. Bedeli durumdur: sunucular çok sayıda açık bağlantı tutar, yük dengeleyiciler bunları canlı tutmalıdır, istemcilerin de yeniden bağlanma mantığına ihtiyacı vardır.

Sık yapılan bir yanlış, WebSocket'in HTTP'nin yerini aldığını düşünmektir. Çoğu uygulama ikisini birlikte kullanır: önbellekten ve basit araçlardan yararlanan sayfalar, statik dosyalar, girişler ve sıradan API çağrıları için HTTP; yalnızca gerçek zamanlı kısım için WebSocket. Güncellemeler yalnızca sunucudan istemciye akıyorsa düz HTTP üzerinden Server-Sent Events çoğu zaman daha basittir.

Hangisini kullanmalısınız?

HTTP şu durumlarda doğru seçim:

  • İstemci veriyi, sayfalarda ve çoğu API'de olduğu gibi ihtiyaç duyduğunda istiyor.
  • Önbelleğin, CDN'lerin ve standart araçların kutudan çıktığı gibi çalışmasını istiyorsunuz.
  • Güncellemeler seyrek; polling ya da Server-Sent Events yetiyor.

WebSocket şu durumlarda doğru seçim:

  • Sohbette ya da çok oyunculu oyunlarda olduğu gibi iki taraf da sık mesaj gönderiyor.
  • Güncellemeler gerçekleştikten hemen sonra ulaşmalı.
  • Çok sayıda bağlantıyı açık tutan sunucular ve yük dengeleyiciler işletebiliyorsunuz.

HTTP üzerinden polling ile bir WebSocket bağlantısı

HTTPjavascript
// HTTP: the client asks, here every 5 seconds, whether anything is new
let lastId = 0;
setInterval(async () => {
  const response = await fetch(`/api/rooms/42/messages?after=${lastId}`);
  const messages = await response.json();
  messages.forEach(showMessage);
  if (messages.length) lastId = messages.at(-1).id;
}, 5000);
WebSocketjavascript
// WebSocket: one open connection; the server pushes messages as they happen
const socket = new WebSocket("wss://chat.example.com/rooms/42");

socket.addEventListener("message", (event) => {
  showMessage(JSON.parse(event.data));
});

// The client can send on the same connection at any time
sendButton.addEventListener("click", () => {
  socket.send(JSON.stringify({ text: input.value }));
});

Sık sorulan sorular

WebSocket, HTTP'den daha mı hızlı?

Sık ve küçük mesajlarda evet; çünkü her mesaj, HTTP'nin her seferinde tekrarladığı istek kurulumunu ve başlıkları atlar. Tek bir istekte ya da büyük bir indirmede HTTP de aynı derecede hızlıdır ve önbelleğe alınması daha kolaydır.

WebSocket HTTP kullanır mı?

Yalnızca başlangıçta. Bağlantı, yükseltme isteyen bir HTTP isteğiyle açılır; sunucu kabul ettiğinde iki taraf aynı TCP bağlantısı üzerinden WebSocket protokolünü konuşur.

WebSocket mi kullanmalıyım, Server-Sent Events mi?

Bildirimler ya da akıtılan yapay zekâ yanıtları gibi yalnızca sunucunun güncelleme gönderdiği durumlarda Server-Sent Events kullanın; düz HTTP üzerinden çalışır ve kendiliğinden yeniden bağlanır. İstemci de sık mesaj gönderiyorsa WebSocket'i seçin.

Daha fazla

Ayarlar