WebSocket
بروتوكول WebSocket هو بروتوكول اتصالات حاسوبية ، يوفر قناة اتصال ثنائية الاتجاه عبر اتصال واحد ببروتوكول التحكم في الإرسال (TCP). وقد تم توحيد هذا البروتوكول من قبل فريق عمل هندسة الإنترنت (IETF) تحت مسمى RFC 6455 في عام 2011. وتُعرف المواصفات الحالية التي تسمح لتطبيقات الويب باستخدام هذا البروتوكول باسم WebSockets . [ 1 ] وهو معيار حيّ تتولى صيانته مجموعة عمل WHATWG، ويُعدّ امتدادًا لواجهة برمجة تطبيقات WebSocket من اتحاد شبكة الويب العالمية (W3C) . [ 2 ]
يختلف بروتوكول WebSocket عن بروتوكول HTTP المستخدم في عرض معظم صفحات الويب. ورغم اختلافهما، تنصّ RFC 6455 على أن WebSocket "مصمم للعمل عبر منفذي HTTP 443 و80، بالإضافة إلى دعم وكلاء HTTP والوسطاء"، مما يجعل بروتوكول WebSocket متوافقًا مع HTTP. ولتحقيق هذا التوافق، تستخدم عملية المصافحة في WebSocket ترويسة HTTP Upgrade [ 3 ] للانتقال من بروتوكول HTTP إلى بروتوكول WebSocket.
يُمكّن بروتوكول WebSocket التفاعل ثنائي الاتجاه الكامل بين متصفح الويب (أو أي تطبيق عميل آخر ) وخادم الويب ، مع تقليل الحمل الزائد مقارنةً بالبدائل ثنائية الاتجاه الجزئية مثل استطلاع HTTP ، مما يُسهّل نقل البيانات في الوقت الفعلي من وإلى الخادم. ويتحقق ذلك من خلال توفير طريقة موحدة للخادم لإرسال المحتوى إلى العميل دون الحاجة إلى طلب مسبق من العميل، والسماح بتبادل الرسائل مع الحفاظ على الاتصال مفتوحًا. وبهذه الطريقة، يُمكن إجراء محادثة ثنائية الاتجاه مستمرة بين العميل والخادم. تتم الاتصالات عادةً عبر منفذ TCP رقم 443 (أو 80 في حالة الاتصالات غير الآمنة)، وهو أمر مفيد للبيئات التي تحظر اتصالات الإنترنت غير المتعلقة بالويب باستخدام جدار الحماية . بالإضافة إلى ذلك، يُمكّن WebSocket تدفق الرسائل عبر TCP. يتعامل TCP وحده مع تدفقات البايتات دون مفهوم مُتأصل للرسالة. وقد تم تحقيق اتصالات ثنائية الاتجاه مماثلة بين المتصفح والخادم بطرق غير موحدة باستخدام تقنيات مؤقتة مثل Comet أو Adobe Flash Player . [ 4 ]
تدعم معظم المتصفحات هذا البروتوكول، بما في ذلك جوجل كروم ، وفايرفوكس ، ومايكروسوفت إيدج ، وإنترنت إكسبلورر ، وسفاري ، وأوبرا . [ 5 ]
تُعرّف مواصفات بروتوكول WebSocket كلاً wsمن WebSocket و wssWebSocket Secure كمعرفين جديدين للموارد الموحدة (URI) [ 6 ] ، يُستخدمان للاتصالات غير المشفرة والمشفرة على التوالي. وباستثناء اسم المعرف وجزئه ( أي #أنه غير مدعوم)، فإن باقي مكونات URI مُعرّفة لاستخدام صيغة URI العامة . [ 7 ]
تاريخ
أُشير إلى WebSocket لأول مرة باسم TCPConnection في مواصفات HTML5 ، كرمز مؤقت لواجهة برمجة تطبيقات المقابس القائمة على بروتوكول TCP. [ 8 ] في يونيو 2008، قاد مايكل كارتر سلسلة من المناقشات أسفرت عن الإصدار الأول من البروتوكول المعروف باسم WebSocket. [ 9 ] قبل WebSocket، كان الاتصال ثنائي الاتجاه الكامل عبر المنفذ 80 ممكنًا باستخدام قنوات Comet ؛ إلا أن تطبيق Comet معقد، ونظرًا لحجم بيانات المصافحة TCP ورأس HTTP، فهو غير فعال للرسائل الصغيرة. يهدف بروتوكول WebSocket إلى حل هذه المشكلات دون المساس بافتراضات أمان الويب. صاغ إيان هيكسون ومايكل كارتر اسم "WebSocket" بعد ذلك بوقت قصير من خلال التعاون في غرفة دردشة IRC #whatwg، [ 10 ] ثم قام إيان هيكسون بتأليفه لإدراجه في مواصفات HTML5. في ديسمبر 2009، كان متصفح جوجل كروم 4 أول متصفح يدعم معيار WebSocket بشكل كامل، مع تفعيل WebSocket افتراضيًا. [ 11 ] ثم نُقل تطوير بروتوكول WebSocket من مجموعة W3C و WHATWG إلى IETF في فبراير 2010، وأُجريت عليه مراجعتان تحت إشراف إيان هيكسون. [ 12 ]
بعد أن تم شحن البروتوكول وتفعيله افتراضيًا في العديد من المتصفحات، تم الانتهاء من RFC 6455 تحت إشراف إيان فيت في ديسمبر 2011.
أدخلت RFC 7692 امتداد الضغط إلى WebSocket باستخدام خوارزمية DEFLATE على أساس كل رسالة.
واجهة برمجة تطبيقات الويب
قد يستخدم تطبيق ويب (مثل متصفح الويب) هذه WebSocketالواجهة للحفاظ على اتصالات ثنائية الاتجاه مع خادم WebSocket. [ 13 ]
مثال العميل
في لغة تايب سكريبت .
// الاتصال بالخادم const ws = new WebSocket ( "wss://game.example.com/scoreboard" );// استلام ArrayBuffer بدلاً من Blob ws.binaryType = " arraybuffer " ;// تعيين مستمعي الأحداثws.onopen = () => { console.log ( " تم فتح الاتصال" ) ; ws.send ( " مرحباً أيها الخادم، أرجو إرسال نتيجة مباراة الأمس" ) ; } ;ws.onmessage = ( event : MessageEvent ) => { console.log ( " تم استلام البيانات" , event.data ) ; ws.close ( ) ; // لقد حصلنا على النتيجة ، لذا لسنا بحاجة إلى الاتصال بعد الآن } ;ws.onclose = ( event : CloseEvent ) = > { console.log ( " تم إغلاق الاتصال " , event.code , event.reason , event.wasClean ) ; } ;ws.onerror = () => { console.log ( " تم إغلاق الاتصال بسبب خطأ" ) ; };واجهة WebSocket
| يكتب | الاسم [ 14 ] | وصف |
|---|---|---|
| المُنشئ | ws = new WebSocket(url [, protocols ]) | ابدأ المصافحة الافتتاحية . [ 15 ]
الاستثناءات:
|
| طريقة | ws.send(data) | إرسال رسالة بيانات . [ 16 ]
يعود: الاستثناءات:
ملاحظة: إذا تعذر إرسال البيانات (على سبيل المثال، لأنها تحتاج إلى التخزين المؤقت ولكن المخزن المؤقت ممتلئ)، يتم إغلاق الاتصال ويتم |
ws.close([ code ] [, reason ]) | ابدأ عملية إغلاق المصافحة . [ 17 ]
يعود: الاستثناءات:
ملحوظة:
| |
| حدث | ws.onopen = (event) => {}
| تم نجاح عملية المصافحة الافتتاحية . eventالنوع هو Event. |
ws.onmessage = (event) => {}
| تم استلام رسالة بيانات.event النوع هو MessageEvent. يتم إطلاق هذا الحدث فقط إذا ws.readyStateكان OPEN. [ 18 ]
| |
ws.onclose = (event) => {}
| تم إغلاق اتصال TCP الأساسي . eventالنوع هو CloseEvent[ 19 ] [ 20 ] [ 21 ] [ 22 ]
ملحوظة:
| |
ws.onerror = (event) => {}
| تم إغلاق الاتصال بسبب خطأ . eventالنوع هو Event. | |
| يصف | ws.binaryType(خيط) | نوع event.dataالإدخالws.onmessage عند استلام رسالة بيانات ثنائية. يتم تعيينه مبدئيًا إلى "blob"( Blobكائن). يمكن تغييره إلى "arraybuffer"( ArrayBufferكائن). [ 23 ] |
| خاصية للقراءة فقط | ws.url(خيط) | عنوان URL المُعطى للمنشئ WebSocketمع التحويلات التالية:
|
ws.bufferedAmount(رقم) | عدد بايتات بيانات التطبيق (نصوص UTF-8 وبيانات ثنائية) التي تم وضعها في قائمة الانتظار باستخدام الدالة ws.send()ولكن لم يتم إرسالها بعد إلى الشبكة . تتم إعادة تعيين هذا العدد إلى الصفر بمجرد إرسال جميع البيانات الموجودة في قائمة الانتظار. في حالة إغلاق الاتصال، ستزداد هذه القيمة مع كل استدعاء للدالة ws.send()، ولن تتم إعادة تعيينها إلى الصفر أبدًا. [ 24 ] | |
ws.protocol(خيط) | البروتوكول المقبول من قبل الخادم ، أو سلسلة فارغة إذا protocolsلم يتم تحديده في WebSocketالمُنشئ. | |
ws.extensions(خيط) | الامتدادات التي يقبلها الخادم . | |
ws.readyState(رقم) | حالة الاتصال . وهي إحدى الثوابت المذكورة أدناه. يتم تعيينها مبدئيًا إلى CONNECTING. [ 25 ] | |
| ثابت | WebSocket.CONNECTING = 0 | عملية المصافحة الافتتاحية جارية حاليًا . الحالة الأولية للاتصال. [ 26 ] [ 27 ] |
WebSocket.OPEN = 1 | تم إتمام عملية المصافحة بنجاح . يمكن للعميل والخادم إرسال الرسائل إلى بعضهما البعض. [ 28 ] [ 29 ] | |
WebSocket.CLOSING = 2 | عملية المصافحة النهائية جارية حاليًا . ws.close()تم استدعاء إما أو تم استلام رسالة إغلاق . [ 30 ] [ 31 ] | |
WebSocket.CLOSED = 3 | تم إغلاق اتصال TCP الأساسي . [ 32 ] [ 19 ] [ 20 ] |
بروتوكول

خطوات:
- المصافحة الافتتاحية : طلب HTTP واستجابة HTTP .
- تبادل الرسائل القائم على الإطارات : البيانات، ورسائل ping وpong.
- إنهاء المصافحة : رسالة الإغلاق (يتم تكرار الطلب في الاستجابة).
مصافحة الافتتاح
يرسل العميل طلب HTTP ( باستخدام طريقة GET ، الإصدار 1.1 أو أحدث )، ويرد الخادم باستجابة HTTP برمز الحالة 101 ( تبديل البروتوكولات ) عند نجاح العملية. يمكن لعملاء HTTP وWebSocket الاتصال بالخادم باستخدام نفس المنفذ لأن عملية المصافحة الأولية تستخدم HTTP. يُسمح بإرسال رؤوس HTTP إضافية (غير المذكورة في الجدول أدناه). يمكن إرسال رؤوس HTTP بأي ترتيب. بعد استجابة HTTP الخاصة بتبديل البروتوكولات ، تكتمل عملية المصافحة الأولية، ويتوقف استخدام بروتوكول HTTP، ويتحول الاتصال إلى بروتوكول ثنائي قائم على الإطارات. [ 33 ] [ 34 ]
جانب | رأس الصفحة | قيمة | إلزامي |
|---|---|---|---|
طلب | الأصل [ 35 ] | يختلف | نعم (لعملاء المتصفح) |
| المضيف [ 36 ] | يختلف | نعم | |
| Sec-WebSocket-Version [ 37 ] | 13 | ||
| Sec-WebSocket-Key [ 38 ] | base64 -encode(16 random bytes) | ||
إجابة | Sec-WebSocket-Accept [ 39 ] | base64-encode( SHA1 (Sec-WebSocket-Key + " 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 " )) [ b ] | |
كلاهما | الاتصال [ 40 ] [ 41 ] | يرقي | |
| الترقية [ 42 ] [ 43 ] | Websocket | ||
| بروتوكول Sec-WebSocket [ 44 ] | قد يحتوي الطلب على قائمة من السلاسل النصية مفصولة بفواصل (مرتبة حسب الأفضلية) تشير إلى بروتوكولات مستوى التطبيق (المبنية على رسائل بيانات WebSocket) التي يرغب العميل في استخدامها. إذا أرسل العميل هذا العنوان، فيجب أن تكون استجابة الخادم إحدى القيم الموجودة في القائمة. | لا | |
| Sec-WebSocket-Extensions [ 45 ] [ 46 ] [ 47 ] [ 48 ] | يُستخدم هذا الحقل للتفاوض على إضافات بروتوكول WebSocket. يمكن للعميل طلب إضافات لبروتوكول WebSocket عن طريق تضمين قائمة مفصولة بفواصل (مرتبة حسب الأفضلية). قد تحتوي كل إضافة على مُعامل (مثل foo=4). يمكن للخادم قبول بعض أو كل الإضافات التي طلبها العميل. قد يظهر هذا الحقل عدة مرات في الطلب (مما يُعادل منطقيًا ظهورًا واحدًا يحتوي على جميع القيم) ويجب ألا يظهر أكثر من مرة في الاستجابة. |
مثال على الطلب: [ 34 ]
طلب GET إلى /chat HTTP / 1.1 المضيف : server.example.com الترقية : websocket الاتصال : الترقية مفتاح WebSocket الآمن : dGhlIHNhbXBsZSBub25jZQ== المصدر : http://example.com بروتوكول WebSocket الآمن : chat, superchat إصدار WebSocket الآمن : 13مثال على الرد: [ 34 ]
بروتوكول HTTP / 1.1 101 تبديل البروتوكولات الترقية : اتصال WebSocket : الترقية Sec-WebSocket-Accept : s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol : دردشةيقوم كود بايثون التالي بإنشاء قيمة عشوائية Sec-WebSocket-Key.
استيراد base64 استيراد osprint ( base64.b64encode ( os.urandom ( 16 ) ) )يقوم كود بايثون التالي بالحساب Sec-WebSocket-Acceptباستخدام Sec-WebSocket-Keyمثال الطلب أعلاه.
استيراد base64 و hashlibالمفتاح : بايتات = b "dGhlIHNhbXBsZSBub25jZQ=" السحر : بايتات = b "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" print ( base64 . b64encode ( hashlib . sha1 ( المفتاح + السحر ) . digest ()))Sec-WebSocket-Keyوتهدف Sec-WebSocket-Acceptإلى منع وكيل التخزين المؤقت من إعادة إرسال محادثة WebSocket سابقة، [ 49 ] ولا توفر أي مصادقة أو خصوصية أو سلامة.
على الرغم من أن بعض الخوادم تقبل طلبًا قصيرًا Sec-WebSocket-Key، إلا أن العديد من الخوادم الحديثة سترفض الطلب مع الخطأ "رأس Sec-WebSocket-Key غير صالح".
الرسائل القائمة على الإطارات
بعد المصافحة الأولية، يمكن للعميل والخادم، في أي وقت، إرسال رسائل البيانات (نصية أو ثنائية) ورسائل التحكم ( إغلاق ، تنبيه ، رد اتصال ) إلى بعضهما البعض. تتكون الرسالة من إطار واحد إذا كانت غير مجزأة، أو من إطارين على الأقل إذا كانت مجزأة .
تقسم التجزئة الرسالة إلى إطارين أو أكثر . وهي تُمكّن من إرسال الرسائل ببيانات أولية متاحة ولكن بطول كامل غير معروف. بدون التجزئة، يجب إرسال الرسالة كاملةً في إطار واحد، لذا يلزم معرفة الطول الكامل قبل إرسال البايت الأول، الأمر الذي يتطلب مخزنًا مؤقتًا. [ 50 ] اقتُرح توسيع هذه الميزة لتمكين تعدد إرسال عدة تدفقات في وقت واحد (مثلًا لتجنب احتكار منفذ واحد لحمولة كبيرة واحدة ) ، ولكن لم يُقبل توسيع البروتوكول. [ 51 ]
- تتكون الرسالة غير المجزأة من إطار واحد يحتوي على
FIN = 1وopcode ≠ 0. - تتكون الرسالة المجزأة من إطار واحد يحتوي على
FIN = 0وopcode ≠ 0، متبوعًا بصفر أو أكثر من الإطارات التي تحتوي علىFIN = 0وopcode = 0، وينتهي بإطار واحد يحتوي علىFIN = 1وopcode = 0.
هيكل الإطار
| الإزاحة (بت) | الحقل [ 52 ] | الحجم (بت) | وصف | |
|---|---|---|---|---|
| 0 | النهاية [ 53 ] | 1 |
| |
| 1 | RSV1 | 1 | محجوز. يجب أن تكون قيمته صفرًا ما لم يُحددها امتداد. إذا تم استلام قيمة غير صفرية ولم يُحدد أي من الامتدادات المتفاوض عليها معنى هذه القيمة غير الصفرية، فيجب إغلاق الاتصال. [ 54 ] | |
| 2 | RSV2 | 1 | ||
| 3 | RSV3 | 1 | ||
| 4 | رمز العملية | 4 | انظر إلى رموز العمليات أدناه. | |
| 8 | مُقنّع [ 55 ] | 1 |
| |
| 9 | طول الحمولة [ 56 ] | 7، أو 7+16، أو 7+64 | طول الحمولة (بيانات الامتداد + بيانات التطبيق) بالبايت.
| |
| يختلف | مفتاح الإخفاء [ 57 ] | 0 أو 32 | قيمة عشوائية . موجودة إذا كان الحقل المقنّع يساوي 1. يقوم العميل بإنشاء مفتاح إخفاء لكل إطار مقنّع. | |
| الحمولة | بيانات إضافية | طول الحمولة (بايت) | يجب أن يكون فارغًا ما لم يتم تحديده بواسطة امتداد. | |
| بيانات التطبيق | يعتمد ذلك على رمز العملية | |||
رموز العمليات
| نوع الإطار [ 58 ] | رمز العملية [ 59 ] | متعلق ب | وصف | غاية | قابل للتجزئة | أقصى طول للحمولة (بايت) | |
|---|---|---|---|---|---|---|---|
| إطار الاستمرارية | 0 | إطار غير الإطار الأول من رسالة مجزأة. | تجزئة الرسائل | 2 63 − 1 [ ج ] | |||
| إطار غير تحكمي | نص | 1 | send()،onmessage | نص مشفر بنظام UTF-8. | رسالة بيانات | نعم | |
| ثنائي | 2 | البيانات الثنائية. | |||||
| 3-7 | محجوزة لإطارات أخرى غير إطارات التحكم. يمكن تعريفها بواسطة امتداد. [ 60 ] | ||||||
| إطار التحكم [ 61 ] | يغلق | 8 | close()،onclose | تبدأ عملية المصافحة الختامية لبروتوكول WebSocket عند إرسال أو استقبال إطار إغلاق . [ 62 ] وقد تمنع فقدان البيانات من خلال استكمال عملية المصافحة الختامية لبروتوكول TCP . [ 63 ] لا يمكن إرسال أي إطار بعد إرسال إطار إغلاق . إذا تم استقبال إطار إغلاق ولم يتم إرسال إطار إغلاق سابق، فيجب إرسال إطار إغلاق كرد (عادةً ما يعكس رمز الحالة المستلم). الحمولة اختيارية، ولكن إذا كانت موجودة، فيجب أن تبدأ برمز حالة عدد صحيح غير مُوقَّع ثنائي البايت بنظام big-endian ، ويتبعها اختياريًا رسالة سبب مُشفَّرة بنظام UTF-8 لا يزيد طولها عن 123 بايت. [ 64 ] | حالة البروتوكول | لا | 125 |
| بينغ | 9 | يمكن استخدامه لقياس زمن الاستجابة ، ولإبقاء الاتصال نشطًا ، ولإرسال إشارة نبض . يمكن لكلا الطرفين إرسال طلب ping (بأي حمولة بيانات). يجب على الطرف المُستقبِل، في أقرب وقت ممكن، إرسال رد pong بنفس حمولة البيانات . يجب تجاهل رد pong إذا لم يتم إرسال طلب ping مسبقًا. [ 65 ] [ 66 ] [ 67 ] | |||||
| بونغ | 10 | ||||||
| 11-15 | محجوز لإطارات تحكم إضافية. يمكن تعريفه بواسطة امتداد. [ 60 ] | ||||||
إخفاء الهوية من العميل إلى الخادم
يجب على العميل إخفاء جميع الإطارات المرسلة إلى الخادم. ولا يجوز للخادم إخفاء أي إطارات مرسلة إلى العميل. [ 68 ] يطبق إخفاء الإطارات عملية XOR بين البيانات المرسلة ومفتاح الإخفاء . يصف الكود الزائف التالي الخوارزمية المستخدمة لإخفاء الإطار وإظهاره. [ 57 ]
لكل i من 0 إلى payload_length − 1 payload[i] := payload[i] xor masking_key[i mod 4]
رموز الحالة
| المدى [ 69 ] | مسموح به في الإطار المغلق | شفرة | وصف |
|---|---|---|---|
| 0–999 | لا | غير مستخدم | |
| 1000–2999 (بروتوكول) | نعم | 1000 | إغلاق طبيعي. |
| 1001 | الخروج (على سبيل المثال: إغلاق علامة تبويب المتصفح؛ تعطل الخادم). | ||
| 1002 | خطأ في البروتوكول. | ||
| 1003 | بيانات غير مدعومة (على سبيل المثال، نقطة النهاية تفهم النص فقط ولكنها استلمت بيانات ثنائية). | ||
| لا | 1004 | محجوز للاستخدام المستقبلي | |
| 1005 | لم يتم استلام أي رمز. | ||
| 1006 | تم إغلاق الاتصال بشكل غير طبيعي (أي لم يتم إجراء المصافحة النهائية). | ||
| نعم | 1007 | بيانات الحمولة غير صالحة (مثل البيانات غير المنسقة بنظام UTF-8 في رسالة نصية). | |
| 1008 | تم انتهاك السياسة. | ||
| 1009 | الرسالة كبيرة جدًا. | ||
| 1010 | امتداد غير مدعوم. يجب على العميل كتابة الامتدادات التي يتوقع أن يدعمها الخادم في الحمولة. | ||
| 1011 | خطأ في الخادم الداخلي. | ||
| لا | 1015 | فشل عملية المصافحة في بروتوكول TLS. | |
| 3000–3999 | نعم | مخصصة للمكتبات والأطر والتطبيقات. مسجلة مباشرة لدى هيئة الأرقام المخصصة للإنترنت (IANA) . | |
| 4000–4999 | للاستخدام الشخصي. |
انضغاط التمدد
تتيح هذه permessage-deflateالإضافة ضغط رسائل البيانات باستخدام خوارزمية DEFLATE . على سبيل المثال، أثناء عملية المصافحة الأولية، قد يستخدم العميل والخادم الترويسة التالية لتفعيل هذه الإضافة. RSV1يجب ضبط حقل الإطار الأول من رسالة البيانات للإشارة إلى أن بيانات الحمولة مضغوطة. [ 71 ]
Sec-WebSocket-Extensions: permessage-deflateمثال على تنفيذ الخادم
في لغة بايثون.
ملاحظة: recv()تُرجع الدالة عددًا من البايتات يصل إلى العدد المطلوب. ولتسهيل قراءة الكود، يتم تجاهل ذلك، وبالتالي قد يفشل في ظروف الشبكة غير المثالية.
استيراد base64، استيراد hashlib، استيراد struct ، من typing استيراد Optional، من socket استيراد socket كـ Socketdef handle_websocket_connection ( ws : Socket ) -> None : # قبول الاتصال conn , addr = ws . accept ()# استلام وتحليل مفتاح طلب HTTP : اختياري [ بايتات ] = لا شيء for line in conn.recv ( 4096 ) .split ( b " \ r\n " ): if line.startswith ( b " Sec - WebSocket -Key" ) : key = line.split ( ) [ - 1 ]إذا كانت قيمة المفتاح None : ارفع ValueError ( "لم يتم العثور على مفتاح Sec-WebSocket" )# إرسال استجابة HTTP sec_accept = base64.b64encode ( hashlib.sha1 ( key + b "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" ) . digest ()) conn.sendall ( b " \r\n ".join ( [ b " HTTP / 1.1 101 Switching Protocols" , b " Connection: Upgrade" , b " Upgrade: websocket" , b "Sec-WebSocket-Accept: " + sec_accept , b " " , b "" , ]) )# فك تشفير وطباعة الإطارات while True : byte0 , byte1 = conn . recv ( 2 ) fin : int = byte0 >> 7 opcode : int = byte0 & 0b1111 masked : int = byte1 >> 7 assert masked , "يجب على العميل إخفاء جميع الإطارات" if opcode >= 8 : assert fin , "إطارات التحكم غير قابلة للتجزئة"# حجم الحمولة payload_size : int = byte1 & 0b111_1111 إذا كان payload_size == 126 : payload_size , = struct.unpack ( " > H" , conn.recv ( 2 )) تحقق من أن payload_size > 125 ، " يجب استخدام الحد الأدنى من عدد البتات" وإذا كان payload_size == 127 : payload_size , = struct.unpack ( " >Q" , conn.recv ( 8 )) تحقق من أن payload_size > 2 ** 16 - 1 ، " يجب استخدام الحد الأدنى من عدد البتات" تحقق من أن payload_size < = 2 ** 63 - 1 ، "يجب أن تكون البتة الأكثر أهمية صفرًا" إذا كان opcode >= 8 : تحقق من أن payload_size <= 125 ، "يجب أن تحتوي إطارات التحكم على 125 بايت كحد أقصى"# فك تشفير مفتاح الإخفاء : بايتات = conn.recv ( 4 ) الحمولة : مصفوفة بايتات = مصفوفة بايتات ( conn.recv ( حجم_الحمولة ) ) لـ i في نطاق ( حجم_الحمولة ) : الحمولة [ i ] = الحمولة [ i ] ^ مفتاح_الإخفاء [ i % 4 ]print ( "تم استلام الإطار" , FIN , opcode , payload )إذا كان __name__ يساوي " __main__ " : # قبول اتصال TCP على أي واجهة على المنفذ 80 ws : Socket = Socket () ws.bind ( ( "" , 80 )) ws.listen ( )handle_websocket_connection ( ws )دعم المتصفح
تم تطبيق نسخة آمنة من بروتوكول WebSocket في Firefox 6، [ 72 ] Safari 6، Google Chrome 14، [ 73 ] Opera 12.10 و Internet Explorer 10. [ 74 ] يسرد تقرير مفصل عن مجموعة اختبار البروتوكول [ 75 ] مدى توافق تلك المتصفحات مع جوانب محددة من البروتوكول.
تم تطبيق نسخة أقدم وأقل أمانًا من البروتوكول في متصفحي Opera 11 و Safari 5، بالإضافة إلى نسخة Safari المخصصة للأجهزة المحمولة في نظام iOS 4.2 . [ 76 ] يدعم متصفح BlackBerry في نظام التشغيل 7 تقنية WebSockets. [ 77 ] ونظرًا لوجود ثغرات أمنية، تم تعطيلها في متصفحي Firefox 4 و5، [ 78 ] وOpera 11. [ 79 ] وباستخدام أدوات مطوري المتصفح، يمكن للمطورين فحص عملية المصافحة WebSocket وإطارات WebSocket. [ 80 ]
| إصدار البروتوكول | تاريخ المسودة | إنترنت إكسبلورر | فايرفوكس [ 81 ] (كمبيوتر شخصي) | فايرفوكس (أندرويد) | كروم (للحاسوب الشخصي، والهواتف المحمولة) | سفاري (ماك، آي أو إس) | أوبرا (للحاسوب الشخصي، والهواتف المحمولة) | متصفح أندرويد |
|---|---|---|---|---|---|---|---|---|
| هيكسي-75 | 4 فبراير 2010 | 4 | 5.0.0 | |||||
| هيكسي-76 هيبي-00 | 6 مايو 2010 - 23 مايو 2010 | 4.0 (معطل) | 6 | 5.0.1 | 11.00 (معطل) | |||
| hybi-07 ، الإصدار 7 | 22 أبريل 2011 | 6 [ 82 ] [ د ] | ||||||
| hybi-10 ، الإصدار 8 | 11 يوليو 2011 | 7 [ 84 ] [ د ] | 7 | 14 [ 85 ] | ||||
| RFC 6455 ، الإصدار 13 | ديسمبر 2011 | 10 [ 86 ] | 11 | 11 | 16 [ 87 ] | 6 | 12.10 [ 88 ] | 4.4 |
تطبيقات الخادم
- يدعم Nginx تقنية WebSockets منذ عام 2013، وقد تم تطبيق ذلك في الإصدار 1.3.13 [ 89 ] بما في ذلك العمل كوكيل عكسي وموازن تحميل لتطبيقات WebSocket. [ 90 ]
- يدعم خادم Apache HTTP تقنية WebSockets منذ يوليو 2013، وقد تم تنفيذها في الإصدار 2.4.5 [ 91 ] [ 92 ]
- أضافت خدمات معلومات الإنترنت دعمًا لـ WebSockets في الإصدار 8 الذي تم إصداره مع Windows Server 2012. [ 93 ]
- يدعم برنامج lighttpd تقنية WebSockets منذ عام 2017، وقد تم تطبيقها في الإصدار 1.4.46. [ 94 ] يمكن لوحدة mod_proxy في lighttpd أن تعمل كوكيل عكسي وموازن أحمال لتطبيقات WebSocket. كما يمكن لوحدة mod_wstunnel في lighttpd أن تعمل كنقطة نهاية WebSocket لنقل البيانات، بما في ذلك البيانات بتنسيق JSON ، إلى تطبيق الواجهة الخلفية. يدعم lighttpd تقنية WebSockets عبر HTTP/2 منذ عام 2022، وقد تم تطبيقها في الإصدار 1.4.65. [ 95 ]
- إكليبس موسكيتو هو وسيط MQTT ، ولكنه يدعم بروتوكول MQTT عبر WebSocket. لذا، يمكن اعتباره نوعًا من تطبيقات WebSocket.
يدعم ASP.NET Core تقنية WebSockets باستخدام البرمجيات app.UseWebSockets();الوسيطة. [ 96 ]
الاعتبارات الأمنية
على عكس طلبات HTTP العادية عبر النطاقات، لا تخضع طلبات WebSocket لسياسة المصدر نفسه . لذا، يجب على خوادم WebSocket التحقق من صحة ترويسة "Origin" ومطابقتها مع المصادر المتوقعة أثناء إنشاء الاتصال، لتجنب هجمات اختطاف WebSocket عبر المواقع (المشابهة لتزوير الطلبات عبر المواقع )، والتي قد تحدث عند مصادقة الاتصال باستخدام ملفات تعريف الارتباط أو مصادقة HTTP. من الأفضل استخدام الرموز المميزة أو آليات حماية مماثلة لمصادقة اتصال WebSocket عند نقل بيانات حساسة (خاصة) عبر WebSocket. [ 97 ] وقد ظهر مثال حي على هذه الثغرة الأمنية في عام 2020 في شكل Cable Haunt .
اجتياز الوكيل
تحاول تطبيقات عميل بروتوكول WebSocket اكتشاف ما إذا كان وكيل المستخدم قد تم تكوينه لاستخدام وكيل عند الاتصال بمضيف الوجهة والمنفذ، وإذا كان الأمر كذلك، فإنه يستخدم طريقة HTTP CONNECT لإعداد نفق دائم.
على الرغم من أن بروتوكول WebSocket نفسه لا يتعرف على خوادم البروكسي أو جدران الحماية، إلا أنه يتضمن آلية مصافحة متوافقة مع HTTP، مما يسمح لخوادم HTTP بمشاركة منافذ HTTP وHTTPS الافتراضية (80 و443 على التوالي) مع بوابة أو خادم WebSocket. يُعرّف بروتوكول WebSocket البادئة ws:// وwss:// للإشارة إلى اتصال WebSocket واتصال WebSocket الآمن على التوالي. يستخدم كلا النظامين آلية ترقية HTTP للترقية إلى بروتوكول WebSocket. بعض خوادم البروكسي شفافة وتعمل بشكل جيد مع WebSocket؛ بينما يمنع البعض الآخر WebSocket من العمل بشكل صحيح، مما يؤدي إلى فشل الاتصال. في بعض الحالات، قد يلزم إجراء تكوين إضافي لخادم البروكسي، وقد تحتاج بعض خوادم البروكسي إلى الترقية لدعم WebSocket.
إذا تدفقت حركة مرور WebSocket غير المشفرة عبر خادم وكيل صريح أو شفاف لا يدعم WebSockets، فمن المرجح أن يفشل الاتصال. [ 98 ]
في حال استخدام اتصال WebSocket مشفر، يضمن استخدام بروتوكول أمان طبقة النقل (TLS) في اتصال WebSocket الآمن HTTP CONNECTإرسال أمر عند تهيئة المتصفح لاستخدام خادم وكيل صريح. يُنشئ هذا نفقًا يوفر اتصال TCP منخفض المستوى من طرف إلى طرف عبر وكيل HTTP، بين عميل WebSocket الآمن وخادم WebSocket. في حالة خوادم الوكيل الشفافة، لا يكون المتصفح على دراية بخادم الوكيل، لذا لا HTTP CONNECTيتم إرسال أي أمر. مع ذلك، نظرًا لتشفير حركة البيانات، قد تسمح خوادم الوكيل الشفافة الوسيطة بمرور البيانات المشفرة، مما يزيد بشكل كبير من احتمالية نجاح اتصال WebSocket عند استخدام WebSocket الآمن. استخدام التشفير ليس مجانيًا من حيث تكلفة الموارد، ولكنه غالبًا ما يوفر أعلى معدل نجاح، نظرًا لأن البيانات تمر عبر نفق آمن.
أدى إصدار مسودة منتصف عام 2010 (الإصدار hixie-76) إلى عدم توافق البروتوكول مع الخوادم الوكيلة العكسية والبوابات، وذلك بإضافة ثمانية بايتات من بيانات المفتاح بعد الترويسات، دون الإعلان عن هذه البيانات في Content-Length: 8الترويسة نفسها. [ 99 ] لم تُمرر هذه البيانات من قِبل جميع الوسطاء، مما قد يؤدي إلى فشل البروتوكول. أما المسودات الأحدث (مثل hybi-09 [ 100 ] ) فقد وضعت بيانات المفتاح في Sec-WebSocket-Keyالترويسة، ما حلّ هذه المشكلة.
انظر أيضاً
ملحوظات
- ↑ تم وصف خوارزمية تحليل عنوان URL علىالرابط التالي : https://url.spec.whatwg.org/#concept-basic-url-parser
- ↑ تشير علامة الجمع إلى دمج السلاسل النصية .
- ↑ لا تقيّد المواصفات صراحةً سوى إطارات التحكم. وبالتالي، فإن جميع الإطارات الأخرى مقيدة بحد البروتوكول البالغ 63 بت لطول الحمولة (حيث يجب أن يكون البت الأكثر أهمية صفرًا).
- 1 2 تقوم متصفحات Gecko من الإصدار 6 إلى 10 بتنفيذ كائن WebSocket باسم "MozWebSocket"، [ 83 ] مما يتطلب رمزًا إضافيًا للتكامل مع التعليمات البرمجية الحالية التي تدعم WebSocket.
مراجع
- ↑ "معيار WebSockets" . WHATWG WebSockets . مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 16-05-2022 .
- ↑ "واجهة برمجة تطبيقات WebSocket" . www.w3.org . مؤرشف من الأصل بتاريخ 2022-06-08 . تم الاطلاع عليه بتاريخ 2022-05-16 .
- ↑ إيان فيت؛ أليكسي ميلنيكوف (ديسمبر 2011). "العلاقة ببروتوكولي TCP وHTTP" . RFC 6455 بروتوكول WebSocket . IETF . القسم 1.7. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ "منصة أدوبي فلاش - المقابس" . help.adobe.com . مؤرشف من الأصل بتاريخ 18 أبريل 2021. تم الاطلاع عليه بتاريخ 28 يوليو 2021.
تتطلب اتصالات TCP "عميلًا" و"خادمًا". يمكن لبرنامج فلاش بلاير إنشاء مقابس العميل.
- ↑ "واجهة برمجة تطبيقات WebSocket (WebSockets)" . وثائق MDN على الويب . شبكة مطوري موزيلا. 6 أبريل 2023. مؤرشف من الأصل في 28 يوليو 2021. تم الاطلاع عليه في 26 يوليو 2021 .
- ↑ غراهام كلاين، محرر. (14 نوفمبر 2011). "مخططات مُعرّف الموارد الموحد (URI) لهيئة الأرقام المخصصة للإنترنت (IANA)" . هيئة الأرقام المخصصة للإنترنت . مؤرشف من الأصل بتاريخ 25 أبريل 2013. تم الاطلاع عليه بتاريخ 10 ديسمبر 2011 .
- ↑ إيان فيت؛ أليكسي ميلنيكوف (ديسمبر 2011). "معرّفات موارد WebSocket" . RFC 6455 بروتوكول WebSocket . IETF . القسم 3. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ "HTML 5" . www.w3.org . مؤرشف من الأصل بتاريخ 16-09-2016 . تم الاطلاع عليه بتاريخ 17-04-2016 .
- ↑ " [ whatwg ] تعليقات مايكل كارتر حول TCPConnection بتاريخ 18 يونيو 2008 (whatwg.org من يونيو 2008)" . lists.w3.org . مؤرشف من الأصل بتاريخ 27 أبريل 2016. تم الاطلاع عليه بتاريخ 17 أبريل 2016 .
- ↑ "سجلات IRC: freenode / #whatwg / 20080618" . krijnhoetmer.nl . مؤرشف من الأصل بتاريخ 21-08-2016 . تم الاطلاع عليه بتاريخ 18-04-2016 .
- ↑ "تقنية Web Sockets متاحة الآن في جوجل كروم" . مدونة كروميوم . مؤرشف من الأصل بتاريخ 9 ديسمبر 2021. تم الاطلاع عليه بتاريخ 17 أبريل 2016 .
- ↑ <ian@hixie.ch>، إيان هيكسون (6 مايو 2010). "بروتوكول WebSocket" . Ietf Datatracker . مؤرشف من الأصل بتاريخ 17 مارس 2017. تم الاطلاع عليه بتاريخ 17 أبريل 2016 .
- ↑ "مقدمة" . WHATWG WebSockets . القسم 1.
- ↑ "تعريف الواجهة" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 10-04-2024 .
- ↑ "new WebSocket(url, protocols)" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 30-04-2024 .
- ↑ "send(data)" . WHATWG WebSockets . sec. 3.1.
- ↑ "close(code, reason)" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 10-04-2024 .
- ↑ "عند استلام رسالة WebSocket" . WHATWG WebSockets . القسم 4.
- ١ ٢ "عند إغلاق اتصال WebSocket؛ الخطوة الفرعية ٣" . WHATWG WebSockets . القسم ٤. مؤرشف من الأصل بتاريخ ٢٠٢٣-٠٣-١٢ . تم الاسترجاع بتاريخ ٢٠٢٤-٠٤-١٣ .
- 1 2 تم إغلاق اتصال WebSocket . IETF . sec. 7.1.4. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ رمز إغلاق اتصال WebSocket . IETF . sec. 7.1.5. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ سبب إغلاق اتصال WebSocket . IETF . sec. 7.1.6. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ "socket.binaryType" . WHATWG WebSockets . sec. 3.1.
- ↑ "socket.bufferedAmount" . WHATWG WebSockets . sec. 3.1.
- ↑ "حالة الاستعداد" . WHATWG WebSockets . القسم 3.1.
- ↑ "جارٍ الاتصال" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 13-04-2024 .
- ↑ متطلبات العميل . IETF . ص 14. القسم 4.1. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ "مفتوح" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاسترجاع بتاريخ 10-04-2024 .
- ↑ _تم إنشاء اتصال WebSocket_ . IETF . ص 20. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ "إغلاق" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاسترجاع بتاريخ 10-04-2024 .
- ↑ بدء عملية المصافحة لإغلاق اتصال WebSocket . IETF . sec. 7.1.3. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ "مغلق" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاسترجاع بتاريخ 10-04-2024 .
- ↑ مصافحة البداية . IETF . القسم 1.3. doi : 10.17487/RFC6455 . RFC 6455 .
- 1 2 3 نظرة عامة على البروتوكول . IETF . القسم 1.2. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 8. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 4. IETF . ص 17. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 9. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 7. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ الخطوة 5.4 للخادم. IETF . ص 24. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 6. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ الخطوة 5.3 للخادم . IETF . ص 24. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 5. IETF . ص 17. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ الخطوة 5.2 للخادم . IETF . ص 24. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 10. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ متطلبات العميل 11. IETF . ص 19. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ Sec-WebSocket-Extensions . IETF.sec.11.3.2 . doi : 10.17487 /RFC6455 . RFC 6455 .
- ↑ الإضافات . IETF . القسم 9. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ التفاوض على الامتدادات . IETF . القسم 9.1. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ " الهدف الرئيسي لبروتوكول WebSocket" . IETF. مؤرشف من الأصل في 22 أبريل 2016. تم الاطلاع عليه في 25 يوليو 2015.
تهدف عملية الحساب [...] إلى منع وسيط التخزين المؤقت من تزويد عميل WS برد خادم WS مخزن مؤقتًا دون تفاعل فعلي مع خادم WS.
- ↑ التجزئة . IETF . القسم 5.4. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ جون أ. تامبلين؛ تاكيشي يوشينو (2013). امتداد تعدد الإرسال لبروتوكول WebSockets . IETF . المعرف: draft-ietf-hybi-websocket-multiplexing.
- ↑ بروتوكول تأطير البيانات الأساسي . IETF . القسم 5.2. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ FIN . IETF . ص 28. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ RSV1، RSV2، RSV3 . IETF . ص 28. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ قناع . IETF . ص 29. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ طول الحمولة . IETF . ص 29. doi : 10.17487/RFC6455 . RFC 6455 .
- 1 2 إخفاء العميل إلى الخادم . IETF . القسم 5.3. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ frame-opcode . IETF . ص 31. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ رمز العملية . IETF . ص 29. doi : 10.17487/RFC6455 . RFC 6455 .
- 1 2 قابلية التوسع . IETF . القسم 5.8. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ إطارات التحكم . IETF . القسم 5.5. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ بدء عملية المصافحة لإغلاق اتصال WebSocket . IETF . sec. 7.1.3. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ مصافحة الإغلاق . IETF . القسم 1.4. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ إغلاق . IETF . القسم 5.5.1. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ Ping . IETF . sec. 5.5.2. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ بونغ . IETF . القسم 5.5.3. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ "إطارات بينغ وبونغ" . WHATWG WebSockets .
- ↑ نظرة عامة . IETF . القسم 5.1. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ نطاقات رموز الحالة المحجوزة . IETF . القسم 7.4.2. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ رموز الحالة المحددة . IETF . القسم 7.4.1. doi : 10.17487/RFC6455 . RFC 6455 .
- ↑ ملحقات الضغط لبروتوكول WebSocket . IETF . doi : 10.17487/RFC7692 . RFC 7692 .
- ↑ ديركجان أوشتمان (27 مايو 2011). "تفعيل WebSocket في فايرفوكس 6" . Mozilla.org . مؤرشف من الأصل بتاريخ 26 مايو 2012. تم الاطلاع عليه بتاريخ 30 يونيو 2011 .
- ↑ "حالة منصة كروميوم للويب" . مؤرشف من الأصل بتاريخ 2017-03-04 . تم الاطلاع عليه بتاريخ 2011-08-03 .
- ↑ "WebSockets (Windows)" . مايكروسوفت. 28-09-2012. مؤرشف من الأصل في 25-03-2015 . تم الاطلاع عليه في 07-11-2012 .
- ↑ "تقرير اختبار بروتوكول WebSockets" . Tavendo.de. 27-10-2011. مؤرشف من الأصل بتاريخ 22-09-2016 . تم الاطلاع عليه بتاريخ 10-12-2011 .
- ↑ كاتي مارسال (23 نوفمبر 2010). "أبل تُضيف دعمًا لمقياس التسارع وتقنية WebSockets إلى متصفح سفاري في نظام iOS 4.2" . AppleInsider.com . مؤرشف من الأصل بتاريخ 1 مارس 2011. تم الاطلاع عليه بتاريخ 9 مايو 2011 .
- ↑ "واجهة برمجة تطبيقات Web Sockets" . بلاك بيري . مؤرشف من الأصل في 10 يونيو 2011. تم الاطلاع عليه في 8 يوليو 2011 .
- ↑ كريس هيلمان (8 ديسمبر 2010). "تعطيل WebSocket في فايرفوكس 4" . Hacks.Mozilla.org . مؤرشف من الأصل بتاريخ 6 مارس 2017. تم الاطلاع عليه بتاريخ 9 مايو 2011 .
- ↑ ألكسندر آس (10 ديسمبر 2010). "بخصوص WebSocket" . مدونتي عن أوبرا . مؤرشف من الأصل بتاريخ 15 ديسمبر 2010. تم الاطلاع عليه بتاريخ 9 مايو 2011 .
- ↑ وانغ، فانيسا؛ سليم، فرانك؛ موسكوفيتس، بيتر (فبراير 2013). "الملحق أ: فحص إطار WebSocket باستخدام أدوات مطوري Google Chrome" . الدليل الشامل لـ HTML5 WebSocket . Apress. ISBN 978-1-4302-4740-1أُرشف من الأصل في 31 ديسمبر 2015. تم الاطلاع عليه في 7 أبريل 2013 .
- ↑ "دعم WebSockets في Firefox" . developer.mozilla.org . مؤسسة موزيلا. 30 سبتمبر 2011. مؤرشف من الأصل في 26 مايو 2012. تم الاطلاع عليه في 10 ديسمبر 2011 .
- ↑ "الخطأ رقم 640003 - WebSockets - الترقية إلى ietf-06" . مؤسسة موزيلا. 8 مارس 2011. مؤرشف من الأصل في 1 أبريل 2021. تم الاطلاع عليه في 10 ديسمبر 2011 .
- ↑ "WebSockets - MDN" . developer.mozilla.org . مؤسسة موزيلا. 30 سبتمبر 2011. مؤرشف من الأصل في 26 مايو 2012. تم الاطلاع عليه في 10 ديسمبر 2011 .
- ↑ "الخطأ رقم 640003 - WebSockets - الترقية إلى ietf-07 (التعليق 91)" . مؤسسة موزيلا. 22 يوليو 2011. مؤرشف من الأصل في 1 أبريل 2021. تم الاطلاع عليه في 28 يوليو 2011 .
- ↑ "خطأ كروميوم رقم 64470" . code.google.com . 25-11-2010. مؤرشف من الأصل بتاريخ 31-12-2015 . تم الاطلاع عليه بتاريخ 10-12-2011 .
- ↑ "تقنية WebSockets في معاينة ويندوز للمستخدمين" . فريق هندسة إنترنت إكسبلورر . مايكروسوفت. ١٩ مارس ٢٠١٢. مؤرشف من الأصل في ٦ سبتمبر ٢٠١٥. تم الاطلاع عليه في ٢٣ يوليو ٢٠١٢ .
- ↑ "مجموعة تغييرات WebKit رقم 97247: WebSocket: تحديث بروتوكول WebSocket إلى hybi-17" . trac.webkit.org . مؤرشف من الأصل بتاريخ 2012-01-05 . تم الاطلاع عليه بتاريخ 2011-12-10 .
- ↑ "لمحة صيفية مميزة عن أوبرا 12.50" . أخبار مطوري أوبرا. 3 أغسطس 2012. مؤرشف من الأصل في 5 أغسطس 2012. تم الاطلاع عليه في 3 أغسطس 2012 .
- ↑ "مرحباً بكم في nginx!" . nginx.org . مؤرشف من الأصل بتاريخ 17 يوليو 2012. تم الاطلاع عليه بتاريخ 3 فبراير 2022 .
- ↑ "استخدام NGINX كوكيل WebSocket" . NGINX . 17 مايو 2014. مؤرشف من الأصل في 6 أكتوبر 2019. تم الاطلاع عليه في 3 نوفمبر 2019 .
- ↑ "نظرة عامة على الميزات الجديدة في خادم Apache HTTP 2.4" . Apache . مؤرشف من الأصل بتاريخ 11 نوفمبر 2020. تم الاطلاع عليه بتاريخ 26 يناير 2021 .
- ↑ "سجل تغييرات أباتشي 2.4" . أباتشي لاونج . مؤرشف من الأصل بتاريخ 22 يناير 2021. تم الاطلاع عليه بتاريخ 26 يناير 2021 .
- ↑ "دعم بروتوكول WebSocket في IIS 8.0" . وثائق مايكروسوفت . 28 نوفمبر 2012. مؤرشف من الأصل في 18 فبراير 2020. تم الاطلاع عليه في 18 فبراير 2020 .
- ↑ "الإصدار 1 4 46 - Lighttpd - مختبرات لايتي" . مؤرشف من الأصل بتاريخ 16 يناير 2021. تم الاطلاع عليه بتاريخ 29 ديسمبر 2020 .
- ↑ "الإصدار 1 4 65 - Lighttpd - مختبرات لايتي" . مؤرشف من الأصل بتاريخ 2024-05-03 . تم الاطلاع عليه بتاريخ 2024-05-03 .
- ↑ "دعم WebSockets في ASP.NET Core" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 2 مايو 2025 .
- ↑ كريستيان شنايدر (31 أغسطس 2013). "اختطاف WebSocket عبر المواقع (CSWSH)" . مدونة أمن تطبيقات الويب . مؤرشف من الأصل في 31 ديسمبر 2016. تم الاطلاع عليه في 30 ديسمبر 2015 .
- ↑ بيتر لوبيرز (16 مارس 2010). "كيف تتفاعل تقنية HTML5 Web Sockets مع خوادم البروكسي" . Infoq.com . C4Media Inc. مؤرشف من الأصل بتاريخ 8 مايو 2016. تم الاطلاع عليه بتاريخ 10 ديسمبر 2011 .
- ↑ ويلي تارو (2010-07-06). "WebSocket -76 غير متوافق مع وكلاء HTTP العكسيين" . ietf.org (بريد إلكتروني). فريق عمل هندسة الإنترنت. مؤرشف من الأصل في 2016-09-17 . تم الاسترجاع في 2011-12-10 .
- ↑ إيان فيت (13 يونيو 2011). "مفتاح WebSocket الآمن" . بروتوكول WebSocket، مسودة hybi-09 . IETF . sec. 11.4 . تم الاطلاع عليه في 15 يونيو 2011 . أُرشف في 1 فبراير 2016، على موقع Wayback Machine
روابط خارجية
- مجموعة عمل IETF للنص التشعبي ثنائي الاتجاه (HyBi)
- RFC 6455 بروتوكول WebSocket – معيار مقترح صادر عن مجموعة عمل IETF HyBi
- بروتوكول WebSocket – مسودة الإنترنت التي نشرتها مجموعة عمل IETF HyBi
- بروتوكول WebSocket – اقتراح البروتوكول الأصلي من إيان هيكسون
- تمت أرشفة واجهة برمجة تطبيقات WebSocket في 7 يونيو 2015 على موقع Wayback Machine - مسودة مواصفات واجهة برمجة التطبيقات الخاصة باتحاد شبكة الويب العالمية
- واجهة برمجة تطبيقات WebSocket - مواصفات توصية مرشحة من W3C لواجهة برمجة التطبيقات
- موقع WebSocket.org مؤرشف بتاريخ 16 سبتمبر 2018 على موقع Wayback Machine. يحتوي على عروض توضيحية لتقنية WebSocket، واختبارات الاتصال الداخلي، ومعلومات عامة، ومعلومات عن المجتمع.
- معايير الويب
- بروتوكولات طبقة التطبيق
- HTML5
- مصطلحات الإنترنت
- مقبس الشبكة
- الويب في الوقت الفعلي
- تطوير مواقع الويب
- 2011 في مجال الحوسبة
