ویدیو مربوط به این مقاله: (کلیک کن)

TCP و UDP چی هستن؟
تو دنیای شبکه، دادهها به شکل بستههای کوچیک (Packet) جابهجا میشن. حالا TCP و UDP مثل دو روش مختلف برای فرستادن این بستهها هستن:
TCP مثل پست سفارشی با رسید تحویله! مطمئن میشه بستهها درست، کامل و به ترتیب به مقصد برسن.
UDP مثل پرت کردن یه نامه تو صندوق پستی بدون چک کردن! سریع ارسال میشه، ولی تضمین نمیکنه که حتما برسه یا به ترتیب باشه.
هر دوی اینا تو لایه Transport کار میکنن، یعنی یه لایه بالاتر از IP که قبلا باهاش آشنا شدیم. کارشون اینه که دادهها رو از یه برنامه (مثل مرورگرت) به برنامه دیگه (مثل سرور گوگل) برسونن.
درنهایت:
TCP: مثل پست پیشتاز با امضای تحویل (خیلی دقیق، همهچی حسابشده)
UDP: مثل فرستادن نامه با کبوتر یا فریاد زدن وسط خیابون (سریع، بیتشریفات)
هر کدوم کاربرد خودشون رو دارن، بستگی داره بخوای دقت داشته باشی یا سرعت.
تاریخچه و دلیل به وجود اومدن TCP و UDP
برگردیم به دهه 1970، وقتی اینترنت تازه داشت شکل میگرفت. اون موقع دانشمندهایی مثل وینت سرف و رابرت کان داشتن TCP/IP رو طراحی میکردن تا شبکههای مختلف بتونن با هم حرف بزنن. TCP طراحی شد تا یه روش مطمئن برای انتقال داده باشه، چون تو شبکههای اولیه دادهها ممکن بود گم بشن، خراب بشن یا به ترتیب اشتباه برسن. اما بعدا، وقتی برنامههایی مثل پخش ویدیو یا تماس صوتی اومدن، مهندسها دیدن که TCP زیادی کند و سنگین عمل میکنه، چون کلی چک و بررسی داره. برای همین UDP رو ساختن که سریعتر باشه، ولی به قیمت اینکه تضمین کمتری بده. UDP برای کارایی که سرعت مهمتر از دقت بود (مثل استریم یا بازی آنلاین) عالیه.
بررسی دقیق تر TCP
اسم کاملش: Transmission Control Protocol یعنی پروتکل کنترل انتقال.
ویژگیها:
Reliability (قابل اعتماد بودن): هر segment شمارهگذاری میشه. گیرنده وقتی دریافت کرد، پیام تایید (ACK) میفرسته. اگه تایید نرسید، دوباره ارسال میشه.
Error checking (کنترل خطا): اگه بسته خراب شد، TCP میفهمه و دوباره از فرستنده درخواست میکنه.
Flow Control (کنترل جریان): اگه گیرنده سرعت کمتری داشته باشه، TCP خودش سرعت رو تنظیم میکنه تا گیرنده هنگ نکنه.
یکی از ویژگی های مهم TCP اتصال محور بودنش یا Connection-Oriented بودنشه. چی هست؟
وقتی میگیم TCP یک پروتکل connection-orientedعه یعنی قبل از اینکه دو تا دستگاه شروع کنن با هم حرف بزنن یا داده جابهجا کنن، اول میشینن یه جورایی قول و قرار میذارن و مطمئن میشن که:
هر دو آمادن.
شمارهگذاری پیامهاشون یکیه.
هیچکدوم وسط حرف هم نمیپرن.
درکل، مثل تلفن زدن میمونه: اول زنگ میزنی، طرف گوشی رو برمیداره، میگه الو، تو هم میگی الو، بعد تازه حرف اصلی شروع میشه. این شد connection-oriented.
ارتباط اولیه یا Connection-Oriented بین دو کامپیوتر، تو 3 مرحله انجام میشه! چرا سه مرحله؟
فرض کن میخوای به دوستت زنگ بزنی و باهاش حرف بزنی. قبل از اینکه شروع کنی حرف بزنی، یه سری مقدمات لازمه:
گوشی رو برمیداری و شمارهاش رو میگیری (یعنی میگی من میخوام وصل بشم).
اون گوشی رو جواب میده و میگه: الو! صدات میاد، منم آمادهام. (یعنی هم جواب تو رو میده هم خودش اعلام میکنه آمادهست).
تو میگی: صدای تو هم بهم رسید. حالا میتونیم حرف بزنیم. (یعنی تایید نهایی)
بعدش تازه مکالمه شروع میشه.
تصور کن این ارتباط سه مرحلهایی نبود!
اگه فقط یه طرف میگفت آمادم (مثلا تو فقط بگی الو من هستم) ولی طرف مقابل هیچوقت جواب نده، عملا هیچ ارتباطی شکل نمیگیره.
اگه دو مرحلهای باشه (تو بگی الو، اون بگه منم هستم) ولی تو هیچوقت تایید نکنی، طرف مقابل مطمئن نیست که واقعا صدای اون بهت رسیده یا نه.
سه مرحله باعث میشه هر دو طرف 100٪ مطمئن شن که:
طرف مقابل واقعا زنده و در دسترسه،
شمارهها و اطلاعات اولیه رد و بدل شده،
میشه شروع به فرستادن داده کرد.
اگه بخوام دقیق تر بگم، ارتباط 3 مرحله رو Three-Way Handshake مینامیم.
Three-Way Handshake چطور انجام میشه؟
فرض کن میخوای با یه نفر شروع کنی به صحبت کردن. ولی قبل از حرف زدن باید مطمئن بشی هر دو طرف آمادهاین و یه زبان مشترک دارین. TCP هم همین کارو میکنه! قبل از فرستادن دادهها یه دستدادن رسمی انجام میده تا هر دو طرف مطمئن باشن چی و چطوری قرارِ رد و بدل بشه. این دستدادن سه مرحله داره:
SYN => SYN-ACK => ACK.
تصور کن میخوای تلفنی صحبت کنی:
تو زنگ میزنی و میگی میخوام باهات حرف بزنم (این همون SYN هست).
اون طرف جواب میده من شنیدم و آمادم، من هم میخوام باهات حرف بزنم (این SYN+ACK هست).
تو میگی: آها گرفتم، حالا بزن بریم (این ACK هست).
بعد از این سه مرحله تازه حرفهاتون رو میزنید. دقیقا همین سه تا مرحله در Three-Way Handshake اتفاق میفته.
اصطلاحات که باید بلد باشیم:
SYN: یعنی میخوام اتصال رو شروع کنم.
ACK: یعنی گرفتم و تایید میکنم.
ISN (Initial Sequence Number): شمارهٔ شروعی که هر طرف برای شمارش بایتها انتخاب میکنه.
ISN در واقع یک عدد بزرگ و ظاهرا تصادفیه. ما نمونههای ساده میزنیم تا فهمش آسون باشه، ولی در عمل عددها معمولا بزرگ و تصادفین برای جلوگیری از تداخل با اتصالهای قدیمی.
فرض کنیم:
کلاینت یک ISN انتخاب کرده: 1000
سرور یک ISN انتخاب کرده: 5000
قدم اول: کلاینت یک بسته SYN با Sequence Number عدد 1000 میفرسته. تو میگی میخوام وصل شم، شمارهی شروع من 1000 هست. این بسته فقط پرچم SYN داره و Sequence = 1000.
قدم دوم: سرور یک بسته SYN+ACK با Sequence Number عدد 5000 و Ack عدد 1001 ارسال میکنه. سرور میگه من دریافت کردم SYN تو رو، این شمارهی شروع منه (5000)، و من ACK میکنم (جواب میدم) SYN تو رو با مقدار 1001.
چرا 1001 انتخاب کرد؟ سرور میگه من شماره 1000 رو دیدم و تو یک واحد جلوتر رو باید تأیید کنی. اینطوری ACK برابر میشه با مقدار عدد Sequence Number از سمت کلاینت + 1.
قدم سوم: کلایت بسته SYN+ACK رو دریافت و تایید میکنه. کلاینت میگه: ای سرور، ISN تو رو دریافت کردم، الان ACK با عدد 5001 میزنم برات.
بعد از ارسال این بسته به سمت سرور، هردو وارد یک حالت پایدار میشن و میتونن داده جا به جا کنن.

بررسی دقیق تر UDP
اسم کاملش: User Datagram Protocol یعنی پروتکل دیتاگرام کاربر.
UDP میگه من فقط بسته رو میفرستم، دیگه به من ربطی نداره رسید یا نه.
ویژگیها:
Connectionless (بدون ارتباط): هیچ Handshake و مقدمهای در کار نیست. همون اول بسته میره.
No reliability (غیر قابل اطمینان): نه شمارهگذاری داره، نه ACK.
No ordering (بدون ترتیب): بستهها ممکنه به ترتیب اشتباه برسن. UDP اهمیتی نمیده.
خیلی سریع: چون به اندازه TCP چک و بررسی انجام نمیده.
خلاصه: UDP سریع و سبک، ولی بیخیالِ نظم و اطمینان.
کاربردها (کجا TCP خوبه، کجا UDP)
TCP (دقت مهمه):
وبگردی (HTTP/HTTPS): نمیخوای نصف صفحه بیاد.
ایمیل (SMTP, IMAP, POP3): باید کامل برسه.
انتقال فایل (FTP, SFTP): نباید فایل خراب بشه.
ریموت دسکتاپ (SSH, RDP): باید قابل اعتماد باشه.
UDP (سرعت مهمه)
پخش آنلاین ویدیو/موزیک (Streaming): اگه یک فریم جا بیفته مهم نیست، مهم سرعت هست.
بازیهای آنلاین: نمیخوای حرکتت با تاخیر برسه، حتی اگه یک بسته گم بشه.
تماس صوتی و تصویری (VoIP): کیفیت زنده مهمتر از رسیدن 100% بستههاست.
پروتکلهای سبک مثل DNS: جواب رو خیلی سریع میخوای، لازم نیست تضمین پیچیده باشه.