پروتکل tcp ؛ بررسی تاریخچه و تمامی موارد مرتبط
پروتکل TCP یا Transmission Control Protocol یکی از بنیادی ترین پروتکل های ارتباطی در شبکه های کامپیوتری است که وظیفه دارد انتقال داده را به صورت مطمئن، مرتب و قابل اعتماد بین دو دستگاه انجام دهد. TCP داده ها را به قطعات کوچک تر به نام سگمنت تقسیم می کند، برای رسیدن آن ها به مقصد تأییدیه می گیرد و در صورت بروز خطا یا گم شدن بسته، آن ها را دوباره ارسال می کند. به همین دلیل، TCP را می توان ستون فقرات بسیاری از ارتباطات روزمره اینترنت دانست؛ از باز کردن یک صفحه وب گرفته تا ارسال ایمیل و برقراری ارتباط با سرورهای مختلف، همه و همه در بسیاری از موارد به TCP متکی اند.
از نظر جایگاه در مدل شبکه، TCP در لایه انتقال قرار می گیرد؛ یعنی بین لایه شبکه و لایه کاربرد عمل می کند و مسئول ایجاد یک ارتباط انتهابه انتها میان برنامه هاست. اهمیت TCP دقیقاً از همین جا می آید: این پروتکل تضمین می کند داده ها نه تنها به مقصد برسند، بلکه به همان ترتیبی که ارسال شده اند نیز تحویل داده شوند. در دنیایی که اختلال، تأخیر و از دست رفتن بسته ها بخشی طبیعی از شبکه هستند، TCP با مکانیزم هایی مانند شماره گذاری بسته ها، تأیید دریافت، کنترل جریان و کنترل ازدحام، ارتباطی پایدار و قابل اعتماد فراهم می کند؛ چیزی که اگر نبود، اینترنت این قدر منظم و قابل اتکا به نظر نمی رسید و راستش کمی هم شبیه ارسال نامه با باد شانس می شد.
تاریخچه و استاندارد های TCP
تاریخچه TCP به اوایل شکل گیری اینترنت بر می گردد، اما نقطه عطف اصلی آن RFC 793 است که در سال 1981 منتشر شد و برای دهه ها به عنوان متن پایه و مرجع اصلی TCP شناخته می شد. این RFC نه تنها ساختار بسته ها، شماره های توالی، تأییدیه ها، برقراری و خاتمه اتصال را تعریف کرد، بلکه TCP را به عنوان یک پروتکل انتقالی مطمئن، اتصال گرا و انتها به انتها در معماری لایه ای اینترنت تثبیت کرد. در واقع، RFC 793 شالودهای ساخت که بسیاری از پیادهسازیهای TCP سالها بر اساس آن عمل کردند و هنوز هم بخش زیادی از منطق کلاسیک TCP از همانجا میآید.
ژ
با گذشت زمان، TCP در عمل رشد کرد و برای پاسخ به نیازهای جدید، RFC های تکمیلی زیادی برای آن نوشته شد؛ از جمله RFC 5681 برای کنترل ازدحام، RFC 2018 برای SACK، RFC 7323 برای Window Scaling و Timestamps، و RFCهای امنیتی و اصلاحی دیگر. این پراکندگی باعث شد که استاندارد پایه TCP بهصورت یکپارچه بازنویسی شود و نتیجه آن RFC 9293 بود که در سال 2022 منتشر شد و RFC 793 را منسوخ کرد. RFC 9293 همه تغییرات مهم و استاندارد های تکمیلی IETF را در یک سند واحد جمع آوری کرد و TCP را با زبان دقیق تر و سازگار تر با پیاده سازی های مدرن بازتعریف نمود، بدون اینکه ماهیت اصلی آن را عوض کند. بنابراین، RFC 793 را باید بنیان تاریخی TCP دانست و RFC 9293 را نسخه استاندارد و به روز آن برای امروز و RFC های تکمیلی هم مثل ابزار های حرفه ای جعبه ابزار TCP هستند که هر کدام یک قابلیت مشخص را اضافه یا اصلاح می کنند.
جایگاه TCP در مدل TCP/IP
TCP در مدل TCP/IP در لایه انتقال قرار می گیرد؛ لایه ای که وظیفه اش برقراری ارتباط انتها به انتها بین برنامههای دو میزبان است. در این جایگاه، TCP داده را از لایه کاربرد دریافت می کند، آن را به بخش های کوچک تر تقسیم می کند، برایشان شماره توالی و سازوکار اطمینان تعریف می کند و سپس تحویل آن ها را به مقصد مدیریت می کند. به بیان ساده، TCP مثل یک مدیر دقیق و وسواسدار عمل می کند که مطمئن می شود بسته ها هم برسند و هم سر جای درستشان قرار بگیرند. این لایه دقیقاً بین برنامههای کاربر و زیرساخت شبکه قرار میگیرد و باعث میشود برنامههایی مثل مرورگر، ایمیل یا SSH بتوانند بدون درگیری با جزئیات سخت شبکه، ارتباطی پایدار و قابل اعتماد داشته باشند.
تفاوت TCP با IP بسیار مهم است: IP در لایه شبکه کار می کند و مسئول مسیریابی و رساندن بسته ها از یک میزبان به میزبان دیگر است، اما هیچ تضمینی برای رسیدن، ترتیب، یا عدم تکرار بستهها نمی دهد. در مقابل، TCP روی IP سوار می شود و همین کمبود ها را جبران می کند؛ یعنی اگر IP بسته ای را گم کند یا به هم ریخته برساند، TCP با شماره گذاری، تأییدیه و ارسال مجدد، ارتباط را قابل اعتماد می سازد. در مقایسه با UDP هم، TCP تفاوتی بنیادی دارد: UDP نیز در لایه انتقال است، اما سبک تر و بدون اتصال است و از مکانیزم های پیچیده اطمینان و کنترل جریان استفاده نمی کند. بنابراین TCP برای ارتباطاتی مناسب است که دقت و اطمینان در آن ها مهم تر از سرعت خام است، در حالی که UDP بیشتر برای سناریو هایی به کار می رود که تأخیر کم اهمیت بیشتری دارد، مثل استریم زنده یا بازی های آنلاین.
ویژگی های اصلی پروتکل TCP
TCP چند ویژگی مهم و اساسی دارد که باعث شده سال ها ستون اصلی انتقال داده در اینترنت باقی بماند. مهم ترین ویژگی آن اتصال گرا بودن است؛ یعنی قبل از ارسال داده، بین دو میزبان یک ارتباط مشخص برقرار می شود و دو طرف روی شماره های توالی و وضعیت اتصال هماهنگ می شوند. همین اتصال گرایی زمینه را برای قابلیت اطمینان TCP فراهم می کند: داده ها با شماره گذاری، تأیید دریافت و ارسال مجدد در صورت لزوم، با احتمال بسیار بالای رسیدن صحیح به مقصد منتقل می شوند. TCP یک پروتکل لایه انتقال مهم و انتها به انتهاست که داده را به شکل جریان بایت مدیریت می کند و برای هم کنش پذیری، رفتار های استاندارد و الزامی مشخصی دارد.
از سوی دیگر، TCP تضمین می کند داده ها به همان ترتیبی که فرستاده شده اند تحویل شوند؛ این همان ترتیب پذیری داده هاست که با sequence number و acknowledgment number مدیریت می شود. TCP همچنین دو نوع کنترل مهم انجام می دهد: کنترل جریان و کنترل ازدحام. کنترل جریان با advertised window یا rwnd مانع از این می شود که فرستنده بیش از توان گیرنده داده بفرستد و کنترل ازدحام با سازوکار هایی مثل slow start، congestion avoidance، fast retransmit و fast recovery از فشار بیش از حد به شبکه جلوگیری می کند. این رفتار ها در RFC 5681 استاندارد شده اند. TCP ارتباطی full-duplex ارائه می دهد، یعنی هر دو سمت می توانند هم زمان ارسال و دریافت داشته باشند؛ درست مثل یک مکالمه مؤدبانه که هر دو طرف می توانند حرف بزنند، البته بدون اینکه وسطش داد بزنند و شبکه را دل درد بدهند.
مفاهیم پایه در TCP
مفاهیم پایه در TCP، در واقع همان آجر های اصلی ای هستند که تمام رفتار این پروتکل بر آن ها بنا شده است. TCP برخلاف پروتکل های ساده تر، داده را به صورت یک جریان پیوسته از بایت ها می بیند، نه مجموعه ای از پیام های مستقل. به همین دلیل، مفاهیمی مثل stream، segment، port و socket در آن نقش اساسی دارند. هر ارتباط TCP بین دو فرآیند روی دو میزبان شکل می گیرد و این ارتباط با ترکیب آدرس های شبکه و شماره پورت ها معنا پیدا میکند. TCP یک سرویس reliable و in-order برای byte-stream ارائه می دهد و همین ویژگی، اساس طراحی بسیاری از برنامه های اینترنتی را تشکیل می دهد.
در همین چارچوب، Transmission Control Block یا TCB را می توان پروندهی مدیریتی هر اتصال TCP دانست؛ جایی که وضعیت اتصال، شماره های توالی، پنجره ها، بافر ها و سایر اطلاعات کنترلی نگهداری می شود. همین مفهوم است که به TCP اجازه می دهد چندین اتصال هم زمان را مدیریت کند و در عین حال، برای هر اتصال رفتار دقیق و مستقل داشته باشد. آشنایی با این مفاهیم پایه ضروری است، زیرا بدون آن ها فهم بخش های بعدی مثل هدر TCP، handshake، کنترل جریان و کنترل ازدحام تقریباً مثل تلاش برای خواندن نقشه مترو با چراغ قوه خاموش است. پس اگر بخواهیم TCP را واقعاً بفهمیم، باید اول زبان داخلی اش را یاد بگیریم: بایت، سگمنت، پورت، سوکت و TCB
ساختار هدر TCP
ساختار هدر TCP بخش بسیار مهمی از این پروتکل است، زیرا تقریباً تمام اطلاعات لازم برای مدیریت یک ارتباط قابل اعتماد در همین سربرگ قرار می گیرد. هدر TCP به طور معمول شامل پورت مبدأ و مقصد، شماره توالی، شماره تأییدیه، طول هدر، بیت های کنترلی، اندازه پنجره، checksum، اشاره گر اضطراری و گزینه ها است. این فیلد ها به TCP کمک می کنند تا تشخیص دهد هر سگمنت از کدام برنامه آمده، باید به کدام برنامه برود، داده ها در چه ترتیبی قرار دارند، کدام بخش ها دریافت شده اند و چقدر فضای خالی در سمت گیرنده وجود دارد.
از میان این فیل دها، بعضی نقش عملیاتی بسیار پر رنگ تری دارند. Sequence Number و Acknowledgment Number برای نظم دهی و تأیید دریافت داده ها استفاده می شوند؛ Window Size در کنترل جریان نقش دارد؛ Flags یا Control Bits مثل SYN، ACK، FIN و RST وضعیت های مختلف اتصال را مشخص می کنند؛ و Checksum برای تشخیص خطا در هدر و داده به کار می رود. همچنین بخش Options انعطاف پذیری TCP را بالا می برد و قابلیت هایی مثل MSS، Window Scaling، SACK و Timestamps را ممکن می کند. به همین دلیل، هدر TCP را می توان مغز عملیاتی این پروتکل دانست؛ بخشی که بدون آن، TCP فقط یک اسم جذاب بود، نه یک سیستم قابل اعتماد برای انتقال داده.
بیت ها و فلگ های کنترلی tcp
فلگها یا بیت های کنترلی TCP، زبان اشاره دار این پروتکل برای مدیریت وضعیت اتصال هستند؛ یعنی TCP با همین چند بیت کوچک مشخص می کند که یک سگمنت برای شروع اتصال است، تأیید دریافت است، پایان اتصال را اعلام می کند، یا نشان دهنده ی یک خطای جدی در ارتباط است. مهم ترین این فلگ ها SYN، ACK، FIN و RST هستند که به ترتیب برای هم زمان سازی شماره های توالی، تأیید دریافت، خاتمه ی اتصال و ریست کردن اتصال به کار می روند.
در کنار این ها، PSH و URG برای رفتار های خاص تر استفاده می شوند: PSH به گیرنده می فهماند که داده را سریع تر به لایه بالاتر تحویل دهد، و URG نشان می دهد که فیلد Urgent Pointer معتبر است و بخشی از داده باید سریع تر بررسی شود؛ هرچند در شبکه های مدرن، کاربرد URG بسیار کم رنگ تر از گذشته شده است. از سوی دیگر، ECE و CWR به سازوکار ECN مربوطاند و برای اعلام و پاسخ به ازدحام شبکه بدون نیاز به drop شدن بسته ها استفاده می شوند. بهطور خلاصه، ECE از گیرنده به فرستنده خبر می دهد که شبکه نشانه های ازدحام را دیده، و CWR پاسخ فرستنده است که نشان می دهد پنجره ازدحام کاهش یافته است. این فلگ ها در کنار هم رفتار اتصال را از یک ارتباط ساده ی «بفرست و امیدوار باش» به یک تعامل دقیق، هوشمند و قابل کنترل تبدیل می کنند.
شماره توالی و تأییدیه پروتکل TCP
برقراری اتصال در TCP با روشی به نام Three-Way Handshake انجام می شود؛ یعنی یک فرایند سه مرحله ای که قبل از تبادل داده، دو طرف را برای شروع ارتباط هماهنگ می کند. در مرحله اول، فرستنده یک سگمنت با فلگ SYN می فرستد تا درخواست آغاز اتصال را اعلام کند. در مرحله دوم، گیرنده با یک پاسخ SYN+ACK هم درخواست را می پذیرد و هم شماره توالی خود را اعلام می کند. در مرحله سوم، فرستنده با ACK این تبادل را تأیید می کند و اتصال به حالت established می رسد. این فرایند باعث می شود هر دو سمت از وضعیت یکدیگر، شماره های اولیه توالی و آمادگی برای انتقال داده مطمئن شوند.
اهمیت Three-Way Handshake فقط در شروع ارتباط نیست، بلکه در جلوگیری از خطا های ارتباطی هم نقش دارد. این مکانیزم کمک می کند بسته های قدیمی یا تکراری به اشتباه به عنوان اتصال جدید پذیرفته نشوند و دو میزبان قبل از ارسال داده، یک دید مشترک از وضعیت ارتباط داشته باشند. به همین دلیل، TCP برخلاف پروتکل های بی اتصال، قبل از حرف زدن اول از همه سلام و احوال پرسی رسمی می کند؛ کمی اداری است، اما برای اینترنت شلوغ و بی حوصله، همین نظم نجات بخش است. بعد از این مرحله، ارتباط آماده ی ارسال دادهی قابل اعتماد، منظم و دوطرفه می شود.
خاتمه اتصال در TCP
خاتمه ی اتصال در TCP معمولاً به صورت چهار مرحله ای انجام می شود، زیرا هر سمت ارتباط باید جداگانه اعلام کند که دیگر داده ای برای ارسال ندارد. وقتی یکی از طرفین تصمیم به پایان ارتباط می گیرد، با فلگ FIN این موضوع را اعلام می کند. طرف مقابل ابتدا این پایان را با ACK تأیید می کند و اگر خودش هم کاری برای ارسال نداشته باشد، در مرحله ای بعدی FIN می فرستد و دوباره ACK دریافت می کند. این روند باعث می شود ارتباط به صورت منظم و بدون از دست رفتن داده های باقی مانده بسته شود. در این فرایند، FIN و ACK نقش اصلی را دارند: FIN یعنی «من دیگر داده ای ندارم» و ACK یعنی «پیامت دریافت شد». همین تفکیک باعث می شود TCP بتواند حالت نیمه بسته یا half-closed را هم پشتیبانی کند؛ یعنی ممکن است یک سمت ارسال خود را تمام کرده باشد، اما هنوز از طرف مقابل داده دریافت کند. بعد از پایان کامل اتصال، یکی از سمت ها وارد حالت TIME-WAIT می شود. این حالت برای مدت مشخصی نگه داشته می شود تا بسته های تأخیری قدیمی در شبکه با یک اتصال جدید اشتباه گرفته نشوند و همچنین ACK نهایی در صورت نیاز دوباره قابل ارسال باشد. TIME-WAIT یکی از آن جزئیات کوچک اما مهم TCP است؛ مثل نگهبانی که بعد از بسته شدن در، چند لحظه هنوز کنار ورودی می ایستد تا مطمئن شود کسی از پشت در سر نخورده باشد.
کنترل جریان در پروتکل TCP
کنترل جریان در TCP مکانیزمی است که جلوی شلوغ شدن بیش از حد گیرنده را می گیرد. هدف این است که فرستنده با سرعتی بیشتر از توان پردازش یا فضای بافر گیرنده داده ارسال نکند. TCP برای این کار از Window Size یا به طور دقیق تر advertised window استفاده می کند؛ یعنی گیرنده در هدر TCP اعلام می کند چه مقدار فضای خالی برای دریافت داده دارد. فرستنده هم بر اساس همین مقدار، حجم داده ی در حال ارسال را تنظیم می کند. به این ترتیب، TCP از سرریز شدن بافر سمت گیرنده جلوگیری می کند و انتقال داده با ریتمی متناسب با توان مقصد ادامه می یابد.
در عمل کنترل جریان باعث می شود ارتباط پایدار تر و کارآمد تر باشد، مخصوصاً وقتی یک سمت ضعیف تر یا مشغول تر از سمت دیگر است. اگر گیرنده موقتاً نتواند داده بیشتری بپذیرد، می تواند پنجره را کوچک تر کند یا حتی به صفر برساند تا فرستنده صبر کند. وقتی دوباره فضا آزاد شد، پنجره افزایش می یابد و ارسال ادامه پیدا می کند. این مکانیزم با کنترل ازدحام فرق دارد؛ کنترل جریان به توانایی گیرنده مربوط است، اما کنترل ازدحام به وضعیت شبکه. TCP با ترکیب این دو هم از خفه شدن گیرنده جلوگیری می کند و هم شبکه را از فشار بیش از حد نجات می دهد. خلاصه اینکه کنترل جریان همان ترمز هوشمند TCP است؛ نه برای اینکه سرعت نگیرد، بلکه برای اینکه با سرعت درست برسد.
کنترل ازدحام در TCP
کنترل ازدحام در TCP سازوکاری است که کمک می کند شبکه زیر فشار بیش از حد نرود و بسته ها به خاطر شلوغی مسیر به صورت گسترده از بین نروند. برخلاف کنترل جریان که به توانایی گیرنده مربوط است، کنترل ازدحام به وضعیت خود شبکه نگاه می کند. TCP با مشاهده ی نشانه هایی مثل تأخیر، افت بسته ها یا اعلان های ECN، سرعت ارسال را تنظیم می کند تا از اشباع شدن لینک ها، بافر ها و روتر ها جلوگیری شود. این رفتار در عمل باعث می شود فرستنده فقط به اندازه ای داده بفرستد که شبکه توان حمل آن را داشته باشد، نه بیشتر.
در TCP کنترل ازدحام معمولاً با مفاهیمی مثل congestion window یا cwnd، slow start، congestion avoidance، fast retransmit و fast recovery شناخته می شود. در آغاز ارتباط، TCP آهسته شروع می کند و به تدریج نرخ ارسال را بالا می برد تا ظرفیت واقعی شبکه را حدس بزند؛ اگر نشانه ای از ازدحام دیده شود، سرعت را کاهش می دهد. این رفتار شبیه رانندگی در جاده ای است که اول آرام حرکت می کنید، بعد با دیدن ترافیک گاز را کم میکنید، نه اینکه مستقیم تا ته پدال را فشار بدهید. نتیجه این است که TCP هم کارایی خوبی دارد و هم با دیگر جریاندهای شبکه منصفانه تر رفتار می کند.
جمع بندی
TCP یکی از مهم ترین پروتکل های لایه انتقال است که با تکیه بر ساختار دقیق هدر، فلگ های کنترلی، شماره های توالی و تأییدیه، و سازوکار های مدیریت اتصال، انتقال داده را قابل اعتماد و منظم می کند. این پروتکل فقط بسته ها را جا به جا نمی کند، بلکه بر ترتیب، صحت، تأیید، آغاز و پایان ارتباط هم نظارت دارد. به همین دلیل، TCP برای کاربرد هایی که دقت و اطمینان در آن ها مهم است، انتخابی بنیادی محسوب می شود.
در این مقاله دیدیم که هر بخش از TCP نقشی مشخص و ضروری دارد: از SYN و ACK در برقراری اتصال تا FIN و TIME-WAIT در خاتمهی آن، و از کنترل جریان برای جلوگیری از فشار روی گیرنده تا کنترل ازدحام برای محافظت از شبکه. در واقع قدرت TCP در همین هماهنگی میان این سازوکارها ست؛ هماهنگی ای که باعث می شود داده ها نه فقط برسند، بلکه درست، کامل و به موقع برسند. اگر بخواهیم TCP را در یک جمله توصیف کنیم، باید گفت: پروتکلی دقیق، محتاط و بسیار منظم که ستون اصلی ارتباطات قابل اعتماد در اینترنت است.

نظرات کاربران