موقف من الحياة اليومية#

بتحمّل ملف كبير، والنت فصل ثانيتين ورجع. الملف كمّل التحميل عادي، ولما فتحته لقيته كامل: مفيش ولا صفحة ناقصة، ولا حرف في غير مكانه.

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

خلاصة سريعة#

  • الـ TCP (Transmission Control Protocol) · بروتوكول التحكم في النقلبروتوكول في طبقة النقل يقدم للبرامج خدمة نقل موثوقة ومرتبة لسيل متصل من البايتات، عبر اتصال يُنشأ بين الطرفين.عرض في القاموس بروتوكول في طبقة النقل (الطبقة 4)، بيوصّل البيانات بين البرامج بشكل موثوق وبالترتيب، كأنها سيل متصل من البايتات.
  • قبل ما يبعت أي بيانات، بيفتح اتصال بين الطرفين بـ Three-Way Handshake · المصافحة الثلاثيةالخطوات الثلاث التي ينشئ بها بروتوكول TCP الاتصال: SYN، ثم SYN-ACK، ثم ACK.عرض في القاموس: SYN ثم SYN-ACK ثم ACK.
  • بيرقّم البيانات بـ Sequence Number · رقم التسلسلرقم في كل مقطع TCP يحدد مكان بياناته في السيل، وبه يكتشف المستقبل البيانات المفقودة ويرتبها.عرض في القاموس علشان يكتشف اللي ضاع ويبعته تاني، وبيستخدم النافذة (Window) علشان ما يبعتش للطرف التاني أكتر من طاقته.

ببساطة#

فكّر في مكالمة تليفون مهمة:

  1. إنت: «ألو، سامعني؟»
  2. صاحبك: «أيوه سامعك. وإنت سامعني؟»
  3. إنت: «أيوه، سامعك.»

بعد الخطوات التلاتة دي بس بتبدأ تتكلم في الموضوع. ولو كلمة ما وصلتش، صاحبك يقولك «معلش، الجملة الأخيرة ما سمعتهاش»، فتعيدها. ولو بتتكلم بسرعة، يقولك «براحة شوية». وده بالظبط اللي TCP بيعمله مع البيانات.

المصافحة الثلاثية: جهازك بيبدأ، والسيرفر بيرد ويوافق، وجهازك يأكد. وبعدها بس البيانات تبدأ تتبعت.

بالتفصيل#

TCP بيعمل إيه بالظبط؟#

الـ TCP بيقدّم للبرامج خدمة نقل فيها 3 صفات:

  • موثوقة: البيانات بتوصل كلها، ولو حاجة ضاعت بتتبعت تاني.
  • مرتبة: البيانات بتوصل بنفس الترتيب اللي اتبعتت بيه، حتى لو الحتت وصلت ملخبطة.
  • سيل متصل من البايتات: البرنامج بيكتب بياناته كأنها مجرى واحد، وTCP هو اللي بيقسّمها ويجمعها.

وكل حتة من البيانات في TCP اسمها Segment · المقطعوحدة البيانات في بروتوكول TCP، ويُرسل كل مقطع داخل حزمة IP.عرض في القاموس (مقطع)، وكل مقطع بيتبعت جوه Packet · الحزمةقطعة صغيرة من البيانات. تُقسَّم الرسالة أو الملف إلى حزم، وتنتقل كل حزمة عبر الشبكة من جهاز إلى الذي يليه حتى تصل إلى وجهتها.عرض في القاموس (حزمة) IP. يعني IP بيوصّل الحزمة من جهاز لجهاز، وTCP بيتأكد إن البيانات كلها وصلت للبرنامج الصح. ولو محتاج تراجع الطبقات، شوف مقال نموذج OSI.

وTCP بيفتح اتصال بين الطرفين قبل ما يبعت، والاتصال ده في الاتجاهين: الطرفين يقدروا يبعتوا ويستقبلوا.

المنافذ: البيانات رايحة لأنهي برنامج؟#

جهازك ممكن يكون فاتح المتصفح، والإيميل، وتطبيق شات، في نفس الوقت، والكل بيستخدم نفس عنوان IP. فإزاي البيانات بتعرف رايحة لأنهي برنامج؟

علشان كده كل مقطع TCP فيه Port · المنفذرقم طوله 16 بت يحدد به بروتوكول النقل البرنامج أو الخدمة المقصودة على الجهاز.عرض في القاموس (منفذ) للمصدر وPort للوجهة، وكل واحد منهم رقم طوله 16 بت. ومثلًا مواقع الويب الآمنة (HTTPS) بتستخدم المنفذ 443. والمنافذ ليها مقال كامل في المجال ده.

المصافحة الثلاثية: فتح الاتصال#

قبل أي بيانات، الطرفين لازم يتفقوا على أرقام البداية. وده بيحصل في 3 خطوات:

  1. SYN: جهازك بيبعت مقطع فيه علامة SYN، ومعناها «خلّينا نتفق على الأرقام»، ومعاه رقم البداية بتاعه، مثلًا SEQ=100.
  2. SYN-ACK: السيرفر بيرد بمقطع فيه SYN ورقم البداية بتاعه هو، مثلًا SEQ=300، ومعاه ACK يأكد بيه إنه استلم، ACK=101. يعني «استلمت اللي قبل 101، ومستني 101».
  3. ACK: جهازك بيأكد إنه استلم رد السيرفر: ACK=301.

بعدها الاتصال بيبقى جاهز (ESTABLISHED)، والبيانات تبدأ تتبعت.

أرقام التسلسل والتأكيد: محدش بيضيع#

كل مقطع فيه Sequence Number · رقم التسلسلرقم في كل مقطع TCP يحدد مكان بياناته في السيل، وبه يكتشف المستقبل البيانات المفقودة ويرتبها.عرض في القاموس (رقم تسلسل) طوله 32 بت، بيقول مكان بياناته في السيل. ولما الطرف التاني يستلم، بيبعت ACK فيه رقم البايت اللي جاي اللي مستنيه.

وبالأرقام دي TCP بيعمل حاجتين:

  • يرتّب: لو مقطع وصل قبل اللي قبله، المستقبل بيعرف مكانه من رقمه.
  • يكتشف الضايع: لو مقطع ما وصلش، الـ ACK مش هيأكده.

وكمان كل مقطع فيه Checksum (رقم فحص) طوله 16 بت، بيكتشف لو البيانات اتغيّرت أو باظت في السكة.

إعادة الإرسال: لو حاجة ضاعت#

لو جهاز بعت مقطع، وما وصلهوش تأكيد في الوقت المتوقع، بيبعته تاني. والوقت ده مش ثابت: TCP بيحسبه على حسب سرعة الشبكة اللي بيتعامل معاها، لأن الشبكات مختلفة جدًا: فيه شبكة بترد في جزء من الثانية، وفيه شبكة أبطأ بكتير.

وده اللي حصل في الموقف اللي في أول المقال: النت فصل، المقاطع اللي في السكة ضاعت، فـ TCP بعتها تاني لما النت رجع.

النافذة: براحة شوية#

كل مقطع فيه حقل اسمه Window (النافذة)، طوله 16 بت. وفيه الطرف بيقول للتاني: «أنا أقدر أستقبل قد كده بايت دلوقتي». والطرف التاني ما يبعتش أكتر من كده.

وده اسمه Flow Control (Window) · التحكم في التدفق (النافذة)إعلان المستقبل في كل مقطع عن كمية البيانات التي يستطيع استقبالها الآن، حتى لا يرسل له الطرف الآخر أكثر من طاقته.عرض في القاموس (التحكم في التدفق)، وفايدته إن جهاز سريع ما يغرّقش جهاز أبطأ منه ببيانات أكتر من اللي يقدر يعالجها.

قفل الاتصال#

لما طرف يخلص، بيبعت مقطع فيه علامة FIN، ومعناها «مفيش بيانات تانية مني». والطرف التاني يأكد، ولما يخلص هو كمان يبعت FIN. ولأن الاتصال في الاتجاهين، كل اتجاه بيتقفل لوحده.

أعلام TCP (Flags)#

كل مقطع فيه أعلام، وكل علم بت واحد بيقول معلومة. والأعلام المستخدمة دلوقتي 8:

العلممعناه
SYNمزامنة أرقام التسلسل، يعني بداية اتصال
ACKفيه رقم تأكيد
FINمفيش بيانات تانية من المرسل
RSTقطع الاتصال فورًا (Reset)
PSHادفع البيانات للبرنامج على طول (Push)
URGفيه بيانات عاجلة
ECE وCWRللتعامل مع زحمة الشبكة

جرّب بنفسك: شوف اتصالات TCP المفتوحة#

على Linux:

  1. افتح الطرفية، واكتب:
نافذة الطرفية
ss -tn
  1. النتيجة المتوقعة: قائمة باتصالات TCP المفتوحة دلوقتي. مثلًا (بعناوين أمثلة):
الناتج المتوقع
State Recv-Q Send-Q Local Address:Port   Peer Address:Port
ESTAB 0      0      192.168.1.10:55858   203.0.113.25:443
  • ESTAB: الاتصال جاهز وشغال (ESTABLISHED)، يعني المصافحة خلصت.
  • 192.168.1.10:55858: عنوان جهازك، والمنفذ اللي اختاره جهازك للاتصال ده.
  • 203.0.113.25:443: عنوان السيرفر، والمنفذ 443، يعني موقع ويب آمن (HTTPS).

والخيار -t معناه اتصالات TCP بس، و-n معناه اعرض الأرقام زي ما هي من غير ما تحوّلها لأسماء.

على Windows:

  1. افتح موجّه الأوامر (Command Prompt)، واكتب:
نافذة الطرفية
netstat -n
  1. النتيجة المتوقعة: قائمة باتصالات TCP الشغالة، والعناوين والمنافذ مكتوبة أرقام. وفي عمود State هتلاقي حالة كل اتصال، زي ESTABLISHED.
للمتعمقين

حالات اتصال TCP

الاتصال بيعدّي بحالات، وأشهرها:

الحالةمعناها
LISTENالسيرفر مستني حد يتصل بيه
SYN-SENTجهازك بعت SYN ومستني الرد
SYN-RECEIVEDالسيرفر استلم SYN ورد عليه
ESTABLISHEDالاتصال جاهز والبيانات بتتبعت
FIN-WAIT-1 وFIN-WAIT-2الطرف ده بعت FIN وبيقفل
CLOSE-WAITالطرف التاني قفل، والطرف ده لسه ما قفلش
TIME-WAITاستنى شوية بعد القفل قبل ما الاتصال يتلغي تمامًا

الـ ACK لوحده ما بياخدش رقم

في مثال المصافحة، أول مقطع بيانات بعد الـ ACK الأخير بيبدأ بنفس رقم الـ ACK (SEQ=101)، لأن مقطع الـ ACK لوحده ما بيستهلكش أي رقم من أرقام التسلسل. ولو كان بياخد رقم، كنا هنحتاج نأكد استلام التأكيدات نفسها!

المعيار الرسمي

المعيار الحالي لـ TCP هو RFC 9293، وصدر في أغسطس 2022، وجمع التعديلات اللي اتعملت على مر السنين، وحلّ محل المعيار الأصلي RFC 793.

أخطاء شائعة#

  • «TCP بيضمن إن البيانات توصل مهما حصل»: مش بالظبط. TCP بيكتشف اللي ضاع ويبعته تاني، لكن لو الشبكة انقطعت تمامًا لفترة طويلة، الاتصال نفسه ممكن يقع.
  • «المصافحة الثلاثية بتنقل البيانات»: لأ. المصافحة بتفتح الاتصال وبتتفق على الأرقام، والبيانات بتتبعت بعدها.
  • «ACK يعني إن الجهاز التاني وافق على البيانات»: لأ. ACK معناه «استلمت لحد الرقم ده»، مش موافقة على محتوى البيانات.
  • «عنوان IP كفاية علشان البيانات توصل للبرنامج»: لأ. IP بيوصّل للجهاز، والـ Port هو اللي بيحدد البرنامج.

المصطلحات#

  • بروتوكول التحكم في النقل (TCP (Transmission Control Protocol) · بروتوكول التحكم في النقلبروتوكول في طبقة النقل يقدم للبرامج خدمة نقل موثوقة ومرتبة لسيل متصل من البايتات، عبر اتصال يُنشأ بين الطرفين.عرض في القاموس): بروتوكول نقل موثوق ومرتب يعمل عبر اتصال بين طرفين.
  • المقطع (Segment · المقطعوحدة البيانات في بروتوكول TCP، ويُرسل كل مقطع داخل حزمة IP.عرض في القاموس): وحدة البيانات في TCP، ويُرسل داخل حزمة IP.
  • المصافحة الثلاثية (Three-Way Handshake · المصافحة الثلاثيةالخطوات الثلاث التي ينشئ بها بروتوكول TCP الاتصال: SYN، ثم SYN-ACK، ثم ACK.عرض في القاموس): خطوات فتح اتصال TCP: SYN ثم SYN-ACK ثم ACK.
  • المنفذ (Port · المنفذرقم طوله 16 بت يحدد به بروتوكول النقل البرنامج أو الخدمة المقصودة على الجهاز.عرض في القاموس): رقم يحدد البرنامج أو الخدمة المقصودة على الجهاز.
  • رقم التسلسل (Sequence Number · رقم التسلسلرقم في كل مقطع TCP يحدد مكان بياناته في السيل، وبه يكتشف المستقبل البيانات المفقودة ويرتبها.عرض في القاموس): رقم يحدد مكان بيانات المقطع في السيل.
  • التحكم في التدفق (Flow Control (Window) · التحكم في التدفق (النافذة)إعلان المستقبل في كل مقطع عن كمية البيانات التي يستطيع استقبالها الآن، حتى لا يرسل له الطرف الآخر أكثر من طاقته.عرض في القاموس): إعلان المستقبل عن الكمية التي يستطيع استقبالها.

اختبر نفسك#

جهازك بعت SYN برقم SEQ=500. السيرفر هيرد بـ ACK كام؟

إظهار الإجابة

ACK=501. الـ ACK بيكون رقم البايت اللي جاي اللي الطرف مستنيه، والـ SYN استهلك رقم 500.

مقطع اتبعت، وما وصلش تأكيد استلامه في الوقت المتوقع. TCP هيعمل إيه؟

إظهار الإجابة

هيبعته تاني (إعادة إرسال). والوقت اللي بيستناه TCP بيتحسب على حسب سرعة الشبكة.

في نتيجة الأمر ss -tn لقيت اتصال حالته ESTAB ورايح لمنفذ 443. ده معناه إيه؟

إظهار الإجابة

إن جهازك فاتح اتصال TCP جاهز مع سيرفر على المنفذ 443، يعني غالبًا موقع ويب آمن (HTTPS)، والمصافحة الثلاثية خلصت.