مشكلة HTTP التقليدي
HTTP قائم على طلب/ردّ: العميل يطلب، الخادم يردّ، وينتهي الاتصال. لتطبيق يحتاج تحديثات لحظية (دردشة، إشعارات، أسعار أسهم)، الحل التقليدي هو الاستقصاء المتكرّر (Polling) — يسأل المتصفّح الخادم كل ثوانٍ "هل يوجد جديد؟"، وهذا مضيعة لموارد الشبكة والخادم لو لم يوجد جديد فعلًا.
ما هو WebSocket؟
بروتوكول يفتح اتصالًا واحدًا دائمًا وثنائي الاتجاه بين المتصفّح والخادم — كلاهما يرسل رسائل في أي وقت دون طلب/ردّ متكرّر، وبتكلفة أقلّ بكثير من فتح طلب HTTP جديد لكل رسالة.
const socket = new WebSocket("wss://example.com/chat");
socket.onopen = () => socket.send("مرحبًا من العميل");
socket.onmessage = (event) => console.log("وصل:", event.data);
socket.onclose = () => console.log("انقطع الاتصال");
المصافحة (Handshake): يبدأ كطلب HTTP عادي
WebSocket لا يبدأ من الصفر — يبدأ بطلب GET عادي يطلب من الخادم "ترقية" الاتصال:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
لو وافق الخادم، يردّ بحالة 101 Switching Protocols ويحسب قيمة Sec-WebSocket-Accept من Sec-WebSocket-Key (بخوارزمية ثابتة)، ليؤكّد للعميل أنه فهم الطلب فعلًا وليس خادمًا عاديًّا لا يدعم WebSocket. بعدها يتحوّل نفس الاتصال إلى قناة WebSocket مفتوحة — لا يُفتح اتصال جديد.
ws مقابل wss
مثل HTTP و HTTPS تمامًا:
ws:// | wss:// | |
|---|---|---|
| التشفير | لا | نعم (فوق TLS) |
| الاستخدام | تجارب محلّية فقط | الإنتاج دائمًا |
متى تستخدم WebSocket؟
| الحالة | الأنسب |
|---|---|
| تحديثات لحظية متكرّرة (دردشة، ألعاب، أسعار) | WebSocket |
| بيانات تتغيّر نادرًا (كل دقائق) | Polling عادي كافٍ |
| بيانات تتدفّق من الخادم فقط باتجاه واحد | بدائل أبسط مثل Server-Sent Events |
| طلب واحد عادي (تسجيل دخول، جلب صفحة) | HTTP التقليدي |
💡 لا تفتح اتصال WebSocket إلا عند الحاجة الفعلية — يبقى مفتوحًا ويستهلك موردًا على الخادم طوال حياة الصفحة، فأغلقه (
socket.close()) عند مغادرة المستخدم للصفحة أو انتهاء حاجته.
🎯 التالي: أفضل ممارسات الشبكات.