Ağ soketi
WebSocket , kalıcı bir bağlantı kullanarak bir tarayıcı ve bir web sunucusu arasında mesaj alışverişi yapmak için tasarlanmış bir TCP bağlantısı üzerinden bir iletişim protokolüdür .
W3C şu anda Web Yuvaları API'sini standartlaştırmaktadır. Bu protokol için taslak standart IETF tarafından onaylanmıştır .
WebSocket, web tarayıcılarında ve web sunucularında uygulanmak üzere tasarlanmıştır, ancak herhangi bir istemci veya sunucu uygulaması için kullanılabilir. WebSocket protokolü, TCP protokolüne dayalı bağımsız bir protokoldür. Etkileşimli içeriğin dağıtımını ve gerçek zamanlı uygulamaların oluşturulmasını kolaylaştırarak tarayıcı ve web sitesi arasında daha yakın etkileşim sağlar.
Bir WebSocket kanalı açma
İstemci ve sunucu, WebSocket bağlantısı kurmak için HTTP'ye benzer bir protokol kullanır . İstemci, sunucunun belirli bir şekilde yanıt verdiği özel bir HTTP isteği oluşturur.
Protokol 75
Wayback Machine dahil olmak üzere 8 Haziran 2010 tarihli 75 numaralı taslak protokol Arşiv kopyasının revize edilmesinden önce, WebSocket bağlantısı aşağıdaki şekilde kurulmuştur. Müşteri isteği:
GET /demo HTTP/1.1
Yükseltme: WebSocket
Bağlantı: Yükseltme
ev sahibi: örnek.com
Kaynak: http://example.com
WebSocket Protokolü: örnek
WebSocket'e geçişi onaylayan sunucu yanıtı:
HTTP/1.1 101 Web Soketi Protokol Anlaşması
Yükseltme: WebSocket
Bağlantı: Yükseltme
WebSocket-Origin: http://example.com
WebSocket Konumu: ws://example.com/demo
WebSocket Protokolü: örnek
Yanıtı gönderdikten hemen sonra WebSocket bağlantısı kurulmuş sayılır, istemci ve sunucu aynı TCP bağlantısı üzerinden çift yönlü mesajlaşmaya başlayabilir. Metin mesajı göndermek için ( UTF-8 kodlamasında ), ondan önce sıfır bayt ve ondan sonra 255 değerine sahip bir bayt göndermelisiniz.
Protokol 76
2 Haziran 2010'da WebSocket protokolü, geriye dönük uyumluluğu korumadan bir WebSocket bağlantısı kurma prosedürünü değiştirmek için değiştirildi. 76'da Arşivlendi : 19 Nisan 2012. WebSocket protokolünün taslak revizyonu, sahte isteklere karşı koruma ekledi. Yeni şemayı destekleyen bir istemci aşağıdaki isteği gönderir:
GET /demo HTTP/1.1
Yükseltme: WebSocket
Bağlantı: Yükseltme
Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5
ev sahibi: örnek.com
Sec-WebSocket-Key1: 12998 5 Y3 1 .P00
Kaynak: http://example.com
WebSocket Protokolü: örnek
^n:ds[4U
İsteğe yeni "Sec-WebSocket-Key1" ve "Sec-WebSocket-Key2" başlıkları ve 8 baytlık bir istek gövdesi eklendi. Hepsi müşteri tarafından rastgele oluşturulur.
WebSocket'e geçişi onaylayan sunucu yanıtı:
HTTP/1.1 101 Web Soketi Protokol Anlaşması
Yükseltme: WebSocket
Bağlantı: Yükseltme
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Location: ws://example.com/demo
Sec-WebSocket-Protocol: örnek
8jKS'y:G*Co,Wxa-
Yanıt yeni başlık adları içerir ("WebSocket-Origin", "WebSocket-Location", "WebSocket-Protocol" yerine "Sec-WebSocket-Origin", "Sec-WebSocket-Location", "Sec-WebSocket-Protocol") ve 16 baytlık yanıt gövdesi, aşağıdaki şekilde değerlendirilir:
- Sec-WebSocket-Key1 istek başlığının değerine sahip dizeden, rakam olmayan tüm karakterleri hariç tutun ("0'..'9' aralığına girmeyen);
- elde edilen diziyi 64 bitlik bir tamsayıya çevirin (yukarıdaki örnek için 1299853100 elde ederiz);
- elde edilen sayıyı tamsayı bölümüyle kaynak satırındaki başlık değeriyle boşluk sayısına bölün;
- elde edilen sayıyı büyük endian biçiminde 4 baytlık 32 bitlik bir sayı olarak temsil eder : yüksek bayt, sıfır uzaklığında depolanır;
- aynısını Sec-WebSocket-Key2 başlığı ile yapın;
- 4) ve 5) noktalarındaki sayıları 4 baytlık dizeler olarak yorumlayarak, bunları birleştirin (tek bir dizeye ekleyin) ve istek gövdesini bir dize olarak ekleyin;
- alınan 16 baytlık diziden MD5 değerini hesaplayın ve bu değeri herhangi bir gösterime dönüştürmeden "olduğu gibi" yanıt gövdesine yazın;
notlar
Yeni isteklerin ve yanıtların HTTP protokolünün istek ve yanıtlarına "benzerliğine" rağmen , bunlar değildir. Örneğin, isteğin bir gövdesi vardır, ancak başlıklarda "Content-Length" alanı eksiktir (bu, HTTP kurallarını ihlal eder ).
Arka uç, her iki tür istemciyi de desteklemeli ve istekte Sec-WebSocket-Key1 ve Sec-WebSocket-Key2 üstbilgilerinin varlığına veya yokluğuna göre bunları birbirinden ayırmalıdır.
Protokol 07
Sürüm 07'ye 19 Nisan 2012 tarihinde arşivlendi . 22 Nisan 2011 tarihli taslak protokolde değişiklik yapıldı.
Verilerin şifreleme olmadan iletildiği protokol 76'dan farklı olarak [1] , protokolün bu versiyonunda istemciden (tarayıcı) sunucuya iletilen her bir veri baytı, zorunlu olarak 4 baytlık bir maske [2] ile maskelenir . Her mesaj için yeniden oluşturulur.
Gönderilmekte olan mesajın artık aşağıdaki gibi verileri içeren bir başlığı vardır:
- mesajın parçalanmış olup olmadığı;
- iletilen veri türü;
- mesajın maskelenip maskelenmediği;
- veri boyutu;
- maske;
- diğer kontrol verileri (ping, pong...).
İstemci ile sunucu arasındaki etkileşim, istemciden gelen bir istekle başlar:
GET /chat HTTP/1.1
Ana makine: server.example.com
Yükseltme: websocket
Bağlantı: Yükseltme
Sec-WebSocket-Anahtarı: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Origin: http://example.com
Sec-WebSocket-Protocol: sohbet, süper sohbet
Sec-WebSocket-Sürüm: 7
Sunucu yanıtı şöyle görünür:
HTTP/1.1 101 Anahtarlama Protokolleri
Yükseltme: websocket
Bağlantı: Yükseltme
Sec-WebSocket-Kabul: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: sohbet
Yanıt, istemci tarafından desteklenenler (sohbet, süper sohbet) arasından sunucu (sohbet) tarafından seçilen tek bir protokole sahip bir Sec-WebSocket-Protocol başlığı içerir. Sec-WebSocket-Accept başlığı şu şekilde oluşturulur:
- Sec-WebSocket-Key başlığından dize değerini alın ve 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 dizisiyle birleştirin (yukarıdaki örnekte dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11 elde ederiz)
- ilk paragrafta alınan diziden SHA-1 ikili karmasını (20 karakterlik bir ikili dizi) hesaplayın
- hash'i Base64'te kodlayın (s3pPLMBiTxaQ9kYGzzhZRbK+xOo=)
PHP'de yukarıdaki algoritmanın uygulanmasına bir örnek :
<?php
echo base64_encode ( SHA1 ( "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" , doğru ));
?>
Protokol RFC 6455 (bundan sonra veriler bu protokol kullanılarak çerçevelerde iletilecektir)
11 Aralık 2011'de protokol, RFC durumunu aldı .
Sec-WebSocket-Origin başlığı artık sadece Origin oldu .
URI şeması
Web Socket protokolü iki URI şeması tanımlar, ws: (şifrelenmemiş bağlantı) ve wss: (şifreli bağlantı).
Tarayıcılarda WebSocket Uygulaması
Bir bağlantı kurmak için, istemci betiği bir WebSocket nesnesi oluşturur, WebSocket URI parametresini yapıcısına iletir ve bağlanma, mesaj alma ve bağlantıyı kesme için geri çağırma işlevlerini tanımlar.
< html >
< head >
< script >
const webSocket = yeni WebSocket ( 'ws://localhost/echo' );
webSocket . açık = olay => {
uyarı ( 'açık' );
webSocket . send ( "Merhaba Web Soketi!" );
};
webSocket . onmessage = event => {
alert ( 'onmessage' + event . data );
};
webSocket . onclose = olay => {
alert ( 'onclose' );
};
</ script >
</ head >
< body >
</ body >
</ html >
WebSocket şu anda aşağıdaki tarayıcılarda desteklenmektedir:
- Google Chrome (4.0.249.0 sürümünden itibaren);
- Apple Safari (5.0.7533.16 sürümünden beri);
- Mozilla Firefox (sürüm 4'ten itibaren);
- Opera (10.70 9067 sürümünden beri);
- Internet Explorer (sürüm 10'dan başlayarak);
Bağlantıyı izleyerek tarayıcınızın WebSocket'ı destekleyip desteklemediğini kontrol edebilirsiniz: http://caniuse.com/#feat=websockets 8 Nisan 2017'de Wayback Machine'de arşivlendi .
Kasım 2010'un sonunda Adam Barth , kullanılan protokolün güvenilirliğine ilişkin bir çalışmanın sonuçlarını yayınladı [3] . Sonuçlarına göre, şeffaf proxy sunucuların kullanılması durumunda, iletilen verilerin önbelleğini değiştirmenin mümkün olduğu, böylece gerçek veriler yerine kullanıcıların bir saldırgandan verilerin bir sürümünü alacağı ortaya çıktı. Sorun, Firefox ve Opera geliştiricilerinin 11 Ocak 2011'de Arşivlenen Wayback Machine'de , tarayıcılarının gelecekteki sürümlerinde, bu protokolün güvensizliği giderilene kadar web soketleri desteğinin varsayılan olarak devre dışı bırakılacağını duyurdukları kadar ciddi olduğu ortaya çıktı ( açmak mümkün olmasına rağmen).
Notlar
- ↑ WebSocket protokolü (draft-hixie-thewebsocketprotocol-76) . Erişim tarihi: 20 Eylül 2011. 19 Nisan 2012 tarihinde kaynağından arşivlendi .
- ↑ WebSocket protokolü (draft-ietf-hybi-thewebsocketprotocol-07) . Erişim tarihi: 20 Eylül 2011. 19 Nisan 2012 tarihinde kaynağından arşivlendi .
- ↑ Shestakov V. S., Sagidullin A. S. / WEBSOCKET TEKNOLOJİSİNİN TEKNOLOJİK WEB UYGULAMALARINDA UYGULANMASI. — DOI 10.17586/0021-3454-2015-58-4-328-330 UDC 658.512.011.56. — Zh-l Enstrümantasyon Nisan 2015
Bağlantılar
- RFC 6455 - WebSocket protokolü 8 Ocak 2012 tarihinde Wayback Machine'de arşivlendi , protokol standardı
- HTML5 WebSocket API 7 Haziran 2015'te Wayback Machine'de arşivlendi W3C belirtim taslağı
- WebSocket'e adanmış WebSockets.org sitesi (WebSocket'ta test yankı sunucusunu destekler)
- WebSocketsTest.org Tarayıcınızda WebSockets ve Comet'i test eden bir site olan Wayback Machine'de 7 Ekim 2010 tarihinde arşivlendi