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 দিয়ে নেটওয়ার্ক প্যাকেটের মধ্যে থেকে এসকল তথ্য বের করে নিয়ে আসা যায়। 

এখন আমাদের প্রথম কাজ হচ্ছে নেটওয়ার্ক প্যাকেট ক্যাপচার করা। এর জন্য আমরা ব্যবহার করবো Python এর socket লাইব্রেরী। Python এর এই socket লাইব্রেরী হচ্ছে Low Level Networking Interface এর ডাটা গুলো নিয়ে কাজ করার সুযোগ করে দেয়। 

তো প্যাকেট ফ্রেম মোটামুটি দেখতে নিচের মতন। socket** লাইব্রেরীর মাধ্যমে যখন লো-লেভেল থেকে প্যাকেট ফ্রেম ক্যাপচার করা হয় তখন এরকম একটা ফ্রেম socket লাইব্রেরী আমাদেরকে দেয় যেগুলো হেক্সাডেসিমাল এ এনকোডেড থাকে। 

conn = socket.socket(family=socket.AF_PACKET, type=socket.SOCK_RAW, proto=socket.ntohs(3))

এখানে family, type, proto এগুলো হচ্ছে socket() API এর এক একটা প্যারামিটার। এখানে , family নির্দেশ করে কোন লেয়ারে socket টা কাজ করবে, type নির্দেশ করে কোন ধরনের ডাটা সে কালেক্ট করবে, এবং proto নির্দেশ করে কোন প্রোটকল এর বেসিস এ ক্যাপচার করবে। এইভাবে আমরা socket লাইব্রেরীর মাধ্যমে Network Interface থেকে ডাটা কালেক্ট করার জন্য অব্জেক্ট নিতে পারি। এখন এই conn অবজেক্ট এর recvfrom() API দিয়ে আমরা একটা নির্দিষ্ট বাইটের (আমাদের হিসাবে 65535 বাইট) ডাটা ক্যাপচার করবো। এবং সেটা raw_data এর মধ্যে রাখবো। recvfrom() API একই সাথে address ও দেয়। এটা হলো যার কাছ থেকে এই বাইট স্ট্রিম টা রিসিভ করেছে তার এ্যাড্রেস। হয়তো IP অথবা IP + Port। 

while True:

        raw_data, address = conn.recvfrom(65535)

        dest_mac, src_mac, proto, data = parse_header(raw_data=raw_data)

        version, header_length, ttl, proto, start_ip, dest_ip, data = get_ipv4_packet(data=data)

এই raw_data থেকে আমরা Source, Destination MAC Address, Protocol, এবং বাকি Data গুলো রিট্রিভ করবো। এই কাজ টা করবে parse_header() নামের একটা ফাংশন। সে ইনপুট হিসেবে নিচ্ছে raw_data। আবার, get_ipv4_packet() এই ফাংশনের মাধ্যমে বের করে নেবো Version, Header_Length, TTL, Protocol, Source IP, Destination IP এসব ইনফরমেশন। এই ফাংশন ইনপুট হিসেবে নেয় Data। 

এই পর্বে থাকবে শুধু মাত্র MAC Address ইনফরমেশন বের করা পর্যন্ত। পরবর্তী পর্বে দেখবো Version, Header Length ইত্যাদি বাকি ইনফরমেশন গুলো কিভাবে বের করে আনা যায়। 

প্যাকেট ফ্রেম ছবিটার প্রথম অংশ MAC Header যা Network Packet এর প্রথম ১৪ টি বাইট। তার মানে Source MAC এবং Destination MAC থাকবে এই Header এ। তাহলে parse_header() ফাংশন টা প্রথম ১৪ বাইটের হেক্সাডেসিমাল ইনফরমেশনগুলোকে নিয়ে একটা স্পেসিফিক ফরম্যাট '! 6s 6s H' এ রাখবে। এখানে, ! নির্দেশ করে বিগ-এন্ডিয়ান** ফরম্যাট এ ডাটাগুলোকে রাখা হবে এরকম বোঝানো হচ্ছে,  6s হচ্ছে ৬ লেন্থ এর বাইট স্ট্রিং যেগুলো Destination এবং Source MAC ইনফরমেশন গুলোকে রাখবে। আর H এর মাধ্যমে বোঝানো হচ্ছে ২ বাইটের একটি শর্ট ইন্টেজার যেটি প্রোটোকল নির্দেশ করে। socket.htons() হেক্সাডেসিমালে থাকা প্রটোকোল ইনফরমেশনটাকেই Network Byte অর্ডারে রিটার্ন করে। নেটওয়ার্ক প্রোগ্রামিং এই অর্ডারের ইনফরমেশন গুলোই প্রয়োজন হয়। htons = host to network short। 

def parse_header(raw_data):

    destination, source, protocol = struct.unpack('! 6s 6s H', raw_data[:14])

    return get_mac_addr(destination), get_mac_addr(source), socket.htons(protocol), raw_data[14:]

যখন Source এবং Destination MAC এ্যাড্রেস নেটওয়ার্ক প্যাকেটের মধ্যে থাকে তখন হিজিবিজি অবস্থায় থাকে। এখানে get_mac_addr() ফাংশন হেক্সাডেসিমালে থাকা হিজিবিজি Source এবং Destination MAC Address গুলো কে ফরম্যাট করে প্রপার ফরম্যাট এ নিয়ে আসে। যেমনঃ AA:BB:CC:DD:EE:FF

def get_mac_addr(bytes_addr):

    bytes_addr = map('{:02x}'.format, bytes_addr)

    mac_address = ':'.join(bytes_addr).upper()

    return mac_address

এখানে bytes_addr একটি ইনপুট প্যারামিটার। সেখানকার ইনফরমেশন গুলোর ২ ঘর করে নিবে সেজন্যে 02x। এবং পরবর্তীতে ':' দিয়ে জোড়া লাগিয়ে MAC Address এর ফরম্যাট দেবে। এইভাবে Source and Destination MAC Address রিট্রিভ করা যায় নেটওয়্যার্ক প্যাকেট থেকে। 

পরবর্তী পর্বে থাকবে Python দিয়ে Version, Header Length ইত্যাদি বাকি ইনফরমেশন গুলো কিভাবে বের করে আনা যায়



** socket লাইব্রেরীঃ https://docs.python.org/3/library/socket.html

** বিগ-এন্ডিয়ানঃ https://chortle.ccsu.edu/assemblytutorial/Chapter-15/ass15_3.html


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