UDP (User Datagram Protocol) একটি সংযোগবিহীন ডেটা ট্রান্সমিশন প্রোটোকল যা IP-এর উপর কাজ করে এবং ডেটাগ্রাম পাঠানোর সময় ন্যূনতম বিলম্বিতা প্রদান করে। TCP-এর বিপরীতে, UDP ডেলিভারি, প্যাকেট ক্রম বা ডুপ্লিকেশন থেকে সুরক্ষার গ্যারান্টি দেয় না। IETF RFC 768 (2024) অনুসারে, UDP ভিডিও কল, স্ট্রিমিং এবং DNS কুয়েরির কারণে বিশ্বব্যাপী ইন্টারনেট ট্রাফিকের 40% এর বেশি পরিচালনা করে।
মূল বিষয়
UDP (User Datagram Protocol) TCP/IP মডেলের ট্রান্সপোর্ট লেয়ারের মূল প্রোটোকলগুলির মধ্যে একটি, যা David Reed 1980 সালে ডিজাইন করেছিলেন। এটি ডেটা ট্রান্সমিশনের একটি ন্যূনতম প্রক্রিয়া প্রদান করে: অ্যাপ্লিকেশন একটি ডেটাগ্রাম পাঠায়, এবং প্রোটোকল ট্র্যাক করে না যে এটি প্রাপকের কাছে পৌঁছেছে কিনা।
UDP হেডার মাত্র চারটি ফিল্ড নিয়ে গঠিত: সোর্স পোর্ট, ডেস্টিনেশন পোর্ট, দৈর্ঘ্য এবং চেকসাম। প্রতিটি ফিল্ড 2 বাইট নেয়, তাই হেডারের মোট আকার 8 বাইট। তুলনার জন্য, অপশন ছাড়া TCP হেডার 20 বাইট এবং অপশন সহ 60 বাইট পর্যন্ত হয়।
প্রোটোকল নিজস্ব স্তরে ফ্র্যাগমেন্টেশন সমর্থন করে না — যদি একটি ডেটাগ্রাম MTU (Maximum Transmission Unit) অতিক্রম করে, তবে এটি IP স্তরে ফ্র্যাগমেন্ট হয়। যদি একটি ফ্র্যাগমেন্ট হারিয়ে যায়, পুরো ডেটাগ্রাম বাতিল করা হয়, কারণ UDP পৃথক ফ্র্যাগমেন্টের পুনঃপ্রেরণের অনুরোধ করতে পারে না। ডেভেলপারদের ডেটাগ্রামের আকার নিয়ন্ত্রণ করতে হবে — মোবাইল নেটওয়ার্কের জন্য, MTU প্রায়ই 1400 বাইট হয়, তাই সর্বোচ্চ আকার এই মান অতিক্রম করা উচিত নয়।
UDP ব্যবহার করে এমন একটি অ্যাপ্লিকেশন SOCK_DGRAM টাইপের একটি সকেট তৈরি করে, পোর্ট এবং ডেস্টিনেশন IP ঠিকানা নির্দিষ্ট করে এবং একটি ডেটাগ্রাম পাঠায়। প্রোটোকল একটি ন্যূনতম হেডার যোগ করে এবং প্যাকেটটি IP স্তরে পাঠায়। প্রাপক নিজের পোর্টে শোনে এবং আগত ডেটাগ্রাম থেকে ডেটা বের করে।
UDP কনজেশন কন্ট্রোল করে না — অ্যাপ্লিকেশন নেটওয়ার্ক দ্বারা সমর্থিত সর্বোচ্চ গতিতে ডেটাগ্রাম পাঠাতে পারে। এটি চ্যানেল কনজেশন হতে পারে, কিন্তু রিয়েল-টাইম পরিস্থিতিতে এই ধরনের আক্রমণাত্মকতা ন্যায়সঙ্গত: ভিডিও কলের জন্য, সম্ভাব্য ক্ষতি সহ ডেটা স্ট্রিম ট্রান্সমিশন বন্ধ করার চেয়ে বেশি গুরুত্বপূর্ণ।
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(b'Hello, UDP!', ('192.168.1.100', 8888))
sock.close()
এই উদাহরণে, UDP-এর জন্য একটি SOCK_DGRAM সকেট তৈরি করা হয়েছে। sendto মেথড সংযোগ স্থাপন না করেই একটি ডেটাগ্রাম পাঠায় — শুধুমাত্র প্রাপকের IP এবং পোর্ট জানা প্রয়োজন। সার্ভার পাশে recvfrom মেথড প্রতিক্রিয়ার জন্য ডেটা এবং প্রেরকের ঠিকানা উভয়ই ফেরত দেয়। মোবাইল প্ল্যাটফর্মে UDP সকেট একইভাবে কনফিগার করা হয় তবে অতিরিক্ত অনুমতির প্রয়োজন: iOS-এ, আনএনক্রিপ্টেড UDP সংযোগের জন্য NSAppTransportSecurity যোগ করতে হবে, এবং Android-এ, ম্যানিফেস্টে INTERNET অনুমতি।
UDP বেছে নেওয়া সেই পরিস্থিতিতে ন্যায়সঙ্গত যেখানে গতি নির্ভরযোগ্যতার চেয়ে বেশি গুরুত্বপূর্ণ। প্রোটোকল সংযোগ স্থাপন, নিশ্চিতকরণ এবং পুনঃপ্রেরণে সময় নষ্ট করে না — এটি ন্যূনতম বিলম্বিতা প্রদান করে, তবে ডেভেলপারকে স্বাধীনভাবে ক্ষতি পরিচালনা করতে হয়।
| সুবিধা | অসুবিধা |
|---|---|
| কম বিলম্বিতা — কোন হ্যান্ডশেক নেই | ডেলিভারির কোন গ্যারান্টি নেই |
| ছোট হেডার — 8 বাইট | কোন কনজেশন কন্ট্রোল নেই |
| ব্রডকাস্ট এবং মাল্টিকাস্ট সমর্থন | প্যাকেট ডুপ্লিকেট সম্ভব |
| ডেটাগ্রাম স্বাধীনতা — কোন সারি নেই | ডেটাগ্রামের আকার MTU দ্বারা সীমিত |
মোবাইল অ্যাপ্লিকেশনে, UDP WebRTC-এর মতো ফ্রেমওয়ার্কের মাধ্যমে ব্যবহৃত হয়, যা UDP-এর উপরে ক্ষতি নিয়ন্ত্রণ, অভিযোজিত বিটরেট এবং জিটার বাফার যোগ করে। এটি খালি প্রোটোকলের ত্রুটিগুলি ছাড়াই গতির সুবিধা প্রদান করে।
UDP-এর আরেকটি গুরুত্বপূর্ণ দিক হল কনজেশন কন্ট্রোলের অনুপস্থিতি। TCP-তে, Slow Start এবং Congestion Avoidance অ্যালগরিদম নেটওয়ার্ক ওভারলোড এড়াতে প্যাকেট ক্ষতিতে ট্রান্সমিশন গতি কমিয়ে দেয়। UDP-তে এই ধরনের প্রক্রিয়া নেই, তাই ডেভেলপারদের নিজস্ব রেট নিয়ন্ত্রণ কৌশল প্রয়োগ করতে হবে — উদাহরণস্বরূপ, ভিডিও কলে অভিযোজিত বিটরেট বা গেম সার্ভারে অত্যধিক নেটওয়ার্ক কনজেশন প্রতিরোধে রেট লিমিটিং।
UDP সেই পরিস্থিতিতে অপরিহার্য যেখানে বিলম্বিতা সহনশীলতা প্যাকেট ক্ষতি সহনশীলতার চেয়ে বেশি গুরুত্বপূর্ণ। আসুন মোবাইল এবং ওয়েব ডেভেলপমেন্টে প্রোটোকলের প্রধান প্রয়োগ ক্ষেত্রগুলি অন্বেষণ করি।
RTP এবং RTSP প্রোটোকল, যা UDP-এর উপর চলে, রিয়েল-টাইম অডিও এবং ভিডিও স্ট্রিম প্রেরণের জন্য ব্যবহৃত হয়। WebRTC — ব্রাউজার এবং মোবাইল অ্যাপ্লিকেশনে ভিডিও কলের মান — মিডিয়া ডেটার জন্য UDP-কে প্রাথমিক ট্রান্সপোর্ট এবং সিগন্যালিংয়ের জন্য TCP ব্যবহার করে। 30 fps ভিডিওতে একটি প্যাকেট হারানো ব্যবহারকারীর কাছে অদৃশ্য, পুনঃপ্রেরণের বিলম্বের বিপরীতে যা ছবির লক্ষণীয় জমাট বাঁধার কারণ হয়।
মাল্টিপ্লেয়ার শুটার এবং MOBA-গুলি সঠিক সিঙ্ক্রোনাইজেশনের জন্য 50 ms-এর কম বিলম্বিতা প্রয়োজন। UDP খেলোয়াড়ের অবস্থান, শট এবং ইভেন্টগুলি TCP-এর চেয়ে দ্রুত প্রেরণ করে, এবং প্যাকেট ক্ষতি সহজভাবে উপেক্ষা করা হয় — পরবর্তী আপডেট 16–33 ms-এ আসবে। জনপ্রিয় গেম ইঞ্জিন, যার মধ্যে Unity এবং Unreal Engine অন্তর্ভুক্ত, অ্যাপ্লিকেশন-স্তরের নিশ্চিতকরণের মাধ্যমে গুরুত্বপূর্ণ ইভেন্টগুলির জন্য অতিরিক্ত নির্ভরযোগ্যতা সহ নিজস্ব ট্রান্সপোর্ট স্তরের মাধ্যমে UDP ব্যবহার করে।
DNS কুয়েরি পোর্ট 53-এ UDP ব্যবহার করে কারণ প্রতিটি কুয়েরি একটি একক ছোট ডেটাগ্রাম (সাধারণত 512 বাইট পর্যন্ত)। যদি কোন প্রতিক্রিয়া না আসে, ক্লায়েন্ট টাইমআউটের পরে কুয়েরি পুনরায় চেষ্টা করে, যা তিন-পথ হ্যান্ডশেক সহ TCP সংযোগ স্থাপনের চেয়ে দ্রুত। DHCP ও UDP-এর উপর কাজ করে, কারণ ক্লায়েন্টের এখনও IP ঠিকানা নেই এবং TCP সংযোগ স্থাপন করতে পারে না, যখন ব্রডকাস্ট UDP প্যাকেট স্থানীয় নেটওয়ার্কে DHCP সার্ভার খুঁজে পেতে দেয়।
UDP এবং TCP-এর মধ্যে পছন্দ গতি এবং নির্ভরযোগ্যতার মধ্যে একটি আপস। প্রতিটি প্রোটোকল তার কাজের শ্রেণির জন্য সর্বোত্তম, এবং তাদের পার্থক্য বোঝা মোবাইল অ্যাপ্লিকেশনে নেটওয়ার্ক যোগাযোগ ডিজাইন করার সময় সঠিক আর্কিটেকচারাল সিদ্ধান্ত নিতে সহায়তা করে।
| মানদণ্ড | UDP | TCP |
|---|---|---|
| সংযোগ স্থাপন | প্রয়োজন নেই | তিন-পথ হ্যান্ডশেক |
| হেডার | 8 বাইট | 20–60 বাইট |
| ডেলিভারি গ্যারান্টি | না | হ্যাঁ, নিশ্চিতকরণ সহ |
| ক্রম নির্ধারণ | না | হ্যাঁ |
| কনজেশন কন্ট্রোল | না | হ্যাঁ (AIMD, Slow Start) |
| ব্যবহারের ক্ষেত্র | স্ট্রিমিং, গেম, DNS | ওয়েব, ইমেল, ফাইল, API |
মোবাইল প্রজেক্টগুলি প্রায়ই হাইব্রিড পদ্ধতি ব্যবহার করে: নির্ভরযোগ্য অনুরোধের (প্রমাণীকরণ, ডেটা লোডিং) জন্য TCP এবং মিডিয়া স্ট্রিমের জন্য UDP। QUIC — UDP-এর উপর চলা Google-এর একটি আধুনিক প্রোটোকল — UDP-এর গতি TCP-এর নির্ভরযোগ্যতার সাথে যুক্ত করে এবং ইতিমধ্যে HTTP/3-তে ব্যবহৃত হয়।
আসুন Python-এ একটি সরল UDP সার্ভার দেখি যা ক্লায়েন্টদের থেকে বার্তা গ্রহণ করে এবং প্রতিক্রিয়া পাঠায়। সার্ভার পোর্ট 8888-এ শোনে এবং অসীম লুপে আগত ডেটাগ্রাম প্রক্রিয়া করে।
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(('0.0.0.0', 8888))
print('UDP সার্ভার পোর্ট 8888 এ শুরু হয়েছে')
while True:
data, addr = server.recvfrom(1024)
print(f'{addr} থেকে প্রাপ্ত: {data.decode()}')
server.sendto(b'OK', addr)
সার্ভার একটি UDP সকেট তৈরি করে, পোর্ট 8888-এ বাইন্ড হয় এবং আগত ডেটাগ্রামের জন্য অপেক্ষা করে। recvfrom ডেটা এবং ক্লায়েন্টের ঠিকানা ফেরত দেয়, যা sendto-এর মাধ্যমে প্রতিক্রিয়া পাঠানোর অনুমতি দেয়। TCP-এর বিপরীতে, সার্ভার সংযোগের অবস্থা বজায় রাখে না — প্রতিটি ডেটাগ্রাম স্বাধীনভাবে প্রক্রিয়া করা হয়। এটি UDP সার্ভারকে স্কেলেবল করে: একটি একক সার্ভার প্রতিটি পৃথক সংযোগের জন্য মেমরি বরাদ্দ না করেই লক্ষ লক্ষ ক্লায়েন্ট পরিচালনা করতে পারে, যা DNS সার্ভার এবং গেম ম্যাচমেকিং সিস্টেমের জন্য গুরুত্বপূর্ণ।
মোবাইল ডেভেলপমেন্টে, UDP প্রায়ই উচ্চ-স্তরের লাইব্রেরির মাধ্যমে ব্যবহৃত হয়। উদাহরণস্বরূপ, CocoaAsyncSocket iOS-এর জন্য ডেলিগেট এবং GCD সহ UDP সকেট প্রদান করে অ্যাসিঙ্ক্রোনাস ইভেন্ট হ্যান্ডলিংয়ের জন্য। Android-এ, DatagramSocket ক্লাসটি স্ট্যান্ডার্ড java.net লাইব্রেরির অংশ এবং কোন অতিরিক্ত নির্ভরতার প্রয়োজন হয় না। Flutter-এর জন্য, udp প্যাকেজ রয়েছে যা নেটিভ সকেট কনফিগার না করেই ডেটাগ্রাম পাঠানো এবং গ্রহণের জন্য একটি সরল ইন্টারফেস প্রদান করে।
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে অনেক মোবাইল নেটওয়ার্ক এবং কর্পোরেট ফায়ারওয়াল UDP ট্রাফিক ব্লক করে, বিশেষ করে 1024-এর উপরের পোর্টে। যদি আপনার অ্যাপ্লিকেশন UDP ব্যবহার করে, আপনাকে TCP-তে ফলব্যাক প্রদান করতে হবে বা STUN সার্ভারের মাধ্যমে প্রোটোকল প্রাপ্যতা পরীক্ষা করতে হবে, যেমন WebRTC করে। iOS-এ, সিস্টেম Network.framework NWConnection-এর সাথে TCP এবং UDP উভয়ই সমর্থন করে, প্রাপ্যতার ভিত্তিতে স্বয়ংক্রিয়ভাবে সর্বোত্তম প্রোটোকল নির্বাচন করে। রিয়েল-টাইম অ্যাপ্লিকেশনের জন্য, অভিযোজিত বিটরেট বাস্তবায়নেরও সুপারিশ করা হয়, যা প্যাকেট ক্ষতিতে স্ট্রিমের গুণমান হ্রাস করে, উচ্চ ত্রুটির হার সহ অস্থির চ্যানেলেও নিরবচ্ছিন্ন প্লেব্যাক নিশ্চিত করে।
সচরাচর জিজ্ঞাসা
UDP সংযোগ স্থাপন করে না এবং প্যাকেট ডেলিভারির গ্যারান্টি দেয় না, যা এটিকে TCP-এর চেয়ে দ্রুত করে। UDP হেডার 8 বাইট যখন TCP-এর 20–60 বাইট। UDP স্ট্রিমিং এবং গেমের জন্য উপযুক্ত, যখন TCP ওয়েব অনুরোধ এবং ফাইল ট্রান্সফারের জন্য।
ডেটাগ্রাম হল UDP হেডার (সোর্স পোর্ট, ডেস্টিনেশন পোর্ট, দৈর্ঘ্য, চেকসাম) সহ একটি স্বাধীন ডেটা প্যাকেট। প্রতিটি ডেটাগ্রাম পূর্ববর্তীগুলির সাথে সম্পর্ক ছাড়াই স্বাধীনভাবে প্রক্রিয়া করা হয়। ডেটাগ্রামের আকার নেটওয়ার্ক MTU দ্বারা সীমিত এবং স্পেসিফিকেশন অনুসারে — 65507 বাইট পর্যন্ত।
UDP ট্রান্সপোর্ট স্তরে নির্ভরযোগ্যতা প্রদান করে না — এটি অ্যাপ্লিকেশন দ্বারা বাস্তবায়িত হয়। ডেভেলপাররা ক্রম সংখ্যা, চেকসাম, পুনঃপ্রেরণের অনুরোধ এবং ত্রুটি সংশোধন যোগ করে। FEC (Forward Error Correction) পুনঃপ্রেরণ ছাড়াই হারানো প্যাকেট পুনরুদ্ধার করতে দেয়।
UDP সেই পরিস্থিতির জন্য উপযুক্ত নয় যেখানে ডেটা অখণ্ডতা গুরুত্বপূর্ণ: ফাইল ট্রান্সফার, ব্যাংক লেনদেন, REST API। এই ক্ষেত্রে, TCP গ্যারান্টি দেয় যে প্রতিটি বাইট সঠিক ক্রমে পৌঁছায়। উচ্চ ক্ষতির হার সহ অস্থির চ্যানেলেও UDP সুপারিশ করা হয় না।
QUIC হল UDP-এর উপর চলা একটি ট্রান্সপোর্ট প্রোটোকল, যা Google দ্বারা উন্নীত এবং IETF দ্বারা RFC 9000 হিসাবে মানসম্মত। এটি UDP-এর গতি TCP-এর নির্ভরযোগ্যতার সাথে যুক্ত করে, হেড-অফ-লাইন ব্লকিং ছাড়াই মাল্টিপ্লেক্সিং সমর্থন করে এবং বিল্ট-ইন এনক্রিপশন রয়েছে। HTTP/3 তার ট্রান্সপোর্ট স্তর হিসাবে QUIC ব্যবহার করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন