Datagram Handling এবং Error Checking

Computer Programming - ইউনিক্স সকেট (Unix Socket) UDP Socket Programming (UDP Socket Programming) |
245
245

UDP (User Datagram Protocol) একটি connectionless প্রোটোকল, যা ডেটা প্যাকেট বা Datagram সরাসরি প্রেরণ করে। TCP-এর মতো UDP কোনো connection setup প্রক্রিয়া বা error correction মেকানিজম ব্যবহার করে না। তবে, UDP ডাটাগ্রাম হ্যান্ডলিং এবং ত্রুটি সনাক্তকরণের জন্য কিছু নির্দিষ্ট প্রক্রিয়া অনুসরণ করে।

Datagram Handling in UDP

UDP ডাটাগ্রাম হ্যান্ডলিং করার সময় কয়েকটি গুরুত্বপূর্ণ দিক অনুসরণ করে:

Datagram Structure:

  • UDP ডাটাগ্রাম হলো একটি ডেটা প্যাকেট, যা সরাসরি প্রেরিত হয় এবং এতে কোনো অতিরিক্ত মেটাডেটা সংযুক্ত থাকে না। একটি UDP ডাটাগ্রামের প্রধান উপাদানগুলো হলো:
    • Source Port (16-bit): প্যাকেট প্রেরকের পোর্ট নম্বর।
    • Destination Port (16-bit): প্যাকেট গ্রহণকারীর পোর্ট নম্বর।
    • Length (16-bit): UDP হেডার সহ পুরো ডাটাগ্রামের দৈর্ঘ্য।
    • Checksum (16-bit): ত্রুটি সনাক্তকরণের জন্য ব্যবহৃত একটি কোড, যা ঐচ্ছিক হতে পারে।
    • Data: অ্যাকচুয়াল ডেটা যা ডাটাগ্রামের অংশ হিসেবে পাঠানো হয়।

Datagram Transmission:

  • UDP ডাটাগ্রাম পাঠানোর সময়, কোনো নির্দিষ্ট সংযোগ স্থাপনের প্রয়োজন হয় না। প্রেরক সরাসরি ডাটাগ্রাম পাঠায় এবং রিসিভারের ঠিকানা এবং পোর্ট নম্বর ব্যবহার করে ডেলিভারি নিশ্চিত করে। রিসিভার সরাসরি ডাটাগ্রাম গ্রহণ করে এবং তা প্রক্রিয়া করে।

Stateless Handling:

  • UDP প্রোটোকল সম্পূর্ণরূপে stateless, অর্থাৎ প্রেরক এবং রিসিভার কোনো সংযোগ স্থাপন বা রক্ষণাবেক্ষণ করে না। প্রতিটি ডাটাগ্রাম স্বাধীনভাবে প্রক্রিয়া করা হয় এবং একটির সাথে অন্যটির কোনো সম্পর্ক থাকে না।

No Flow Control:

  • UDP কোনো ফ্লো কন্ট্রোল মেকানিজম ব্যবহার করে না। এটি প্যাকেটের হার এবং প্রেরকের গতি নিয়ন্ত্রণ করে না, যার ফলে ডাটাগ্রামগুলি তাদের নিজস্ব গতিতে ট্রান্সমিট হয়। এটি দ্রুত ডেলিভারি নিশ্চিত করে, তবে প্যাকেট হারানোর সম্ভাবনা থাকে।

Error Checking in UDP

UDP ত্রুটি সংশোধন না করলেও, এটি ত্রুটি সনাক্তকরণের জন্য Checksum ব্যবহার করে। এটি নিশ্চিত করে যে ডাটাগ্রামটি সঠিকভাবে ডেলিভার হয়েছে কিনা। ত্রুটি সনাক্তকরণের পদ্ধতি নিচে বিস্তারিতভাবে বর্ণনা করা হলো:

Checksum Field:

  • UDP হেডারের একটি গুরুত্বপূর্ণ অংশ হলো Checksum। এটি ১৬-বিটের একটি ফিল্ড, যা ডাটাগ্রামের ডেটা এবং হেডারের উপর ভিত্তি করে তৈরি করা হয়।
  • Checksum এর মাধ্যমে নিশ্চিত করা হয় যে ডাটাগ্রামটি প্রেরণের সময় কোনো ত্রুটি (error) ঘটেনি। প্রেরকের UDP Stack Checksum তৈরি করে এবং রিসিভারের UDP Stack সেই Checksum চেক করে।

Checksum Calculation:

  • UDP Checksum হিসাব করার সময় হেডার এবং ডেটার প্রতিটি ১৬-বিটের অংশ যোগ করা হয়। অতিরিক্ত বিট (carry bits) যোগ করা হয় এবং ইনভার্ট করে একটি Checksum তৈরি করা হয়। এই Checksum প্রেরণের আগে ডাটাগ্রামের সাথে যুক্ত করা হয়।
  • রিসিভার যখন ডাটাগ্রাম গ্রহণ করে, তখন UDP Checksum রিসিভড ডাটাগ্রামের জন্য একইভাবে গণনা করে এবং প্রাপ্ত Checksum-এর সাথে মেলে কিনা তা যাচাই করে। যদি Checksum মিলে যায়, তাহলে ডাটাগ্রাম সঠিকভাবে ডেলিভার হয়েছে বলে মনে করা হয়।

Error Detection and Handling:

  • UDP প্রোটোকল শুধুমাত্র ত্রুটি শনাক্ত করে, তবে তা সংশোধন বা পুনরায় ডাটাগ্রাম পাঠানোর ব্যবস্থা করে না। যদি Checksum মিলে না যায়, তাহলে ডাটাগ্রামটি ফেলে (discard) দেওয়া হয়।
  • যেহেতু UDP কানেকশনলেস এবং stateless, প্রেরক পুনরায় ডাটাগ্রাম পাঠানোর ব্যবস্থা রাখে না। UDP-এর ত্রুটি সংশোধনের দায়িত্ব প্রয়োজনে অ্যাপ্লিকেশন লেয়ার বা অ্যাপ্লিকেশন প্রোটোকলের ওপর নির্ভর করে।

উদাহরণ: Datagram Transmission এবং Checksum ব্যবহার

একটি সাধারণ UDP সার্ভার- ক্লায়েন্ট প্রোগ্রাম যেখানে UDP ডাটাগ্রাম পাঠানো এবং Checksum-এর মাধ্যমে ত্রুটি চেক করা হয়:

UDP Server Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
    int sockfd;
    char buffer[1024];
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(client_addr);
    char *message = "Hello from server";

    // Socket তৈরি করা
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // সার্ভার ঠিকানা সেটআপ করা
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(PORT);

    // Binding করা
    if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        perror("Bind failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    printf("Server is listening on port %d\n", PORT);

    // ডেটা গ্রহণ করা
    int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&client_addr, &addr_len);
    buffer[n] = '\0';
    printf("Client: %s\n", buffer);

    // ডেটা পাঠানো
    sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&client_addr, addr_len);
    printf("Hello message sent to client\n");

    // Socket বন্ধ করা
    close(sockfd);

    return 0;
}

UDP Client Program (C ভাষায়)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>

#define PORT 8080

int main() {
    int sockfd;
    char buffer[1024];
    struct sockaddr_in serv_addr;
    socklen_t addr_len = sizeof(serv_addr);
    char *message = "Hello from client";

    // Socket তৈরি করা
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // সার্ভার ঠিকানা সেটআপ করা
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    // ডেটা পাঠানো
    sendto(sockfd, message, strlen(message), 0, (struct sockaddr*)&serv_addr, addr_len);
    printf("Message sent to server\n");

    // ডেটা গ্রহণ করা
    int n = recvfrom(sockfd, buffer, 1024, 0, (struct sockaddr*)&serv_addr, &addr_len);
    buffer[n] = '\0';
    printf("Server: %s\n", buffer);

    // Socket বন্ধ করা
    close(sockfd);

    return 0;
}
common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion