انتقل إلى المحتوى الرئيسي

الوحدة 15 – مكافأة: المصافحة TCP وTLS مبسطة

+==============================================================================+
| الوحدة 15 (مكافأة) : المصافحة TCP + TLS (HTTPS) |
| المدة المقدرة: 1 ساعة | المستوى: مبتدئ مطلق |
+==============================================================================+

جدول المحتويات​

  1. لماذا هذه الصفحة؟
  2. المفردات الأساسية – "الأعلام" TCP
  3. المصافحة TCP في 3 خطوات (SYN / SYN-ACK / ACK)
  4. وماذا بعد المصافحة؟ تبادل البيانات (PSH، ACK)
  5. كيف نغلق الاتصال؟ (FIN / FIN-ACK)
  6. ملخص كامل لاتصال TCP
  7. المصافحة TLS – إضافة القفل
  8. مثال ملموس: فتح https://google.com
  9. ما تراه في Wireshark
  10. الملخص النهائي – التشبيه الكامل

لماذا هذه الصفحة؟​

عندما تفتح موقع ويب، يتحدث متصفحك والخادم مع بعضهما البعض. ولكن قبل تبادل أي شيء، يجب عليهما:

  1. التحقق من إمكانية التحدث (المصافحة TCP)
  2. الاتفاق على كيفية التشفير (المصافحة TLS، إذا كان HTTPS)
  3. تبادل البيانات (صفحة الويب)
  4. الإغلاق بشكل صحيح (إغلاق الاتصال)

كل هذه التبادلات تستخدم أعلام صغيرة في حزم الشبكة. هذا ما سنشرحه هنا، كما لو أنك لم تقم بأي شبكة من قبل.

العودة إلى جدول المحتويات


المفردات الأساسية – "الأعلام" TCP​

تخيل أن كل رسالة شبكة هي رسالة مرسلة عبر البريد. على كل ظرف، يوجد واحد أو أكثر من الأختام (الأعلام) التي تقول نوع الرسالة.

إليك الأعلام الرئيسية TCP:

العلمالاسم الكاملالتشبيه البسيطالمعنى التقني
SYNSynchronize📞 « ألو؟ هل أنت هناك؟ »« أريد فتح اتصال »
ACKAcknowledge✅ « تم الاستلام! »« لقد استلمت رسالتك »
PSHPush📦 « ها هي الطرد، افتحه فوراً! »« ها هي البيانات، تعامل معها فوراً »
FINFinish👋 « وداعاً، سأغلق »« أريد إغلاق الاتصال »
RSTReset❌ « توقف! مغلق بالقوة! »« اتصال ملغى / مرفوض بعنف »
الأهم أن تتذكر
  • 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)
  • تاريخ الانتهاء

يتحقق متصفحك من كل هذا تلقائياً. إذا كان هناك شيء غير صحيح → 🔴 « اتصالك ليس خاصاً ».

ما هو Diffie-Hellman؟

هي طريقة رياضية لكي يتفق شخصان على سر مشترك، حتى لو كان هناك من يستمع إلى جميع رسائلهما.

تشبيه ألوان الطلاء:

  أنت: اختر سراً اللون الأزرق 🔵
البنك: اختر سراً اللون الأحمر 🔴

اللون الأساسي العام: الأصفر 🟡

أنت: تخلط الأصفر + الأزرق = الأخضر 🟢 → ترسل الأخضر
البنك: يخلط الأصفر + الأحمر = البرتقالي 🟠 → يرسل البرتقالي

أنت: تستلم البرتقالي + الأزرق السري = البني 🟤
البنك: يستلم الأخضر + الأحمر السري = البني 🟤

✅ لديكم نفس اللون النهائي (البني)!
❌ الجاسوس يرى فقط الأخضر والبرتقالي... لا يمكنه معرفة البني!

في الواقع، ليست ألواناً بل أرقام رياضية كبيرة، لكن المبدأ هو نفسه.

العودة إلى جدول المحتويات


مثال ملموس: فتح 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] → « حسناً، وداعاً » │
│ 🔌 تم إغلاق الاتصال │
└─────────────────────────────────────────────────────────────────────┘
المنفذ 443 مقابل المنفذ 80
  • المنفذ 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

حتى مع 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 جمل​

ملخص
  1. TCP يفتح الاتصال بـ SYN / SYN-ACK / ACK (3-way handshake)
  2. TLS يؤمن الاتصال بـ شهادة + تبادل مفاتيح (المصافحة TLS)
  3. PSH,ACK يرسل البيانات الحقيقية (طلبات HTTP، صفحات الويب، إلخ.)
  4. FIN,ACK يغلق الاتصال بشكل صحيح
  5. ACK يرافق تقريباً كل شيء: هو مجرد « تم الاستلام » الذي يسمح بعدم فقدان أي شيء

العودة إلى جدول المحتويات


تم إنشاء مكافأة TP في: فبراير 2026