الوحدة 15 – مكافأة: المصافحة TCP وTLS مبسطة
+==============================================================================+
| الوحدة 15 (مكافأة) : المصافحة TCP + TLS (HTTPS) |
| المدة المقدرة: 1 ساعة | المستوى: مبتدئ مطلق |
+==============================================================================+
جدول المحتويات
- لماذا هذه الصفحة؟
- المفردات الأساسية – "الأعلام" TCP
- المصافحة TCP في 3 خطوات (SYN / SYN-ACK / ACK)
- وماذا بعد المصافحة؟ تبادل البيانات (PSH، ACK)
- كيف نغلق الاتصال؟ (FIN / FIN-ACK)
- ملخص كامل لاتصال TCP
- المصافحة TLS – إضافة القفل
- مثال ملموس: فتح https://google.com
- ما تراه في Wireshark
- الملخص النهائي – التشبيه الكامل
لماذا هذه الصفحة؟
عندما تفتح موقع ويب، يتحدث متصفحك والخادم مع بعضهما البعض. ولكن قبل تبادل أي شيء، يجب عليهما:
- التحقق من إمكانية التحدث (المصافحة TCP)
- الاتفاق على كيفية التشفير (المصافحة TLS، إذا كان HTTPS)
- تبادل البيانات (صفحة الويب)
- الإغلاق بشكل صحيح (إغلاق الاتصال)
كل هذه التبادلات تستخدم أعلام صغيرة في حزم الشبكة. هذا ما سنشرحه هنا، كما لو أنك لم تقم بأي شبكة من قبل.
المفردات الأساسية – "الأعلام" TCP
تخيل أن كل رسالة شبكة هي رسالة مرسلة عبر البريد. على كل ظرف، يوجد واحد أو أكثر من الأختام (الأعلام) التي تقول نوع الرسالة.
إليك الأعلام الرئيسية TCP:
| العلم | الاسم الكامل | التشبيه البسيط | المعنى التقني |
|---|---|---|---|
| SYN | Synchronize | 📞 « ألو؟ هل أنت هناك؟ » | « أريد فتح اتصال » |
| ACK | Acknowledge | ✅ « تم الاستلام! » | « لقد استلمت رسالتك » |
| PSH | Push | 📦 « ها هي الطرد، افتحه فوراً! » | « ها هي البيانات، تعامل معها فوراً » |
| FIN | Finish | 👋 « وداعاً، سأغلق » | « أريد إغلاق الاتصال » |
| RST | Reset | ❌ « توقف! مغلق بالقوة! » | « اتصال ملغى / مرفوض بعنف » |
- SYN = « أريد أن أبدأ »
- ACK = « فهمت / تم الاستلام »
- PSH = « ها هي البيانات الحقيقية »
- FIN = « انتهيت، وداعاً »
المصافحة TCP في 3 خطوات (SYN / SYN-ACK / ACK)
تشبيه الهاتف
تخيل أنك تتصل بصديق:
┌─────────────────────────────────────────────────────────────────────┐
│ مكالمة هاتفية │
│ │
│ أنت (العميل) صديقك (الخادم) │
│ │
│ 1. 📞 « ألو؟ هل تسمعني؟ » ──────► │
│ (الهاتف يرن) │
│ │
│ ◄────── 2. 📞 « نعم، أسمعك! │
│ وأنت، هل تسمعني؟ » │
│ │
│ 3. 📞 « نعم تمام، يمكننا التحدث! » ──────► │
│ │
│ ═══════════════════════════════════════════════════════════════ │
│ ✅ تم إنشاء المحادثة — يمكنكم التحدث! │
└─────────────────────────────────────────────────────────────────────┘
نفس الشيء في TCP
┌─────────────────────────────────────────────────────────────────────┐
│ المصافحة TCP (3-WAY HANDSHAKE) │
│ │
│ العميل (جهازك) الخادم (مثال: google.com) │
│ │
│ الخطوة 1: SYN │
│ ──────────────────────────────────────► │
│ « أريد الاتصال. رقم التسلسل الخاص بي هو 100. » │
│ │
│ الخطوة 2: SYN-ACK │
│ ◄────────────────────────────────────── │
│ « حسناً، أقبل (ACK رقم 100 الخاص بك). │
│ رقم التسلسل الخاص بي هو 300. » │
│ │
│ الخطوة 3: ACK │
│ ──────────────────────────────────────► │
│ « تمام، تم الاستلام (ACK رقم 300 الخاص بك). │
│ يمكننا البدء! » │
│ │
│ ═══════════════════════════════════════════════════════════════ │
│ ✅ تم إنشاء اتصال TCP │
│ ❌ لكن لا شيء مشفر في الوقت الحالي! │
└─────────────────────────────────────────────────────────────────────┘
لماذا 3 خطوات وليس 1؟
هذا للتأكد من أن الاتصال يعمل في كلا الاتجاهين:
| الخطوة | يثبت أن... |
|---|---|
| SYN (العميل → الخادم) | يمكن للعميل الإرسال إلى الخادم |
| SYN-ACK (الخادم → العميل) | الخادم استلم ويمكنه الرد |
| ACK (العميل → الخادم) | العميل استلم الرد من الخادم |
بدون هذه الخطوات الثلاث، لن نعرف إذا كانت الآلتان تتفاهمان حقاً.
وماذا بعد المصافحة؟ تبادل البيانات (PSH، ACK)
بمجرد فتح الاتصال، تتدفق البيانات الحقيقية. هنا نرى PSH وACK:
تشبيه تسليم الطرود
┌─────────────────────────────────────────────────────────────────────┐
│ تبادل البيانات (بعد المصافحة) │
│ │
│ العميل (المتصفح) الخادم (الموقع) │
│ │
│ 📦 PSH,ACK : « ها هي طلبي: │
│ أريد الصفحة الرئيسية » ──────────────► │
│ (= طلب HTTP GET /) │
│ │
│ ◄────────────── ✅ ACK : │
│ « تم استلام طلبك » │
│ │
│ ◄────────────── 📦 PSH,ACK : │
│ « ها هي الصفحة HTML! » │
│ (= رد HTTP 200 OK) │
│ │
│ ✅ ACK : « تم استلام الصفحة، │
│ شكراً! » ──────────────► │
│ │
│ ═══════════════════════════════════════════════════════════════ │
│ 📄 تظهر الصفحة في متصفحك! │
└─────────────────────────────────────────────────────────────────────┘
لماذا PSH + ACK معاً؟
سترى غالباً PSH,ACK في Wireshark (العلمان معاً). هذا طبيعي:
| العلم | الدور في هذه الحزمة |
|---|---|
| PSH | « ها هي البيانات، تعامل معها فوراً » |
| ACK | « بالمناسبة، لقد استلمت رسائلك السابقة » |
PSH = « أرسل طرداً »
ACK = « وأعترف باستلام ما أرسلته من قبل »
كلاهما معاً = كفاءة: نقوم بشيئين في حزمة واحدة!
وماذا إذا لم نضع PSH؟
بدون PSH، تصل البيانات ولكن النظام قد ينتظر قبل معالجتها (يضعها في "مخزن"/buffer). مع PSH، يكون الأمر « تعامل مع هذا فوراً! ».
فكر في الفرق بين:
- 📬 وضع رسالة في صندوق البريد (بدون PSH → سيتعامل معها ساعي البريد عندما يريد)
- 🚨 قرع الجرس والقول « إنه عاجل، اقرأ فوراً! » (مع PSH)
كيف نغلق الاتصال؟ (FIN / FIN-ACK)
عندما تنتهي المحادثة، نغلق بشكل صحيح:
┌─────────────────────────────────────────────────────────────────────┐
│ إغلاق الاتصال (4-WAY) │
│ │
│ العميل الخادم │
│ │
│ 👋 FIN,ACK : « انتهيت، │
│ أريد الإغلاق » ──────────────► │
│ │
│ ◄────────────── ✅ ACK : │
│ « حسناً، فهمت » │
│ │
│ ◄────────────── 👋 FIN,ACK : │
│ « أنا أيضاً انتهيت » │
│ │
│ ✅ ACK : « حسناً، وداعاً! » ──────────────► │
│ │
│ ═══════════════════════════════════════════════════════════════ │
│ 🔌 تم إغلاق الاتصال بشكل صحيح │
└─────────────────────────────────────────────────────────────────────┘
وماذا عن RST؟
RST (إعادة تعيين)، هو عندما نغلق بعنف، دون قول وداعاً:
| الحالة | ما يحدث |
|---|---|
| المنفذ مغلق على الخادم | الخادم يرد بـ RST → « هذه الخدمة غير موجودة! » |
| الجدار الناري يمنع الاتصال | إما RST، أو لا يوجد رد على الإطلاق (انتهاء المهلة) |
| التطبيق يتعطل | النظام يرسل RST لقطع الاتصال |
FIN = إغلاق بأدب 👋
RST = إغلاق الهاتف في وجهك ❌
ملخص كامل لاتصال TCP
إليك دورة الحياة الكاملة لاتصال TCP، من البداية إلى النهاية:
┌─────────────────────────────────────────────────────────────────────┐
│ دورة الحياة الكاملة لاتصال TCP │
│ │
│ ╔═══════════════════════════════════════════════════════════╗ │
│ ║ المرحلة 1: الفتح (3-way handshake) ║ │
│ ║ ║ │
│ ║ العميل ──── SYN ────────► الخادم ║ │
│ ║ العميل ◄─── SYN,ACK ──── الخادم ║ │
│ ║ العميل ──── ACK ────────► الخادم ║ │
│ ╚═══════════════════════════════════════════════════════════╝ │
│ │ │
│ ▼ │
│ ╔═══════════════════════════════════════════════════════════╗ │
│ ║ المرحلة 2: تبادل البيانات ║ │
│ ║ ║ │
│ ║ العميل ──── PSH,ACK ───► الخادم (طلب) ║ │
│ ║ العميل ◄─── ACK ──────── الخادم (إقرار استلام) ║ │
│ ║ العميل ◄─── PSH,ACK ──── الخادم (رد) ║ │
│ ║ العميل ──── ACK ────────► الخادم (إقرار استلام) ║ │
│ ╚═══════════════════════════════════════════════════════════╝ │
│ │ │
│ ▼ │
│ ╔═══════════════════════════════════════════════════════════╗ │
│ ║ المرحلة 3: الإغلاق (4-way) ║ │
│ ║ ║ │
│ ║ العميل ──── FIN,ACK ───► الخادم ║ │
│ ║ العميل ◄─── ACK ──────── الخادم ║ │
│ ║ العميل ◄─── FIN,ACK ──── الخادم ║ │
│ ║ العميل ──── ACK ────────► الخادم ║ │
│ ╚═══════════════════════════════════════════════════════════╝ │
│ │
│ 🏁 النهاية — تم إنهاء الاتصال بشكل صحيح │
└─────────────────────────────────────────────────────────────────────┘
المصافحة TLS – إضافة القفل
متى يتدخل TLS؟
TLS يأتي بين المصافحة TCP والبيانات:
الخطوة 1: المصافحة TCP → « نفتح الباب »
الخطوة 2: المصافحة TLS → « نضع القفل + نتحقق من الهوية »
الخطوة 3: البيانات المشفرة → « نتحدث، لكن لا أحد يمكنه الاستماع »
تشبيه البنك
تخيل أنك تريد إرسال رسالة سرية إلى البنك الخاص بك:
┌─────────────────────────────────────────────────────────────────────┐
│ المصافحة TLS (مبسطة) │
│ │
│ أنت (العميل) البنك (الخادم) │
│ │
│ الخطوة 1 — ClientHello │
│ ──────────────────────────────────────► │
│ « مرحباً! أود التواصل بسرية. │
│ ها هي طرق التشفير التي أعرفها: │
│ AES-256، ChaCha20، إلخ. » │
│ │
│ الخطوة 2 — ServerHello + شهادة │
│ ◄────────────────────────────────────── │
│ « حسناً! سنستخدم AES-256. │
│ وهذه هي بطاقتي الشخصية (الشهادة): │
│ - أنا بالفعل "البنك الوطني" │
│ - موقعة من سلطة موثوقة (Let's Encrypt، إلخ.) │
│ - صالحة حتى 2026-12-31 » │
│ │
│ الخطوة 3 — التحقق (جانب العميل) │
│ 🔍 تتحقق من البطاقة الشخصية: │
│ ✅ هل الاسم يطابق الموقع؟ │
│ ✅ موقعة من سلطة معترف بها؟ │
│ ✅ غير منتهية الصلاحية؟ │
│ → إذا كان كل شيء على ما يرام، نواصل. وإلا = خطأ في الشهادة. │
│ │
│ الخطوة 4 — تبادل المفاتيح │
│ ──────────────────────────────────────► │
│ 🔐 يتفق العميل والخادم على سر مشترك (دون إرساله أبداً بشكل واضح!) │
│ الطريقة: Diffie-Hellman أو ما شابه. │
│ │
│ تشبيه: تخيل أنك تخلط كل واحد لون طلاء في السر. تتبادلون │
│ النتيجة، وتصلون جميعاً إلى نفس اللون النهائي، لكن من يراقب │
│ لا يمكنه تخمينه. │
│ │
│ الخطوة 5 — Finished │
│ ◄─────────── (من الجانبين) ──────────► │
│ « لدينا نفس المفاتيح السرية. │
│ من الآن فصاعداً، كل شيء مشفر! » │
│ │
│ ═══════════════════════════════════════════════════════════════ │
│ 🔒 تم إنشاء نفق TLS — كل الاتصالات مشفرة! │
└─────────────────────────────────────────────────────────────────────┘
الأسئلة الشائعة
هي البطاقة الشخصية الرقمية للخادم. تحتوي على:
- اسم الموقع (مثال:
google.com) - المفتاح العام للخادم
- توقيع سلطة الشهادة (مثال: Let's Encrypt، DigiCert)
- تاريخ الانتهاء
يتحقق متصفحك من كل هذا تلقائياً. إذا كان هناك شيء غير صحيح → 🔴 « اتصالك ليس خاصاً ».
هي طريقة رياضية لكي يتفق شخصان على سر مشترك، حتى لو كان هناك من يستمع إلى جميع رسائلهما.
تشبيه ألوان الطلاء:
أنت: اختر سراً اللون الأزرق 🔵
البنك: اختر سراً اللون الأحمر 🔴
اللون الأساسي العام: الأصفر 🟡
أنت: تخلط الأصفر + الأزرق = الأخضر 🟢 → ترسل الأخضر
البنك: يخلط الأصفر + الأحمر = البرتقالي 🟠 → يرسل البرتقالي
أنت: تستلم البرتقالي + الأزرق السري = البني 🟤
البنك: يستلم الأخضر + الأحمر السري = البني 🟤
✅ لديكم نفس اللون النهائي (البني)!
❌ الجاسوس يرى فقط الأخضر والبرتقالي... لا يمكنه معرفة البني!
في الواقع، ليست ألواناً بل أرقام رياضية كبيرة، لكن المبدأ هو نفسه.
مثال ملموس: فتح https://google.com
إليك ما يحدث فعلياً عندما تكتب https://google.com في متصفحك:
┌─────────────────────────────────────────────────────────────────────┐
│ جهازك (192.168.1.50) جوجل (142.250.80.46) │
│ │
│ ── الخطوة 1: حل DNS ─────────────────────────────────────── │
│ « ما هو IP google.com؟ » │
│ → رد DNS: 142.250.80.46 │
│ │
│ ── الخطوة 2: المصافحة TCP ─────────────────────────────────── │
│ الحزمة 1: [SYN] 192.168.1.50:54321 → 142.250.80.46:443 │
│ الحزمة 2: [SYN,ACK] 142.250.80.46:443 → 192.168.1.50:54321 │
│ الحزمة 3: [ACK] 192.168.1.50:54321 → 142.250.80.46:443 │
│ ✅ تم إنشاء اتصال TCP على المنفذ 443 (HTTPS) │
│ │
│ ── الخطوة 3: المصافحة TLS ─────────────────────────────────── │
│ الحزمة 4: ClientHello → إصدارات TLS، الخوارزميات المقترحة │
│ الحزمة 5: ServerHello ← الخوارزمية المختارة │
│ الحزمة 6: Certificate ← شهادة google.com │
│ الحزمة 7: Key Exchange ↔ تبادل Diffie-Hellman │
│ الحزمة 8: Finished ↔ التحقق من الجانبين │
│ 🔒 تم إنشاء نفق TLS — كل شيء مشفر الآن │
│ │
│ ── الخطوة 4: البيانات المشفرة ─────────────────────────────── │
│ الحزمة 9: [PSH,ACK] (مشفر) → GET / HTTP/1.1 │
│ (طلبك للصفحة الرئيسية) │
│ الحزمة 10: [ACK] ← إقرار استلام │
│ الحزمة 11: [PSH,ACK] (مشفر) ← HTTP/1.1 200 OK + صفحة HTML │
│ (الصفحة الرئيسية لجوجل) │
│ الحزمة 12: [ACK] → إقرار استلام │
│ 📄 تظهر صفحة جوجل في متصفحك! │
│ │
│ ── الخطوة 5: الإغلاق ─────────────────────────────────────── │
│ الحزمة 13: [FIN,ACK] → « انتهيت » │
│ الحزمة 14: [FIN,ACK] ← « أنا أيضاً » │
│ الحزمة 15: [ACK] → « حسناً، وداعاً » │
│ 🔌 تم إغلاق الاتصال │
└─────────────────────────────────────────────────────────────────────┘
- المنفذ 80 = HTTP (غير مشفر) → لا يوجد مصافحة TLS
- المنفذ 443 = HTTPS (مشفر) → مصافحة TLS إلزامية
لهذا السبب تستخدم URL https:// دائماً المنفذ 443 افتراضياً.
ما تراه في Wireshark
التقاط HTTP (المنفذ 80) – غير مشفر
┌──────┬────────────────────┬────────────────────┬──────────┬──────────────────────┐
│ No │ المصدر │ الوجهة │ البروتوكول │ المعلومات │
├──────┼────────────────────┼────────────────────┼──────────┼──────────────────────┤
│ 1 │ 192.168.1.50 │ 93.184.216.34 │ TCP │ SYN │
│ 2 │ 93.184.216.34 │ 192.168.1.50 │ TCP │ SYN, ACK │
│ 3 │ 192.168.1.50 │ 93.184.216.34 │ TCP │ ACK │
│ 4 │ 192.168.1.50 │ 93.184.216.34 │ HTTP │ GET / HTTP/1.1 ⚠️ │
│ 5 │ 93.184.216.34 │ 192.168.1.50 │ TCP │ ACK │
│ 6 │ 93.184.216.34 │ 192.168.1.50 │ HTTP │ 200 OK ⚠️ │
└──────┴────────────────────┴────────────────────┴──────────┴──────────────────────┘
⚠️ نرى كل شيء بوضوح! الطلب، الرد، محتوى الصفحة...
يمكن لأي شخص على الشبكة قراءة هذه البيانات!
التقاط HTTPS (المنفذ 443) – مشفر
┌──────┬────────────────────┬────────────────────┬──────────┬──────────────────────┐
│ No │ المصدر │ الوجهة │ البروتوكول │ المعلومات │
├──────┼────────────────────┼────────────────────┼──────────┼──────────────────────┤
│ 1 │ 192.168.1.50 │ 142.250.80.46 │ TCP │ SYN │
│ 2 │ 142.250.80.46 │ 192.168.1.50 │ TCP │ SYN, ACK │
│ 3 │ 192.168.1.50 │ 142.250.80.46 │ TCP │ ACK │
│ 4 │ 192.168.1.50 │ 142.250.80.46 │ TLSv1.3 │ Client Hello │
│ 5 │ 142.250.80.46 │ 192.168.1.50 │ TLSv1.3 │ Server Hello │
│ 6 │ 142.250.80.46 │ 192.168.1.50 │ TLSv1.3 │ Certificate │
│ 7 │ 192.168.1.50 │ 142.250.80.46 │ TLSv1.3 │ Key Exchange │
│ 8 │ ... │ ... │ TLSv1.3 │ Finished │
│ 9 │ 192.168.1.50 │ 142.250.80.46 │ TLSv1.3 │ Application Data 🔒 │
│ 10 │ 142.250.80.46 │ 192.168.1.50 │ TLSv1.3 │ Application Data 🔒 │
└──────┴────────────────────┴────────────────────┴──────────┴──────────────────────┘
🔒 "Application Data" = بيانات مشفرة. لا يمكننا قراءة المحتوى!
نرى فقط أن هناك حركة مرور، لكن ليس ما يتم تبادله.
حتى مع HTTPS، يمكن للمهاجم على الشبكة رؤية:
- عنوان IP للخادم (مثال: 142.250.80.46)
- اسم الموقع (عبر حقل SNI في ClientHello، مثال:
google.com) - كمية البيانات المتبادلة
- وقت الاتصال
لكن لا يمكنه رؤية:
- ❌ عنوان URL الكامل (مثال:
/search?q=mon+secret) - ❌ محتوى الصفحة
- ❌ الكوكيز، كلمات المرور، النماذج
- ❌ البيانات المرسلة في كلا الاتجاهين
الملخص النهائي – التشبيه الكامل
HTTP مقابل HTTPS في صورة واحدة
┌─────────────────────────────────────────────────────────────────────┐
│ │
│ HTTP (المنفذ 80) HTTPS (المنفذ 443) │
│ │
│ 📞 المصافحة TCP 📞 المصافحة TCP │
│ (SYN → SYN,ACK → ACK) (SYN → SYN,ACK → ACK) │
│ │ │ │
│ │ 🔒 المصافحة TLS │
│ │ (ClientHello → Certificate → Keys) │
│ │ │ │
│ ▼ ▼ │
│ 📦 بيانات بوضوح 📦 بيانات مشفرة │
│ (يمكن للجميع قراءتها) (لا يمكن لأحد قراءتها) │
│ │ │ │
│ 👋 إغلاق TCP 👋 إغلاق TCP │
│ (FIN → ACK) (FIN → ACK) │
│ │
│ 🔴 خطير! 🟢 آمن! │
└─────────────────────────────────────────────────────────────────────┘
مذكرة الأعلام TCP
┌──────────────────────────────────────────────────────────────────┐
│ مذكرة الأعلام TCP │
│ │
│ SYN = 📞 « أريد فتح اتصال » │
│ ACK = ✅ « تم الاستلام! » │
│ PSH = 📦 « ها هي البيانات، تعامل معها فوراً » │
│ FIN = 👋 « انتهيت، وداعاً » │
│ RST = ❌ « مغلق بالقوة! » │
│ │
│ SYN,ACK = 📞✅ « أقبل اتصالك + تم الاستلام » │
│ PSH,ACK = 📦✅ « ها هي البيانات + استلمت بياناتك » │
│ FIN,ACK = 👋✅ « أغلق + استلمت رسائلك الأخيرة » │
└──────────────────────────────────────────────────────────────────┘
الملخص في 5 جمل
- TCP يفتح الاتصال بـ SYN / SYN-ACK / ACK (3-way handshake)
- TLS يؤمن الاتصال بـ شهادة + تبادل مفاتيح (المصافحة TLS)
- PSH,ACK يرسل البيانات الحقيقية (طلبات HTTP، صفحات الويب، إلخ.)
- FIN,ACK يغلق الاتصال بشكل صحيح
- ACK يرافق تقريباً كل شيء: هو مجرد « تم الاستلام » الذي يسمح بعدم فقدان أي شيء
تم إنشاء مكافأة TP في: فبراير 2026