بسم الله الرحمن الرحيم
في الجزء الأول شرحت كيفية تأسيس القابس الخام "Raw Socket" , و الأن سنبدأ في التعامل مع البيانات المستقبلة من القابس .
في حالة القابس الخام يترك للمبرمج التعامل مع برتوكولات الشبكة , و التعامل مع بنية الحزم لكل برتوكول , وسنبدأ بالبرتوكول IP .
قائمة مكونات حزمة برتوكول IP (الإصدارة الرابعة ) بالترتيب الموجود على الصورة :
- version : إصدارة برتوكول IP بطول 4 بت (4 bits)
- Headers len : طول بيانات برتوكول IP بوحدة word ( تساوي 32 بت ) بطول 4 بت .
- Type of service : يستخدم هذا الحقل لإعطاء التعليمات للموجهات على الشبكة (Router) .
- Total length : طول حزمة IP يشمل البيانات المرسلة بوحدة البايت (bytes) بطول 16 بت .
- identification : يستخدم هذا الحقل في حالة تقسيم البيانات كقيمة دليلة على أن الحزم تنمي لنفس مجموعة البيانات المقسمة بطول 16 بت
- Bit flags : تستخدم هذه للدلالة على تقسيم البيانات من عدمه كالتالي :
البت الأول في هذا الحقل يحمل القيمة صفر دائما , البت الثاني يحمل القيمة صفر في حالة تقسيم البيانات على أكثر من حزمة IP و القيمة واحد في حالة عدم التقسيم , البت الأخير يحمل القيمة صفر في حالة كانت الحزمة المرسلة الأخيرة في سلسلة الحزم المقسمة و القيمة الصفر في حالة وجود المزيد من الحزم .
- fragment offset : تحمل هذه القيمة تسلسل الحزمة ( في حالة تقسيم البيانات) في سلسلة البيانات بطول 16 بت .
- Time to live : يحمل هذا الحقل قيمة يتم إنقاصها بمعدل واحد خلال مرورها من موجه (Router) و في حالة وصول القيمة لصفر يتم إنهاء حياة الحزمة و إلغاءها و يبلغ طول هذا الحقل 8 Bits .
- protocol : هذا الحقل يحدد البرتوكول الذي يعمل في الطبقة العليا كمثال (TCP -UDP )
- header checksum : يستخدم هذا المجموع للتأكد من عدم حدوث تغير لقيم البرتوكول أثناء النقل , ويتم أستخدام خورازمية CRC ( في حالة برتوكول IP يكون قيمة التحقق هو مجموع جميع قيم حقول برتوكول IP ).
- Source IP : عنوان الأي بي الخاص بالحاسوب المصدر بطول 32 بت .
- Destination IP: عنوان الأي بي الخاص بالوجهة الحزمة بطول 32 بت .
- Options : هذه الحقول أختيارية ويجب أن يتم الأتفاق عليها بين الوجهة و المصدر ولن أتطرق لها في هذا الموضوع .
- Data : البيانات المرسلة .
الأن بعد أن فهمنا تركيب حزمة برتوكول IP سنعدل مثالنا في الجزء الأول لكي يطبع عنوان الأي بي الخاص بوجهة الحزمة .
عندما ألقنا نظرة على تركيب الحزمة نجد بأن حقل عنوان الوجهة يبدأ على بعد 12 بايت و يتكون من أربع بتات , لذا سنتعامل مع الحزم المستقبلة كمصفوفة حروف ASCII :
import socket
sos=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_TCP)
while 1:
data=sos.recv(1245)
print "%d.%d.%d.%d" %(ord(data[12]),ord(data[13]),ord(data[14]),ord(data[15]))
sos=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_TCP)
while 1:
data=sos.recv(1245)
print "%d.%d.%d.%d" %(ord(data[12]),ord(data[13]),ord(data[14]),ord(data[15]))
قمنا في هذا المثال بأستخدام الوظيفة البرمجية ord التي تحول حروف ASCII إلى أعداد صحيحة :
ord(data[15]
يبدو هذا المثال مفيداُ فقط كمثال توضيحي و لكن لتعامل بشكل أسهل و أكثر أحترافية مع حزم البيانات في الشبكة من الأفضل أستخدام المكتبة البرمجية struct .
توفر هذه المكتبة البرمجية صيغ تمكن من تحويل بين صيغ البيانات بكل سهولة و سوف أتطرق لها في الجزء الثالث ( أن شاء الله ) .
ليست هناك تعليقات:
إرسال تعليق