WebSocket

Vikipedi, özgür ansiklopedi
Şuraya atla: kullan, ara

WebSocket, tek bir TCP bağlantısı üzerinden tam çift yönlü iletişim kanalı sağlayan bir bilgisayar iletişim protokolüdür. WebSocket protokolü IETF tarafından 2011 yılında RFC 6355 ile standart hale getirilmiş ve WebIDL içerisindeki WebSocket API W3C tarafından standart hale getirilmektedir.

WebSocket, web tarayıcılarında ve web sunucularında uygulanmak üzere tasarlanmıştır, fakat herhangi bir istemci veya sunucu uygulaması tarafından uygulanabilmektedir. WebSocket protokolü, TCP tabanlı bağımsız bir protokoldür. HTTP ile tek ilişkisi, HTTP sunucuları tarafından bir Upgrade isteği olarak yorumlanmasıdır.[1] WebSocket protokolü, sunucuya ve sunucudan gerçek zamanlı veri aktarımını sağlayarak, tarayıcı ile web sunucusu arasında etkileşimi sağlamaktadır. Bu, sunucunun istemci istemeden tarayıcıya içerik gönderebileceği ve bağlantıyı açık tutarak istediği zaman mesaj alabilmesini veya gönderebilmesini sağlayan standart bir yöntem ile sağlanmaktadır. Bu şekilde, tarayıcı ile sunucu arasında iki yönlü devam eden bir iletişim gerçekleşebilmektedir. İletişim TCP 80 portu (veya TLS ile şifrelenmiş bağlantılarda 443 portu) üzerinden gerçekleşmektedir ve bu, güvenlik duvarı kullanarak Internet web trafiğini engelleyen ortamlar için bir avantaj olmaktadır. Benzer iki yönlü sunucu-tarayıcı iletişimi Comet gibi standart olmayan stopgap teknolojileri tarafından sağlanmaktaydı.

WebSocket protokolü, Google Chrome, Microsoft Edge, Internet Explorer, Firefox, Safari ve Opera dahil pek çok tarayıcı tarafından desteklenmektedir. WebSocket ayrıca sunucu üzerindeki web uygulamalarının da desteğini gerektirmektedir.

Genel bakış[değiştir | kaynağı değiştir]

HTTP’den farklı olarak, WebSocket protokolü tam çift yönlü iletişim sağlamaktadır.[2][3] İlave olarak, WebSocket TCP protokolünün üzerinde mesaj akışına imkan tanımaktadır. TCP tek başına, mesaj kavramı kullanmadan byte akışı ile ilgilenmektedir. WebSocket protokolünden önce, 80 protokolü üzerinden tam çift yönlü iletişim Comet kanalları üzerinden yapılabilmekteydi; fakat, Comet uygulaması çok yaygın değildir ve TCP el sıkışması ve HTTP başlıkları yüzünden küçük mesajlar için verimsiz olmaktadır. WebSocket protokolü, webin güvenlik ilkelerini etkilemeksizin bu problemleri çözmeyi amaçlamaktadır.

WebSocket protokolü tanımı, şifreli ve şifresiz trafik için kullanılan iki yeni uniform resource identifier (URI) [4] formatı olan  ws ve wss ifadelerini tanımlamaktadır. Şema adı ve fragment dışında (# desteklenmemektedir), diğer URI bileşenleri için genel URI biçimini kullanacak şekilde tanımlanmıştır.[5]

Tarayıcının Geliştirici Araçlarını kullanarak, geliştiriciler WebSocket paketleri ile WebSocket el sıkışmasını inceleyebilmektedir.[6]

Tarih[değiştir | kaynağı değiştir]

WebSocket, HTML5 tanımında ilk olarak, TCP tabanlı soket API’si yerine TCPConnection olarak anılmıştır.[7] Haziran 2008’de, Michael Carter tarafından, WebSocket olarak bilinen protokolün ilk versiyonu olan bir takım çalışma gerçekleştirilmiştir.[8]

Bunun üzerine kısa bir süre sonra Ian Hickson ve Michael Carter tarafından #whatwg IRC chat odasındaki[9] işbirliği ile WebSocket ismi verilmiştir ve sonrasında Ian Hickson tarafından HTML5 tanımında yer alacak şekilde yazılmıştır ve Michael Carter tarafından bir blog üzerinde duyurulmuştur.[10] Aralık 2009’da, varsayılan olarak WebSocket protokolü standartlarını tamamen uygulayan ilk tarayıcı Google Chrome 4 olmuştur.[11] Sonrasında, Şubat 2010’da WebSocket protokolünün geliştirilmesi, W3C ve whatwg IRC grubundan IET’ye geçmiştir ve Ian Hickson gözetiminde iki değişime uğramıştır.[12]

Protokol tamamlandıktan ve birden çok tarayıcı tarafından varsayılan olarak desteklendikten sonra, Aralık 2011’de Ian Fette gözetiminde RFC tamamlanmıştır.[13]

Browser implementation[değiştir | kaynağı değiştir]

WebSocket protokolünün güvenli bir versiyonu, Firefox 6,[14] Safari 6, Google Chrome 14,[15] Opera 12.10 ve Internet Explorer 10 tarafından uygulanmaktadır.[16] Detaylı bir protokol test raporu[17] bu tarayıcıların spesifik protokol özelliklerine uyumluluğunu listelemektedir.

Protokolün daha eski ve daha az güvenli bir versiyonu, Opera 11, Safari 5 ve iOS 4.2'de bulunan Safari mobil versiyonunda uygulanmıştır.[18] iOS7'deki BlackBerry tarayıcısı WebSocket protokolünü uygulamaktadır.[19] Açıklıklar yüzünden, Firefox 4 ve 5[20] ile Opera 11[21] üzerinde devre dışı bırakılmıştır.

Ayrıca, SPDY üzerinde WebSocket protokolünün deneysel bir uygulamasına imkan tanıyan Google Chrome için --enable-websocket-over-spdy komut satırı anahtarı bulunmaktadır.[22]

Desteklenme Durumu
Protokol Taslak Tarihi
Internet Explorer Firefox[23] (PC) Firefox (Android) Chrome (PC, Mobile) Safari (Mac, iOS) Opera (PC, Mobile) Android Browser
hixie-75 4 Şubat 2010 4 5.0.0
hixie-76

hybi-00

6 Mayıs 2010

23 Mayıs 2010

4.0 (devre dışı bırakıldı) 6 5.0.1 11.00 (disabled)
7 hybi-07 22 Nisan 2011 6[24][a]
8 hybi-10 11 Temmuz 2011 7[26][a] 7 14[27]
13 Şablon:IETF RFC Aralık 2011 10[28] 11 11 16[29] 6 12.10[30] 4.4

Protokol El Sıkışması[değiştir | kaynağı değiştir]

Bir WebSocket bağlantısı kurmak için istemci, aşağıdaki örnekte gösterildiği gibi sucununun WebSocket el sıkışma cevabı gönderdiği bir WebSocket el sıkışma isteği göndermektedir.[31]

İstemci isteği (HTTP’de olduğu gibi, her bir satır  \r\n ile bitmektedir ve sonda ilave bir boş satır bulunmak zorundadır):

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

Sunucunun cevabı:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

El sıkışma, sunucuların aynı port üzerinden hem HTTP bağlantılarını hem de WebSocket bağlantılarını işleyebilmesi açısından HTTP’ye benzemektedir. Bağlantı kurulduğunda, iletişim, HTTP protokolüne uymayan iki taraflı bir ikili protokole dönüşmektedir.

Upgrade başlığına ek olarak, istemci base64 ile kodlanmış rastgele bytelardan oluşan bir Sec-WebSocket-Key başlığını da göndermektedir. Sunucu ise Sec-WebSocket-Accept başlığı ile anahtar değerinin özeti ile cevap vermektedir. Bu yöntem, önceki bir WebSocket trafiğinin tekrar oynatılmasını engellemeye çalışmaktadır[32] ve herhangi bir kimlik doğrulama, gizlilik veya bütünlük kontrolü sağlamamaktadır. Özet fonksiyonu 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 sabit değerini Sec-WebSocket-Key başlığındaki (base64 kodlaması çözülmemiş) değere eklemekte, SHA-1 özet fonksiyonunu uygulamakta ve sonucu base64 kullanarak kodlamaktadır.[33]

Bağlantı kurulduktan sonra, istemci ve sunucu WebSocket verisini tam çift yönlü modda gönderebilmektedir. Veri, payload tarafından takip edilen küçük bir başlık ile minimal bir şekilde çerçevelenmektedir. WebSocket iletişimi, tek bir mesajın birkaç veri çerçevesi içerisine dağılabileceği mesajlarla tanımlanmaktadır. Bu, verinin ilk kısmının bilindiği fakat mesajın toplam büyüklüğünün bilinmediği durumlarda, mesajların gönderilebilmesine izin vermektedir (FIN biti ile işaretlenip sona erişilene kadar veri çerçevelerini arka arkaya göndermektedir). Protokol üzerinde yapılan eklentilerle, farklı veri akışlarının eş zamanlı olarak çoklanması için de kullanılabilmektedir (örneğin bir soketin kullanımını tek bir büyük payload için tekelleştirilmesini önlemek için).

(Güvenlik açısından) Sunucu tarafında bağlantı kurulurken Origin başlığının doğrulanması, Siteler Arası WebSocket Çalma (Cross-Site WebSocket Hijacking) saldırılarına karşı koruma açısından önem taşımaktadır. Bu saldırı bağlantı çerezler veya HTTP kimlik doğrulaması ile doğrulandığında mümkün olabilmektedir. WebSocket üzerinden hassas veriler iletilirken, WebSocket bağlantısını doğrulamak için token veya benzer koruma mekanizmalarının kullanılması faydalı olacaktır.[34]

Proxy geçişi[değiştir | kaynağı değiştir]

WebSocket protokolü istemci uygulamaları, web tarayıcısının hedef makine ve porta bağlanırken bir vekil sunucu kullanıp kullanmadığını tespit etmeye çalışmaktadır ve eğer kullanıyorsa, kalıcı bir tünel oluşturmak için HTTP CONNECT metodunu kullanmaktadır.

WebSocket protokolünün kendisi vekil sunucuların ve güvenlik duvarlarının farkında olmasa da, HTTP’ye uygun bir el sıkışmayı desteklemektedir ve böylece HTTP sunucularının varsayılan HTTP ve HTTPS portlarını (80 ve 443) bir WebSocket ağ geçidiyle veya sunucusuyla paylaşmasına izin vermektedir. WebSocket protokolü, WebSocket ve Güvenli WebSocket bağlantılarını belirtmek için ws:// ve wss:// öneklerini tanımlamaktadır. Her iki yöntemde, bağlantıyı WebSocket’a yükseltmek için bir HTTP yükseltme mekanizması kullanmaktadır. Bazı vekil sunucular şeffaftır ve WebSocket ile çalışabilmektedir; diğerleri ise WebSocket protokolünün çalışmasını engelleyecektir ve bağlantının sonlanmasına yol açacaktır. Bazı durumlarda, ilave vekil sunucu yapılandırması gerekebilmektedir ve bazı vekil sunucuların WebSocket protokolünü desteklemesi için yükseltilmesi gerekebilmektedir.

Eğer şifrelenmemiş WebSocket trafiği, WebSocket desteği olmayan bir şeffaf vekil sunucu üzerinden akıyorsa, bağlantı muhtemelen başarısız olacaktır.[35]

Eğer şifreli WebSocket bağlantısı kullanılıyorsa, Güvenli WebSocket bağlantısında Transport Layer Security (TLS) kullanılması, tarayıcı bir vekil sunucu kullanacak şekilde yapılandırıldığında, HTTP CONNECT komutunun çalıştırılmasını sağlamaktadır. Bu, Güvenli WebSocket istemcisi ile WebSocket sunucusu arasında HTTP vekil sunucusu aracılığıyla düşük seviye birebir TCP iletişimini sağlayan bir tünel kurmaktadır. Şeffaf vekil sunucularda, tarayıcı vekil sunucunun varlığından habersizdir ve hiçbir HTTP CONNECT paketi yollanmamaktadır. Ancak, kablodaki trafik şifreli olduğu için, aradaki şeffaf vekil sunucular şifreli trafiğin geçmesine izin verebilmektedir. Bu yüzden, Güvenli WebSocket kullanıldığında, WebSocket bağlantısının başarılı olma ihtimali artmaktadır. Şifrelemenin olması kaynak kullanımı açısından bir miktar yük oluşturacaktır, fakat güvenli bir tünel üzerinden geçebileceği için daha yüksek bir başarı oranı sağlamaktadır.

2010 ortalarında verilen bir taslak (hixie-76 versiyonu)ters vekil sunucularla ve ağ geçitleriyle uyumluluğu, başlıklardan sonra 8 byte’dan oluşan bir anahtar eklediği ve bu anahtarı   Content-Length: 8 başlığında belirtmediği için bozmuştur.[36] Bu veri tüm aradaki cihazlar tarafından iletilmeyeceği için protokol başarısızlığına yol açabilmektedir. Bu yüzden, daha yeni taslaklar (örneğin hybi-09[37]) bu problemi çözerek anahtar veriyiSec-WebSocket-Key başlığına koymaktadır.

Ayrıca Bkz.[değiştir | kaynağı değiştir]

Notlar[değiştir | kaynağı değiştir]

  1. ^ a b Gecko-based browsers versions 6–10 implement the WebSocket object as "MozWebSocket",[25] requiring extra code to integrate with existing WebSocket-enabled code.

Kaynakça[değiştir | kaynağı değiştir]

  1. ^ Şablon:Cite IETF
  2. ^ "Glossary:WebSockets". Mozilla Developer Network. 2015. 14 Eylül 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160914003950/https://developer.mozilla.org/en-US/docs/Glossary/WebSockets. 
  3. ^ HTML5 WebSocket: A Quantum Leap in Scalability for the Web
  4. ^ Graham Klyne, haz. (2011-11-14). "IANA Uniform Resource Identifer (URI) Schemes". Internet Assigned Numbers Authority. 25 Nisan 2013 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20130425164755/http://www.iana.org/assignments/uri-schemes.html. Erişim tarihi: 2011-12-10. 
  5. ^ Şablon:Cite IETF
  6. ^ Wang, Vanessa; Salim, Frank; Moskovits, Peter (February 2013). "APPENDIX A: WebSocket Frame Inspection with Google Chrome Developer Tools". The Definitive Guide to HTML5 WebSocket. Apress. ISBN 978-1-4302-4740-1. http://my.safaribooksonline.com/book/-/9781430247401/appendix-a-inspecting-websocket-traffic/sec1_xhtml. Erişim tarihi: 7 April 2013. 
  7. ^ "HTML 5". 16 Eylül 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160916071246/http://www.w3.org/TR/2008/WD-html5-20080610/comms.html. Erişim tarihi: 2016-04-17. 
  8. ^ "[whatwg TCPConnection feedback from Michael Carter on 2008-06-18 (whatwg.org from June 2008)"]. 27 Nisan 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160427004936/https://lists.w3.org/Archives/Public/public-whatwg-archive/2008Jun/0165.html. Erişim tarihi: 2016-04-17. 
  9. ^ "IRC logs: freenode / #whatwg / 20080618". 21 Ağustos 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160821040755/http://krijnhoetmer.nl/irc-logs/whatwg/20080618. Erişim tarihi: 2016-04-18. 
  10. ^ "Comet Daily » Blog Archive » Independence Day: HTML5 WebSocket Liberates Comet From Hacks". 23 Nisan 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160423091932/http://cometdaily.com:80/2008/07/04/html5-websocket/. Erişim tarihi: 2016-04-17. 
  11. ^ "Web Sockets Now Available In Google Chrome" (en-US). 31 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170331172817/https://blog.chromium.org/2009/12/web-sockets-now-available-in-google.html. Erişim tarihi: 2016-04-17. 
  12. ^ <ian@hixie.ch>, Ian Hickson. "The WebSocket protocol". 17 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170317201023/https://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-75. Erişim tarihi: 2016-04-17. 
  13. ^ <ian@hixie.ch>, Ian Hickson. "The WebSocket protocol". 6 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170306081618/https://tools.ietf.org/html/rfc6455. Erişim tarihi: 2016-04-17. 
  14. ^ Dirkjan Ochtman (May 27, 2011). "WebSocket enabled in Firefox 6". Mozilla.org. 26 Mayıs 2012 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20120526230019/https://developer.mozilla.org/en/WebSockets. Erişim tarihi: 2011-06-30. 
  15. ^ "Chromium Web Platform Status". 4 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170304203008/http://www.chromium.org/developers/web-platform-status. Erişim tarihi: 2011-08-03. 
  16. ^ "WebSockets (Windows)". Microsoft. 2012-09-28. 25 Mart 2015 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20150325091443/https://msdn.microsoft.com/en-us/library/ie/hh673567(v=vs.85).aspx. Erişim tarihi: 2012-11-07. 
  17. ^ "WebSockets Protocol Test Report". Tavendo.de. 2011-10-27. 22 Eylül 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160922040928/http://autobahn.ws:80/testsuite/reports/clients/index.html. Erişim tarihi: 2011-12-10. 
  18. ^ Katie Marsal (November 23, 2010). "Apple adds accelerometer, WebSockets support to Safari in iOS 4.2". AppleInsider.com. 8 Kasım 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20161108211654/http://appleinsider.com/articles/10/11/23/apple_adds_accelerometer_websockets_support_to_safari_in_ios_4_2.html. Erişim tarihi: 2011-05-09. 
  19. ^ "Web Sockets API". BlackBerry. June 10, 2011 tarihinde kaynağından arşivlendi. https://web.archive.org/web/20110610191150/http://docs.blackberry.com/en/developers/deliverables/29271/Web_Sockets_support_1582781_11.jsp. Erişim tarihi: 8 July 2011. 
  20. ^ Chris Heilmann (December 8, 2010). "WebSocket disabled in Firefox 4". Hacks.Mozilla.org. 6 Mart 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170306114251/https://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/. Erişim tarihi: 2011-05-09. 
  21. ^ Aleksander Aas (December 10, 2010). "Regarding WebSocket". My Opera Blog. 2010-12-15 tarihinde kaynağından arşivlendi. https://web.archive.org/web/20101215010748/http://my.opera.com/chooseopera/blog/2010/12/10/regarding-websocket. Erişim tarihi: 2011-05-09. 
  22. ^ Peter Beverloo. "List of Chromium Command Line Switches". 8 Nisan 2017 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20170408072921/http://peter.sh/experiments/chromium-command-line-switches/. Erişim tarihi: 2011-12-10. 
  23. ^ "WebSockets (support in Firefox)". Mozilla Foundation. 2011-09-30. 26 Mayıs 2012 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20120526230019/https://developer.mozilla.org/en/WebSockets. Erişim tarihi: 2011-12-10. 
  24. ^ "Bug 640003 - WebSockets - upgrade to ietf-06". Mozilla Foundation. 2011-03-08. https://bugzilla.mozilla.org/show_bug.cgi?id=640003. Erişim tarihi: 2011-12-10. 
  25. ^ "WebSockets - MDN". Mozilla Foundation. 2011-09-30. 26 Mayıs 2012 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20120526230019/https://developer.mozilla.org/en/WebSockets. Erişim tarihi: 2011-12-10. 
  26. ^ "Bug 640003 - WebSockets - upgrade to ietf-07(comment 91)". Mozilla Foundation. 2011-07-22. https://bugzilla.mozilla.org/show_bug.cgi?id=640003#c91. 
  27. ^ "Chromium bug 64470". Google. 2010-11-25. 31 Aralık 2015 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20151231184436/https://code.google.com/p/chromium/issues/detail?id=64470. Erişim tarihi: 2011-12-10. 
  28. ^ "WebSockets in Windows Consumer Preview". IE Engineering Team. Microsoft. 2012-03-19. 6 Eylül 2015 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20150906135037/http://blogs.msdn.com/b/ie/archive/2012/03/19/websockets-in-windows-consumer-preview.aspx. Erişim tarihi: 2012-07-23. 
  29. ^ "WebKit Changeset 97247: WebSocket: Update WebSocket protocol to hybi-17". https://trac.webkit.org/changeset/97249. Erişim tarihi: 2011-12-10. 
  30. ^ "A hot Opera 12.50 summer-time snapshot". Opera Developer News. 2012-08-03. 2012-08-05 tarihinde kaynağından arşivlendi. https://web.archive.org/web/20120805234006/http://my.opera.com/ODIN/blog/2012/08/03/a-hot-opera-12-50-summer-time-snapshot. Erişim tarihi: 2012-08-03. 
  31. ^ Şablon:Cite IETF
  32. ^ "Main Goal of WebSocket protocol". IETF. 22 Nisan 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160422042232/https://trac.tools.ietf.org/wg/hybi/trac/wiki/FAQ. Erişim tarihi: 25 July 2015. "The computation [...] is meant to prevent a caching intermediary from providing a WS-client with an cached WS-server reply without actual interaction with the WS-server." 
  33. ^ Şablon:Cite IETF
  34. ^ Christian Schneider (August 31, 2013). "Cross-Site WebSocket Hijacking (CSWSH)". Web Application Security Blog. 31 Aralık 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20161231061757/http://www.christian-schneider.net/CrossSiteWebSocketHijacking.html. 
  35. ^ Peter Lubbers (March 16, 2010). "How Web Sockets Interact With Proxy Servers". C4Media Inc.. 8 Mayıs 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160508202722/http://www.infoq.com:80/articles/Web-Sockets-Proxy-Servers. Erişim tarihi: 2011-12-10. 
  36. ^ Willy Tarreau (2010-07-06). "WebSocket -76 is incompatible with HTTP reverse proxies" (email). Internet Engineering Task Force. 17 Eylül 2016 tarihinde kaynağından arşivlendi. http://web.archive.org/web/20160917063052/http://www.ietf.org:80/mail-archive/web/hybi/current/msg02149.html. Erişim tarihi: 2011-12-10. 
  37. ^ Ian Fette (June 13, 2011).

Dış bağlantılar[değiştir | kaynağı değiştir]