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 ]
  • url: سلسلة نصية تحتوي على:
  • اختياري protocols: سلسلة نصية أو مصفوفة من السلاسل النصية تُستخدم كقيمة للعنوان Sec-WebSocket-Protocolفي عملية المصافحة الافتتاحية.

الاستثناءات:

  • SyntaxError:
    • urlفشل تحليل [ a ] .
    • urlلديه مخطط غير صالح.
    • urlيحتوي على جزء.
    • protocolsيحتوي على سلاسل مكررة.
طريقةws.send(data)إرسال رسالة بيانات . [ 16 ]
  • dataيجب أن يكون string، Blobأو ArrayBuffer.ArrayBufferView

يعود: undefined.

الاستثناءات:

  • InvalidStateError: ws.readyStateيكون CONNECTING.

ملاحظة: إذا تعذر إرسال البيانات (على سبيل المثال، لأنها تحتاج إلى التخزين المؤقت ولكن المخزن المؤقت ممتلئ)، يتم إغلاق الاتصال ويتم errorتشغيل الحدث.

ws.close([ code ] [, reason ])ابدأ عملية إغلاق المصافحة . [ 17 ]
  • اختياري code: إذا تم تحديده، يجب أن يكون 1000 ( إغلاق عادي ) أو ضمن النطاق من 3000 إلى 4999 (محدد من قبل التطبيق). القيمة الافتراضية هي 1000.
  • اختياري reason: إذا تم تحديده، يجب أن يكون سلسلة نصية يصل ترميزها UTF-8 إلى 123 بايت. القيمة الافتراضية هي سلسلة نصية فارغة.

يعود: undefined.

الاستثناءات:

  • InvalidAccessError: codeليس 1000 ولا يقع ضمن النطاق من 3000 إلى 4999.
  • SyntaxError: الملف المشفر بنظام UTF-8 reasonأطول من 123 بايت.

ملحوظة:

  • إذا ws.readyStateكان OPENأو CONNECTING، ws.readyStateيتم تعيين إلى CLOSINGويبدأ المصافحة الختامية.
  • إذا ws.readyStateكان CLOSINGأو CLOSED، فلا يحدث شيء (لأن عملية المصافحة الختامية قد بدأت بالفعل).
حدثws.onopen = (event) => {}

ws.addEventListener("open", (event) => {})

تم نجاح عملية المصافحة الافتتاحية . eventالنوع هو Event.
ws.onmessage = (event) => {}

ws.addEventListener("message", (event) => {})

تم استلام رسالة بيانات.event النوع هو MessageEvent. يتم إطلاق هذا الحدث فقط إذا ws.readyStateكان OPEN. [ 18 ]
  • event.dataالبيانات المستلمة، من النوع:
    • stringللنص.
    • Blobأو ArrayBufferللثنائي (انظر ws.binaryType).
  • event.originولكن ws.urlفقط مع المخطط والمضيف والمنفذ (إن وجد).
ws.onclose = (event) => {}

ws.addEventListener("close", (event) => {})

تم إغلاق اتصال TCP الأساسي . eventالنوع هو CloseEvent[ 19 ] [ 20 ] [ 21 ] [ 22 ]
  • event.code: رمز الحالة (عدد صحيح).
  • event.reason: سبب الإغلاق (نص).
  • event.wasClean: trueإذا تم إغلاق اتصال TCP بعد اكتمال المصافحة النهائية، وإلا false.

ملحوظة:

  • إذا كان إطار الإغلاق المستلم يحتوي على حمولة ، event.codeفاحصل event.reasonعلى قيمته من الحمولة.
  • إذا لم يحتوي إطار الإغلاق المستلم على أي حمولة ، فإن قيمته 1005 ( لم يتم استلام أي رمز ) وهو عبارة عن سلسلة فارغة.event.codeevent.reason
  • إذا لم يتم استلام إطار الإغلاقevent.code ، فسيكون 1006 ( تم إغلاق الاتصال بشكل غير طبيعي ) event.reasonوسلسلة فارغة.
ws.onerror = (event) => {}

ws.addEventListener("error", (event) => {})

تم إغلاق الاتصال بسبب خطأ . eventالنوع هو Event.
يصفws.binaryType(خيط)نوع event.dataالإدخالws.onmessage عند استلام رسالة بيانات ثنائية. يتم تعيينه مبدئيًا إلى "blob"( Blobكائن). يمكن تغييره إلى "arraybuffer"( ArrayBufferكائن). [ 23 ]
خاصية للقراءة فقطws.url(خيط)عنوان URL المُعطى للمنشئ WebSocketمع التحويلات التالية:
  • إذا كان المخطط هو httpأو https، فقم بتغييره إلى wsأو wssعلى التوالي.
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 ]

بروتوكول

رسم تخطيطي يصف اتصالاً باستخدام WebSocket

خطوات:

  1. المصافحة الافتتاحية : طلب HTTP واستجابة HTTP .
  2. تبادل الرسائل القائم على الإطارات : البيانات، ورسائل ping وpong.
  3. إنهاء المصافحة : رسالة الإغلاق (يتم تكرار الطلب في الاستجابة).

مصافحة الافتتاح

يرسل العميل طلب HTTP ( باستخدام طريقة GET ، الإصدار 1.1 أو أحدث )، ويرد الخادم باستجابة HTTP برمز الحالة 101 ( تبديل البروتوكولات ) عند نجاح العملية. يمكن لعملاء HTTP وWebSocket الاتصال بالخادم باستخدام نفس المنفذ لأن عملية المصافحة الأولية تستخدم HTTP. يُسمح بإرسال رؤوس HTTP إضافية (غير المذكورة في الجدول أدناه). يمكن إرسال رؤوس HTTP بأي ترتيب. بعد استجابة HTTP الخاصة بتبديل البروتوكولات ، تكتمل عملية المصافحة الأولية، ويتوقف استخدام بروتوكول HTTP، ويتحول الاتصال إلى بروتوكول ثنائي قائم على الإطارات. [ 33 ] [ 34 ]

رؤوس HTTP ذات الصلة بعملية المصافحة الافتتاحية
جانب
رأس الصفحةقيمةإلزامي
طلب
الأصل [ 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 = الإطار الأخير من الرسالة.
  • 0 = الرسالة مجزأة وهذه ليست الإطار النهائي .
1RSV11محجوز. يجب أن تكون قيمته صفرًا ما لم يُحددها امتداد. إذا تم استلام قيمة غير صفرية ولم يُحدد أي من الامتدادات المتفاوض عليها معنى هذه القيمة غير الصفرية، فيجب إغلاق الاتصال. [ 54 ]
2RSV21
3RSV31
4رمز العملية4انظر إلى رموز العمليات أدناه.
8مُقنّع [ 55 ]1
  • 1 = الإطار مخفي (أي أن مفتاح الإخفاء موجود وتم إجراء عملية XOR بين الحمولة ومفتاح الإخفاء).
  • 0 = الإطار غير مقنع (أي أن مفتاح الإخفاء غير موجود).
انظر إلى إخفاء البيانات من العميل إلى الخادم أدناه.
9طول الحمولة [ 56 ]7، أو 7+16، أو 7+64طول الحمولة (بيانات الامتداد + بيانات التطبيق) بالبايت.
  • 0–125 = هذا هو طول الحمولة.
  • 126 = تمثل البتات الـ 16 التالية طول الحمولة.
  • 127 = الـ 64 بت التالية ( يجب أن تكون البتة الأكثر أهمية 0) هي طول الحمولة.
يُستخدم نظام ترتيب البايتات الكبير (Big-Endian) . أما نظام الإشارة (Unsignedness ) فيُستخدم بدون إشارة . يجب استخدام أقل عدد ممكن من البتات لترميز الطول.
يختلفمفتاح الإخفاء [ 57 ]0 أو 32قيمة عشوائية . موجودة إذا كان الحقل المقنّع يساوي 1. يقوم العميل بإنشاء مفتاح إخفاء لكل إطار مقنّع.
الحمولةبيانات إضافيةطول الحمولة (بايت)يجب أن يكون فارغًا ما لم يتم تحديده بواسطة امتداد.
بيانات التطبيقيعتمد ذلك على رمز العملية

رموز العمليات

نوع الإطار [ 58 ]رمز العملية [ 59 ]متعلق ب

واجهة برمجة تطبيقات الويب

وصفغاية
قابل للتجزئة
أقصى طول للحمولة (بايت)
إطار الاستمرارية0إطار غير الإطار الأول من رسالة مجزأة.تجزئة الرسائل2 63 − 1 [ ج ]
إطار غير تحكمينص1send()،onmessageنص مشفر بنظام UTF-8.رسالة بياناتنعم
ثنائي2البيانات الثنائية.
3-7محجوزة لإطارات أخرى غير إطارات التحكم. يمكن تعريفها بواسطة امتداد. [ 60 ]
إطار التحكم [ 61 ]يغلق8close()،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 ]مسموح به في الإطار المغلقشفرة

[ 70 ]

وصف
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 ] (كمبيوتر شخصي)فايرفوكس (أندرويد)كروم (للحاسوب الشخصي، والهواتف المحمولة)سفاري (ماك، آي أو إس)أوبرا (للحاسوب الشخصي، والهواتف المحمولة)متصفح أندرويد
هيكسي-754 فبراير 201045.0.0
هيكسي-76 هيبي-006 مايو 2010 - 23 مايو 20104.0 (معطل)65.0.111.00 (معطل)
hybi-07 ، الإصدار 722 أبريل 20116 [ 82 ] [ د ]
hybi-10 ، الإصدار 811 يوليو 20117 [ 84 ] [ د ]714 [ 85 ]
RFC 6455 ، الإصدار 13 ديسمبر 201110 [ 86 ]111116 [ 87 ]612.10 [ 88 ]4.4

تطبيقات الخادم

يدعم 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الترويسة، ما حلّ هذه المشكلة.

انظر أيضاً

ملحوظات

  1. تم وصف خوارزمية تحليل عنوان URL علىالرابط التالي : https://url.spec.whatwg.org/#concept-basic-url-parser
  2. تشير علامة الجمع إلى دمج السلاسل النصية .
  3. لا تقيّد المواصفات صراحةً سوى إطارات التحكم. وبالتالي، فإن جميع الإطارات الأخرى مقيدة بحد البروتوكول البالغ 63 بت لطول الحمولة (حيث يجب أن يكون البت الأكثر أهمية صفرًا).
  4. 1 2 تقوم متصفحات Gecko من الإصدار 6 إلى 10 بتنفيذ كائن WebSocket باسم "MozWebSocket"، [ 83 ] مما يتطلب رمزًا إضافيًا للتكامل مع التعليمات البرمجية الحالية التي تدعم WebSocket.

مراجع

  1. "معيار WebSockets" . WHATWG WebSockets . مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 16-05-2022 .
  2. "واجهة برمجة تطبيقات WebSocket" . www.w3.org . مؤرشف من الأصل بتاريخ 2022-06-08 . تم الاطلاع عليه بتاريخ 2022-05-16 .
  3. إيان فيت؛ أليكسي ميلنيكوف (ديسمبر 2011). "العلاقة ببروتوكولي TCP وHTTP" . RFC 6455 بروتوكول WebSocket . IETF . القسم 1.7. doi : 10.17487/RFC6455 . RFC 6455 . 
  4. "منصة أدوبي فلاش - المقابس" . help.adobe.com . مؤرشف من الأصل بتاريخ 18 أبريل 2021. تم الاطلاع عليه بتاريخ 28 يوليو 2021. تتطلب اتصالات TCP "عميلًا" و"خادمًا". يمكن لبرنامج فلاش بلاير إنشاء مقابس العميل.
  5. "واجهة برمجة تطبيقات WebSocket (WebSockets)" . وثائق MDN على الويب . شبكة مطوري موزيلا. 6 أبريل 2023. مؤرشف من الأصل في 28 يوليو 2021. تم الاطلاع عليه في 26 يوليو 2021 .
  6. غراهام كلاين، محرر. (14 نوفمبر 2011). "مخططات مُعرّف الموارد الموحد (URI) لهيئة الأرقام المخصصة للإنترنت (IANA)" . هيئة الأرقام المخصصة للإنترنت . مؤرشف من الأصل بتاريخ 25 أبريل 2013. تم الاطلاع عليه بتاريخ 10 ديسمبر 2011 .
  7. إيان فيت؛ أليكسي ميلنيكوف (ديسمبر 2011). "معرّفات موارد WebSocket" . RFC 6455 بروتوكول WebSocket . IETF . القسم 3. doi : 10.17487/RFC6455 . RFC 6455 . 
  8. "HTML 5" . www.w3.org . مؤرشف من الأصل بتاريخ 16-09-2016 . تم الاطلاع عليه بتاريخ 17-04-2016 .
  9. " [ whatwg ] تعليقات مايكل كارتر حول TCPConnection بتاريخ 18 يونيو 2008 (whatwg.org من يونيو 2008)" . lists.w3.org . مؤرشف من الأصل بتاريخ 27 أبريل 2016. تم الاطلاع عليه بتاريخ 17 أبريل 2016 .
  10. "سجلات IRC: freenode / #whatwg / 20080618" . krijnhoetmer.nl . مؤرشف من الأصل بتاريخ 21-08-2016 . تم الاطلاع عليه بتاريخ 18-04-2016 .
  11. "تقنية Web Sockets متاحة الآن في جوجل كروم" . مدونة كروميوم . مؤرشف من الأصل بتاريخ 9 ديسمبر 2021. تم الاطلاع عليه بتاريخ 17 أبريل 2016 .
  12. <ian@hixie.ch>، إيان هيكسون (6 مايو 2010). "بروتوكول WebSocket" . Ietf Datatracker . مؤرشف من الأصل بتاريخ 17 مارس 2017. تم الاطلاع عليه بتاريخ 17 أبريل 2016 .
  13. "مقدمة" . WHATWG WebSockets . القسم 1.
  14. "تعريف الواجهة" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 10-04-2024 .
  15. "new WebSocket(url, protocols)" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 30-04-2024 .
  16. "send(data)" . WHATWG WebSockets . sec. 3.1.
  17. "close(code, reason)" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 10-04-2024 .
  18. "عند استلام رسالة WebSocket" . WHATWG WebSockets . القسم 4.
  19. ١ ٢ "عند إغلاق اتصال WebSocket؛ الخطوة الفرعية ٣" . WHATWG WebSockets . القسم ٤. مؤرشف من الأصل بتاريخ ٢٠٢٣-٠٣-١٢ . تم الاسترجاع بتاريخ ٢٠٢٤-٠٤-١٣ .
  20. 1 2 تم إغلاق اتصال WebSocket . IETF . sec. 7.1.4. doi : 10.17487/RFC6455 . RFC 6455 . 
  21. رمز إغلاق اتصال WebSocket . IETF . sec. 7.1.5. doi : 10.17487/RFC6455 . RFC 6455 . 
  22. سبب إغلاق اتصال WebSocket . IETF . sec. 7.1.6. doi : 10.17487/RFC6455 . RFC 6455 . 
  23. "socket.binaryType" . WHATWG WebSockets . sec. 3.1.
  24. "socket.bufferedAmount" . WHATWG WebSockets . sec. 3.1.
  25. "حالة الاستعداد" . WHATWG WebSockets . القسم 3.1.
  26. "جارٍ الاتصال" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاطلاع عليه بتاريخ 13-04-2024 .
  27. متطلبات العميل . IETF . ص 14. القسم 4.1. doi : 10.17487/RFC6455 . RFC 6455 .   
  28. "مفتوح" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاسترجاع بتاريخ 10-04-2024 .
  29. _تم إنشاء اتصال WebSocket_ . IETF . ص 20. doi : 10.17487/RFC6455 . RFC 6455 . 
  30. "إغلاق" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاسترجاع بتاريخ 10-04-2024 .
  31. بدء عملية المصافحة لإغلاق اتصال WebSocket . IETF . sec. 7.1.3. doi : 10.17487/RFC6455 . RFC 6455 . 
  32. "مغلق" . WHATWG WebSockets . القسم 3.1. مؤرشف من الأصل بتاريخ 12-03-2023 . تم الاسترجاع بتاريخ 10-04-2024 .
  33. مصافحة البداية . IETF . القسم 1.3. doi : 10.17487/RFC6455 . RFC 6455 . 
  34. 1 2 3 نظرة عامة على البروتوكول . IETF . القسم 1.2. doi : 10.17487/RFC6455 . RFC 6455 . 
  35. متطلبات العميل 8. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 . 
  36. متطلبات العميل 4. IETF . ص 17. doi : 10.17487/RFC6455 . RFC 6455 . 
  37. متطلبات العميل 9. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 . 
  38. متطلبات العميل 7. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 . 
  39. الخطوة 5.4 للخادم. IETF . ص 24. doi : 10.17487/RFC6455 . RFC 6455 . 
  40. متطلبات العميل 6. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 . 
  41. الخطوة 5.3 للخادم . IETF . ص 24. doi : 10.17487/RFC6455 . RFC 6455 . 
  42. متطلبات العميل 5. IETF . ص 17. doi : 10.17487/RFC6455 . RFC 6455 . 
  43. الخطوة 5.2 للخادم . IETF . ص 24. doi : 10.17487/RFC6455 . RFC 6455 . 
  44. متطلبات العميل 10. IETF . ص 18. doi : 10.17487/RFC6455 . RFC 6455 . 
  45. متطلبات العميل 11. IETF . ص 19. doi : 10.17487/RFC6455 . RFC 6455 . 
  46. Sec-WebSocket-Extensions . IETF.sec.11.3.2 . doi : 10.17487 /RFC6455 . RFC 6455 . 
  47. الإضافات . IETF . القسم 9. doi : 10.17487/RFC6455 . RFC 6455 . 
  48. التفاوض على الامتدادات . IETF . القسم 9.1. doi : 10.17487/RFC6455 . RFC 6455 . 
  49. " الهدف الرئيسي لبروتوكول WebSocket" . IETF. مؤرشف من الأصل في 22 أبريل 2016. تم الاطلاع عليه في 25 يوليو 2015. تهدف عملية الحساب [...] إلى منع وسيط التخزين المؤقت من تزويد عميل WS برد خادم WS مخزن مؤقتًا دون تفاعل فعلي مع خادم WS.
  50. التجزئة . IETF . القسم 5.4. doi : 10.17487/RFC6455 . RFC 6455 . 
  51. جون أ. تامبلين؛ تاكيشي يوشينو (2013). امتداد تعدد الإرسال لبروتوكول WebSockets . IETF . المعرف: draft-ietf-hybi-websocket-multiplexing.
  52. بروتوكول تأطير البيانات الأساسي . IETF . القسم 5.2. doi : 10.17487/RFC6455 . RFC 6455 . 
  53. FIN . IETF . ص 28. doi : 10.17487/RFC6455 . RFC 6455 . 
  54. RSV1، RSV2، RSV3 . IETF . ص 28. doi : 10.17487/RFC6455 . RFC 6455 . 
  55. قناع . IETF . ص 29. doi : 10.17487/RFC6455 . RFC 6455 . 
  56. طول الحمولة . IETF . ص 29. doi : 10.17487/RFC6455 . RFC 6455 . 
  57. 1 2 إخفاء العميل إلى الخادم . IETF . القسم 5.3. doi : 10.17487/RFC6455 . RFC 6455 . 
  58. frame-opcode . IETF . ص 31. doi : 10.17487/RFC6455 . RFC 6455 . 
  59. رمز العملية . IETF . ص 29. doi : 10.17487/RFC6455 . RFC 6455 . 
  60. 1 2 قابلية التوسع . IETF . القسم 5.8. doi : 10.17487/RFC6455 . RFC 6455 . 
  61. إطارات التحكم . IETF . القسم 5.5. doi : 10.17487/RFC6455 . RFC 6455 . 
  62. بدء عملية المصافحة لإغلاق اتصال WebSocket . IETF . sec. 7.1.3. doi : 10.17487/RFC6455 . RFC 6455 . 
  63. مصافحة الإغلاق . IETF . القسم 1.4. doi : 10.17487/RFC6455 . RFC 6455 . 
  64. إغلاق . IETF . القسم 5.5.1. doi : 10.17487/RFC6455 . RFC 6455 . 
  65. Ping . IETF . sec. 5.5.2. doi : 10.17487/RFC6455 . RFC 6455 . 
  66. بونغ . IETF . القسم 5.5.3. doi : 10.17487/RFC6455 . RFC 6455 . 
  67. "إطارات بينغ وبونغ" . WHATWG WebSockets .
  68. نظرة عامة . IETF . القسم 5.1. doi : 10.17487/RFC6455 . RFC 6455 . 
  69. نطاقات رموز الحالة المحجوزة . IETF . القسم 7.4.2. doi : 10.17487/RFC6455 . RFC 6455 . 
  70. رموز الحالة المحددة . IETF . القسم 7.4.1. doi : 10.17487/RFC6455 . RFC 6455 . 
  71. ملحقات الضغط لبروتوكول WebSocket . IETF . doi : 10.17487/RFC7692 . RFC 7692 .
  72. ديركجان أوشتمان (27 مايو 2011). "تفعيل WebSocket في فايرفوكس 6" . Mozilla.org . مؤرشف من الأصل بتاريخ 26 مايو 2012. تم الاطلاع عليه بتاريخ 30 يونيو 2011 .
  73. "حالة منصة كروميوم للويب" . مؤرشف من الأصل بتاريخ 2017-03-04 . تم الاطلاع عليه بتاريخ 2011-08-03 .
  74. "WebSockets (Windows)" . مايكروسوفت. 28-09-2012. مؤرشف من الأصل في 25-03-2015 . تم الاطلاع عليه في 07-11-2012 .
  75. "تقرير اختبار بروتوكول WebSockets" . Tavendo.de. 27-10-2011. مؤرشف من الأصل بتاريخ 22-09-2016 . تم الاطلاع عليه بتاريخ 10-12-2011 .
  76. كاتي مارسال (23 نوفمبر 2010). "أبل تُضيف دعمًا لمقياس التسارع وتقنية WebSockets إلى متصفح سفاري في نظام iOS 4.2" . AppleInsider.com . مؤرشف من الأصل بتاريخ 1 مارس 2011. تم الاطلاع عليه بتاريخ 9 مايو 2011 .
  77. "واجهة برمجة تطبيقات Web Sockets" . بلاك بيري . مؤرشف من الأصل في 10 يونيو 2011. تم الاطلاع عليه في 8 يوليو 2011 .
  78. كريس هيلمان (8 ديسمبر 2010). "تعطيل WebSocket في فايرفوكس 4" . Hacks.Mozilla.org . مؤرشف من الأصل بتاريخ 6 مارس 2017. تم الاطلاع عليه بتاريخ 9 مايو 2011 .
  79. ألكسندر آس (10 ديسمبر 2010). "بخصوص WebSocket" . مدونتي عن أوبرا . مؤرشف من الأصل بتاريخ 15 ديسمبر 2010. تم الاطلاع عليه بتاريخ 9 مايو 2011 .
  80. وانغ، فانيسا؛ سليم، فرانك؛ موسكوفيتس، بيتر (فبراير 2013). "الملحق أ: فحص إطار WebSocket باستخدام أدوات مطوري Google Chrome" . الدليل الشامل لـ HTML5 WebSocket . Apress. ISBN 978-1-4302-4740-1أُرشف من الأصل في 31 ديسمبر 2015. تم الاطلاع عليه في 7 أبريل 2013 .
  81. "دعم WebSockets في Firefox" . developer.mozilla.org . مؤسسة موزيلا. 30 سبتمبر 2011. مؤرشف من الأصل في 26 مايو 2012. تم الاطلاع عليه في 10 ديسمبر 2011 .
  82. "الخطأ رقم 640003 - WebSockets - الترقية إلى ietf-06" . مؤسسة موزيلا. 8 مارس 2011. مؤرشف من الأصل في 1 أبريل 2021. تم الاطلاع عليه في 10 ديسمبر 2011 .
  83. "WebSockets - MDN" . developer.mozilla.org . مؤسسة موزيلا. 30 سبتمبر 2011. مؤرشف من الأصل في 26 مايو 2012. تم الاطلاع عليه في 10 ديسمبر 2011 .
  84. "الخطأ رقم 640003 - WebSockets - الترقية إلى ietf-07 (التعليق 91)" . مؤسسة موزيلا. 22 يوليو 2011. مؤرشف من الأصل في 1 أبريل 2021. تم الاطلاع عليه في 28 يوليو 2011 .
  85. "خطأ كروميوم رقم 64470" . code.google.com . 25-11-2010. مؤرشف من الأصل بتاريخ 31-12-2015 . تم الاطلاع عليه بتاريخ 10-12-2011 .
  86. "تقنية WebSockets في معاينة ويندوز للمستخدمين" . فريق هندسة إنترنت إكسبلورر . مايكروسوفت. ١٩ مارس ٢٠١٢. مؤرشف من الأصل في ٦ سبتمبر ٢٠١٥. تم الاطلاع عليه في ٢٣ يوليو ٢٠١٢ .
  87. "مجموعة تغييرات WebKit رقم 97247: WebSocket: تحديث بروتوكول WebSocket إلى hybi-17" . trac.webkit.org . مؤرشف من الأصل بتاريخ 2012-01-05 . تم الاطلاع عليه بتاريخ 2011-12-10 .
  88. "لمحة صيفية مميزة عن أوبرا 12.50" . أخبار مطوري أوبرا. 3 أغسطس 2012. مؤرشف من الأصل في 5 أغسطس 2012. تم الاطلاع عليه في 3 أغسطس 2012 .
  89. "مرحباً بكم في nginx!" . nginx.org . مؤرشف من الأصل بتاريخ 17 يوليو 2012. تم الاطلاع عليه بتاريخ 3 فبراير 2022 .
  90. "استخدام NGINX كوكيل WebSocket" . NGINX . 17 مايو 2014. مؤرشف من الأصل في 6 أكتوبر 2019. تم الاطلاع عليه في 3 نوفمبر 2019 .
  91. "نظرة عامة على الميزات الجديدة في خادم Apache HTTP 2.4" . Apache . مؤرشف من الأصل بتاريخ 11 نوفمبر 2020. تم الاطلاع عليه بتاريخ 26 يناير 2021 .
  92. "سجل تغييرات أباتشي 2.4" . أباتشي لاونج . مؤرشف من الأصل بتاريخ 22 يناير 2021. تم الاطلاع عليه بتاريخ 26 يناير 2021 .
  93. "دعم بروتوكول WebSocket في IIS 8.0" . وثائق مايكروسوفت . 28 نوفمبر 2012. مؤرشف من الأصل في 18 فبراير 2020. تم الاطلاع عليه في 18 فبراير 2020 .
  94. "الإصدار 1 4 46 - Lighttpd - مختبرات لايتي" . مؤرشف من الأصل بتاريخ 16 يناير 2021. تم الاطلاع عليه بتاريخ 29 ديسمبر 2020 .
  95. "الإصدار 1 4 65 - Lighttpd - مختبرات لايتي" . مؤرشف من الأصل بتاريخ 2024-05-03 . تم الاطلاع عليه بتاريخ 2024-05-03 .
  96. "دعم WebSockets في ASP.NET Core" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 2 مايو 2025 .
  97. كريستيان شنايدر (31 أغسطس 2013). "اختطاف WebSocket عبر المواقع (CSWSH)" . مدونة أمن تطبيقات الويب . مؤرشف من الأصل في 31 ديسمبر 2016. تم الاطلاع عليه في 30 ديسمبر 2015 .
  98. بيتر لوبيرز (16 مارس 2010). "كيف تتفاعل تقنية HTML5 Web Sockets مع خوادم البروكسي" . Infoq.com . C4Media Inc. مؤرشف من الأصل بتاريخ 8 مايو 2016. تم الاطلاع عليه بتاريخ 10 ديسمبر 2011 .
  99. ويلي تارو (2010-07-06). "WebSocket -76 غير متوافق مع وكلاء HTTP العكسيين" . ietf.org (بريد إلكتروني). فريق عمل هندسة الإنترنت. مؤرشف من الأصل في 2016-09-17 . تم الاسترجاع في 2011-12-10 .
  100. إيان فيت (13 يونيو 2011). "مفتاح WebSocket الآمن" . بروتوكول WebSocket، مسودة hybi-09 . IETF . sec. 11.4 . تم الاطلاع عليه في 15 يونيو 2011 . أُرشف في 1 فبراير 2016، على موقع Wayback Machine