hi, let Avik connect you.

** You can give your thought about this content and request modifications if needed from Ask For Modifications page. Thank You.

** You can check all the posts on the Posts page.

** More about me in the About Me section.

Network Packet এর সাথে একটু কোলাকুলি -

আগের পর্বে Python এর সাহায্যে কিভাবে MAC এবং রিলেটেড ইনফরমেশন গুলো কিভাবে বের করা যায় সেটা নিয়ে দেখিয়েছিলাম। এই পর্বে থাকছে বাকি অংশ।  

প্যাকেট ফ্রেমের প্রথম ১৪ বাইট থেকে আমরা MAC ইনফরমেশন গুলো বের করেছি। ১৪ বাইটের পর থেকে বাকি ডাটা টা এখনো আমাদের হাতে আছে। এই ডাটার মধ্যেই মূল Source and Destination IP, Version, TTL, PayLoad ইত্যাদি ইনফরমেশন আছে। আমরা নিচের IP Header এর ছবি টি দেখি।

এখানে দেখতে পাচ্ছি প্রথম বাইটের ৪ টা বিট হচ্ছে Version এবং বাকি চার টা বিট হচ্ছে Header Length। প্রথমত আমাদের প্রথম Byte টা কে ভেঙ্গে নিতে হবে। এরপর এই প্রথম Byte থেকে প্রথম ৪ বিট রাখলে Version এবং শেষ ৪ বিট রাখলে Header Length পাবো। **প্রথম ৪ বিট পেতে ওই Byte কে ৪ ঘর Right Shift করবো এবং পরের ৪ বিট পেতে প্রথম বাইট কে 15 এর সাথে BitWise AND করা হয়েছে। পরবর্তীতে ৪ দিয়ে গুণ করা হয়েছে কারণ ম্যাক্সিমাম স্ট্যান্ডার্ড নেটওয়ার্ক প্রটোকল এ এই Header Length কে ৩২ বিটের করে দেখানো হয়ে থাকে।


def get_ipv4_packet(data):

    first_byte = data[0]

    version = first_byte >> 4

    header_length = (first_byte & 15) * 4

    ttl, proto, src, dest = struct.unpack('! 8x B B 2x 4s 4s', data[:20])

    return version, header_length, ttl, proto, get_ip_address(src), get_ip_address(dest), data[header_length:]


এবার TTL, Protocol, Source IP, Destination IP এসব ইনফরমেশন আমাদের বের করতে হবে IP Frame থেকে। ঠিক আগের মতোই আমরা এই প্যাকেট ফ্রেম টাকে ফরম্যাটিং করবো এই ইনফরমেশন গুলো বের করতে। এটা হলো বর্তমান ফরম্যাটিং '! 8x B B 2x 4s 4s'

মরা যদি ছবিতে দেখি তাহলে TTL থাকে 8 নাম্বার বাইটে। তাহলে 0-7 পর্যন্ত মোট 8 টা বাইট আমাদের স্কিপ করতে হবে। 8x এখানে এই কাজটিই করছে। পরবর্তী পজিশন অর্থাৎ 8 নাম্বার বিট টা কে B দিয়ে রিপ্রেজেন্ট করা হয়েছে। এই B এর মানে হচ্ছে  Unsigned Byte হিসেবে হেক্সাডেসিমাল ডাটা টাকে নিবে এবং সেটাকে ইন্টিজার আকারে দেখাবে। পরের B টা 9th বাইট টা কে নিয়েও একই কাজ করছে। এবং এটি Protocol ইনফরমেশন দিচ্ছে। 

ছবিতে পরের দুইটা বাইট হচ্ছে Header Checksum। এটা আমাদের কনসার্ন পয়েন্ট না। তাই এটা আমরা স্কিপ করছি। 2x দিয়ে আমরা সেটাই বুঝাচ্ছি। 

এর পরের ৪ বাইট হচ্ছে Source Address এবং পরের ৪ বাইট হলো Destination Address। 4s দিয়ে 4 লেন্থ এর বাইট স্ট্রিং হিসেবে নিবে এমনটা বোঝানো হচ্ছে। আর get_ip_address() ফাংশন টি এখানে address ইনপুট প্যারামিটার টির প্রত্যেক ইলিমেন্ট (যেহেতু আমরা ৪ বাইট নিয়েছি, তাই ৪ টা) কে স্ট্রিং হিসেবে map করে . দিয়ে জুড়ে দিয়েছে। কারণ IP Address গুলো দেখতে 101.10.231.98 এমন। 

def get_ip_address(address):

    return '.'.join(map(str, address))


সবশেষে ইনফরমেশন গুলো প্রিন্ট করে দেখতে পারি আমরা - 

print("\n========= L2 Frame ==============")

print("Source Mac: ", src_mac)

print("Destination Mac: ", dest_mac)

print("Protocol: ", proto)

print("========= L3 Frame ==============")

print("Version: ", version)

print("Header Length: ", header_length)

print("Source IP: ", start_ip)

print("Destination IP: ", dest_ip)

print("=========================================\n")



ধন্যবাদ ধৈর্য্য নিয়ে পড়ার জন্য। 

মতামত জানাতে পারেন - Ask For Modifications এ। 

*** Special Thanks To Shajal bhai for giving me suggestions to write this content.