UDP (User Datagram Protocol) — پروتکل انتقال داده بدون برقراری اتصال است که روی IP کار میکند و حداقل تأخیر را هنگام ارسال دیتاگرامها فراهم میکند. برخلاف TCP، UDP تحویل، ترتیب بستهها یا محافظت در برابر تکرار را تضمین نمیکند. طبق دادههای IETF RFC 768 (2024)، UDP بیش از 40٪ از ترافیک جهانی اینترنت را از طریق تماسهای تصویری، استریمینگ و درخواستهای DNS پردازش میکند.
نکات کلیدی
UDP (User Datagram Protocol) — یکی از پروتکلهای کلیدی لایه حمل مدل TCP/IP است که توسط دیوید رید در سال 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()
در مثال، یک سوکت SOCK_DGRAM برای UDP ایجاد میشود. متد sendto دیتاگرام را بدون برقراری اتصال ارسال میکند — دانستن IP و پورت گیرنده کافی است. متد recvfrom در سمت سرور هم دادهها و هم آدرس فرستنده را برای پاسخ برمیگرداند. سوکتهای UDP در پلتفرمهای موبایل به طور مشابه پیکربندی میشوند، اما به مجوزهای اضافی نیاز دارند: در iOS باید NSAppTransportSecurity برای اتصالات UDP رمزنگارینشده اضافه کرد و در Android — مجوز INTERNET در مانیفست.
انتخاب UDP در سناریوهایی توجیهپذیر است که سرعت از قابلیت اطمینان مهمتر است. پروتکل زمانی را صرف برقراری اتصال، تأییدها و ارسال مجدد نمیکند — این حداقل تأخیر را فراهم میکند، اما نیازمند رسیدگی مستقل به از دست رفتنها توسط توسعهدهنده است.
| مزایا | معایب |
|---|---|
| تأخیر کم — بدون handshake | بدون تضمین تحویل |
| هدر کوچکتر — 8 بایت | بدون کنترل ازدحام |
| پشتیبانی از broadcast و multicast | احتمال تکرار بستهها |
| استقلال دیتاگرامها — بدون صف | اندازه دیتاگرام محدود به MTU |
در برنامههای موبایل، UDP از طریق فریمورکهایی مانند WebRTC استفاده میشود که کنترل از دست رفتن، نرخ بیت تطبیقی و بافر jitter را روی UDP اضافه میکنند. این مزایای سرعت را بدون معایب پروتکل خام فراهم میکند.
جنبه مهم دیگر UDP عدم وجود کنترل ازدحام است. در TCP، الگوریتمهای Slow Start و Congestion Avoidance سرعت انتقال را با از دست رفتن بسته کاهش میدهند تا شبکه بیش از حد بارگذاری نشود. UDP چنین مکانیسمهایی ندارد، بنابراین توسعهدهندگان باید استراتژیهای کنترل سرعت خود را پیادهسازی کنند — به عنوان مثال، نرخ بیت تطبیقی در تماسهای تصویری یا محدودیت نرخ در سرورهای بازی برای جلوگیری از بارگذاری بیش از حد کانال شبکه.
UDP در سناریوهایی ضروری است که تحمل تأخیر مهمتر از تحمل از دست رفتن بسته است. بیایید حوزههای اصلی کاربرد پروتکل در توسعه موبایل و وب را بررسی کنیم.
پروتکلهای RTP و RTSP که روی UDP کار میکنند، برای انتقال جریانهای صوتی و تصویری در زمان واقعی استفاده میشوند. WebRTC — استاندارد تماسهای تصویری در مرورگرها و برنامههای موبایل — از UDP به عنوان حملونقل اصلی برای دادههای رسانهای و از TCP برای سیگنالینگ استفاده میکند. از دست رفتن یک بسته در ویدیوی 30 فریم در ثانیه برای کاربر نامحسوس است، برخلاف تأخیر ارسال مجدد که باعث افت قابل توجه تصویر میشود.
تیراندازیهای چندنفره و MOBA برای هماهنگسازی صحیح به تأخیر کمتر از 50 میلیثانیه نیاز دارند. UDP موقعیت بازیکنان، شلیکها و رویدادها را سریعتر از TCP منتقل میکند و از دست رفتن بسته به سادگی نادیده گرفته میشود — بهروزرسانی بعدی طی 16–33 میلیثانیه میرسد. موتورهای بازی محبوب، از جمله Unity و Unreal Engine، از UDP از طریق لایههای حملونقل خود با افزودن قابلیت اطمینان برای رویدادهای بحرانی از طریق تأیید در سطح برنامه استفاده میکنند.
درخواستهای DNS از UDP در پورت 53 استفاده میکنند، زیرا هر درخواست یک دیتاگرام کوچک (معمولاً تا 512 بایت) است. اگر پاسخی نرسد، مشتری به سادگی درخواست را پس از تایماوت تکرار میکند که سریعتر از برقراری اتصال TCP با دستدهی سه مرحلهای آن است. DHCP نیز روی UDP کار میکند، زیرا مشتری هنوز آدرس IP ندارد و نمیتواند اتصال TCP برقرار کند، و بستههای پخش UDP امکان یافتن سرور DHCP در شبکه محلی را فراهم میکنند.
انتخاب بین UDP و TCP یک مصالحه بین سرعت و قابلیت اطمینان است. هر پروتکل برای دسته وظایف خود بهینه است و درک تفاوتهای آنها به تصمیمگیری معماری صحیح در طراحی تعاملات شبکه در برنامههای موبایل کمک میکند.
| معیار | UDP | TCP |
|---|---|---|
| برقراری اتصال | نیاز نیست | دستدهی سه مرحلهای |
| هدر | 8 بایت | 20–60 بایت |
| تضمین تحویل | خیر | بله، با تأیید |
| ترتیببندی | خیر | بله |
| کنترل ازدحام | خیر | بله (AIMD، Slow Start) |
| کاربرد | استریمینگ، بازیها، DNS | وب، ایمیل، فایلها، API |
در پروژههای موبایل اغلب از رویکرد ترکیبی استفاده میشود: TCP برای درخواستهای قابل اعتماد (احراز هویت، بارگذاری داده) و UDP برای جریانهای رسانهای. QUIC — پروتکل مدرن گوگل که روی UDP کار میکند — سرعت UDP را با قابلیت اطمینان TCP ترکیب میکند و در HTTP/3 استفاده میشود.
بیایید یک سرور ساده 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 سوکتهای UDP را با delegate و GCD برای پردازش ناهمگام رویدادها فراهم میکند. در Android، کلاس DatagramSocket بخشی از کتابخانه استاندارد java.net است و به وابستگیهای اضافی نیاز ندارد. برای Flutter بسته udp وجود دارد که یک رابط ساده برای ارسال و دریافت دیتاگرام بدون پیکربندی سوکتهای بومی فراهم میکند.
توجه به این نکته مهم است که بسیاری از شبکههای موبایل و فایروالهای شرکتی ترافیک UDP را مسدود میکنند، به ویژه در پورتهای بالاتر از 1024. اگر برنامه شما از UDP استفاده میکند، باید fallback روی TCP یا بررسی دسترسی پروتکل از طریق سرورهای STUN، همانطور که WebRTC انجام میدهد، پیشبینی شود. در iOS، فریمورک سیستمی Network.framework با NWConnection از هر دو TCP و UDP پشتیبانی میکند و به طور خودکار پروتکل بهینه را بر اساس دسترسی انتخاب میکند. برای برنامههای بلادرنگ همچنین توصیه میشود نرخ بیت تطبیقی پیادهسازی شود که کیفیت جریان را با از دست رفتن بسته کاهش میدهد و تداوم پخش را حتی در کانالهای ناپایدار با سطح خطای بالا تضمین میکند.
سوالات متداول
UDP اتصال برقرار نمیکند و تحویل بستهها را تضمین نمیکند، که آن را سریعتر از TCP میکند. هدر UDP — 8 بایت در مقابل 20–60 بایت TCP. UDP برای استریمینگ و بازیها مناسب است، TCP — برای درخواستهای وب و انتقال فایل.
دیتاگرام — یک بسته داده مستقل با هدر UDP (پورت مبدأ، پورت مقصد، طول، جمع کنترلی) است. هر دیتاگرام بدون ارتباط با دیتاگرامهای قبلی مستقل پردازش میشود. اندازه دیتاگرام توسط MTU شبکه محدود میشود و طبق مشخصات تا 65507 بایت است.
UDP قابلیت اطمینان را در لایه حمل تأمین نمیکند — برنامه آن را پیادهسازی میکند. توسعهدهندگان شماره توالی، جمع کنترلی، درخواست مجدد و تصحیح خطا اضافه میکنند. FEC (Forward Error Correction) امکان بازیابی بستههای از دست رفته را بدون ارسال مجدد فراهم میکند.
UDP برای سناریوهایی که یکپارچگی داده حیاتی است مناسب نیست: انتقال فایل، تراکنشهای بانکی، REST-API. در این موارد TCP تضمین میکند که هر بایت به ترتیب صحیح میرسد. UDP همچنین در کانالهای ناپایدار با سطح از دست رفتن بالا توصیه نمیشود.
QUIC — پروتکل حملونقلی است که روی UDP کار میکند، توسط گوگل توسعه یافته و توسط IETF به عنوان RFC 9000 استاندارد شده است. این پروتکل سرعت UDP را با قابلیت اطمینان TCP ترکیب میکند، از مالتیپلکسینگ بدون مسدودسازی و رمزنگاری داخلی پشتیبانی میکند. HTTP/3 از QUIC به عنوان لایه حملونقل استفاده میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید