جزوه جامع و تخصصی پروتکل TCP بر پایه استاندارد RFC 9293
بخش ۱: مقدمه، جایگاه و تحولات تاریخی (از RFC 793 تا RFC 9293)
پروتکل کنترل انتقال (Transmission Control Protocol - TCP) یکی از حیاتیترین پروتکلهای لایه انتقال در پشته پروتکلهای اینترنت است که سرویس ارتباطی مطمئن، با حفظ ترتیب و مبتنی بر جریان بایتی (Byte-Stream) را برای برنامههای کاربردی فراهم میسازد.
۱.۱. جایگاه RFC 9293 و تثبیت استاندارد STD 7
پروتکل TCP در سال ۱۹۸۱ طی سند RFC 793 به صورت رسمی پایهگذاری شد. طی چهار دهه گذشته، همزمان با رشد و گسترش اینترنت، اصلاحات، بهبودهای امنیتی و بهینهسازیهای کارایی متعددی در قالب RFCهای جداگانه منتشر شدند. این پراکندگی اسناد، پیادهسازی و ارزیابی انطباق (Conformance) سیستمها را با چالش مواجه میکرد. سند RFC 9293 با هدف گردآوری، یکپارچهسازی و شفافسازی تمام الزامات استاندارد عملکردی TCP تدوین شده است. این سند رسماً وضعیت STD 7 (استاندارد رسمی اینترنت) را تثبیت کرده و جانشین مشخصات عملکردی قبلی شده است.
۱.۲. تغییرات تاریخی و وضعیت اسناد مرتبط
RFC 9293 تغییرات ساختاری زیر را در مجموعه اسناد IETF ایجاد کرده است:
- اسناد کاملاً منسوخشده (Obsoleted RFCs): این سند رسماً RFC 793 و همچنین اسناد مکمل RFC 879، RFC 2873، RFC 6093، RFC 6429، RFC 6528 و RFC 6691 را منسوخ و جایگزین کرده است.
- اسناد بهروزرسانیشده (Updated RFCs): بخشهای مربوط به الزامات TCP در اسناد RFC 1011 و RFC 1122 به روزرسانی شده و RFC 9293 جایگزین بخشهای لایه انتقال آنها محسوب میشود. همچنین سند RFC 5961 (در رابطه با مدیریت قطعات Reset در وضعیت SYN-RECEIVED) دچار شفافسازی و اصلاح جزئی شده است.
- بهروزرسانی پرچمهای هدر: بیتهای کنترلی هدر TCP که در RFC 793 تعریف شده بودند، با افزودن پرچمهای CWR و ECE بر اساس RFC 3168 بهروزرسانی شدهاند.
| سند قدیمی | وضعیت در RFC 9293 | موضوع / دلیل تغییر |
|---|---|---|
| RFC 793 | Obsoleted (منسوخ) | سند پایه اولیه TCP؛ کاملاً یکپارچه و بهروزرسانی شد. |
| RFC 6528 | Obsoleted (منسوخ) | تولید امن شماره تسلسل اولیه (ISN)؛ متن آن وارد سند اصلی شد. |
| RFC 6691 | Obsoleted (منسوخ) | شفافسازی محاسبات گزینه MSS و هدرها؛ در متن اصلی ادغام شد. |
| RFC 6093 | Obsoleted (منسوخ) | اصلاح و شفافسازی مکانیزم Urgent Pointer؛ ادغام شد. |
| RFC 6429 | Obsoleted (منسوخ) | رفتار TCP در زمان مسدود بودن پنجره (Zero Window)؛ ادغام شد. |
| RFC 5961 | Updated (بهروزرسانی) | افزودن شفافسازی در نحوه پردازش Reset در حالت SYN-RECEIVED. |
۱.۳. ویژگیها و مفاهیم بنیادی TCP
۱. سرویس جریان بایتی (Byte-Stream): برنامههای کاربردی دادهها را به صورت جریانی پیوسته از بایتها تحویل TCP میدهند. مرز قطعات TCP الزماً منطبق بر مرزهای فراخوانی نوشتن (Write/Send) برنامه نیست.
۲. ارتباط مبتنی بر اتصال (Connection-Oriented): پیش از تبادل داده، دو نقطه انتخابی باید از طریق دستتکانی سهمرحلهای روی پارامترهای اولیه توافق کنند.
۳. جریان دوطرفه همزمان (Full-Duplex): دادهها میتوانند به طور همزمان در هر دو جهت مبادله شوند.
۴. تسهیم و واسپاری (Multiplexing): با استفاده از شماره پورتها (Port Numbers)، جریانهای متعدد بین میزبانها تفکیک میشوند. یک اتصال TCP به طور منحصربهفرد با سوکتهای مبدا و مقصد تعریف میشود: .
۵. تحویل تکپخشی (Unicast): TCP اساساً برای ارتباطات نقطه-به-نقطه طراحی شده است.
بخش ۲: ساختار کامل هدر TCP و گزینهها (Header Format & Options)
قطعات TCP به عنوان بارگذاری (Payload) درون داتاگرامهای IP (نسخه ۴ یا ۶) حمل میشوند. هدر TCP شامل فیلدهای کنترلی جهت مدیریت وضعیت، اطمینان از صحت دادهها و کنترل جریان است.
۲.۱. ساختار بیتبهبیت هدر TCP
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |C|E|U|A|P|R|S|F| | | Offset| Rsrvd |W|C|R|C|S|S|Y|I| Window | | | |R|E|G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | [Options] | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | : : Data : : | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
۲.۲. تشریح فیلدهای هدر
- Source Port (۱۶ بیت): شماره پورت فرستنده.
- Destination Port (۱۶ بیت): شماره پورت گیرنده.
- Sequence Number (۳۲ بیت): شماره تسلسل اولین بایت داده در این قطعه. اگر پرچم SYN فعال باشد، این فیلد حاوی شماره تسلسل اولیه (ISN) است و اولین بایت داده دارای شماره $ISN + 1$ خواهد بود.
- Acknowledgment Number (۳۲ بیت): اگر بیت ACK فعال باشد، این فیلد حاوی شماره تسلسل بایت بعدی است که فرستنده قطعه انتظار دریافت آن را دارد. پس از برپایی اتصال، این بیت همواره ارسال میشود.
- Data Offset (۴ بیت): تعداد کلمات ۳۲ بیتی (۴ بایتی) در هدر TCP. این فیلد محل شروع دادهها را مشخص میکند. حداقل مقدار آن ۵ (۲۰ بایت) و حداکثر ۱۵ (۶۰ بایت) است.
- Reserved (Rsrvd) (۴ بیت): بیتهای رزرو شده برای کاربردهای آینده. باید در قطعات تولیدی صفر باشند و در قطعات دریافتی نادیده گرفته شوند.
- Control Bits (پرچمها - ۸ بیت):
- CWR (Congestion Window Reduced): نشاندهنده کاهش پنجره ازدحام توسط فرستنده (بر پایه RFC 3168).
- ECE (ECN-Echo): نشاندهنده دریافت هشدار ازدحام صریح در لایه IP (بر پایه RFC 3168).
- URG (Urgent): نشاندهنده معتبر بودن فیلد Urgent Pointer.
- ACK (Acknowledgment): نشاندهنده معتبر بودن فیلد Acknowledgment Number.
- PSH (Push): درخواست از پیادهسازی TCP برای تحویل سریع دادهها به برنامه کاربردی.
- RST (Reset): راه اندازی مجدد یا بازنشانی اتصال.
- SYN (Synchronize): هماهنگسازی شمارههای تسلسل در مرحله برپایی اتصال.
- FIN (Finish): پایان ارسال داده از طرف فرستنده.
- Window (۱۶ بیت): اندازه پنجره دریافت که فرستنده قطعه تمایل به دریافت آن دارد (بر حسب بایت). این عدد به صورت علامتنزده (Unsigned) پردازش میشود (MUST-1).
- Checksum (۱۶ بیت): متمم یکِ حاصلجمع متمم یکِ تمامی کلمات ۱۶ بیتی هدر، دادهها و شبههدر (Pseudo-header). محاسبه و بررسی Checksum اجباری است (MUST-2 و MUST-3).
- Urgent Pointer (۱۶ بیت): جابهجایی مثبت (Offset) نسبت به Sequence Number که بایت پایانی دادههای فوری را مشخص میسازد (تنها در صورت فعال بودن بیت URG معتبر است).
- Options (متغیر): گزینههای اختیاری که طول آنها باید ضریبی از ۸ بیت باشد.
۲.۳. شبههدر (Pseudo-header) و محاسبه Checksum
برای حفاظت در برابر هدایت نادرست قطعات در لایه شبکه، Checksum علاوه بر هدر و دادههای TCP، یک «شبههدر» فرضی را نیز پوشش میدهد.
+--------+--------+--------+--------+ | Source Address | +--------+--------+--------+--------+ | Destination Address | +--------+--------+--------+--------+ | zero | PTCL | TCP Length | +--------+--------+--------+--------+
- در IPv4 (۹۶ بیت / ۱۲ بایت): آدرس مبدا (۴ بایت)، آدرس مقصد (۴ بایت)، بایت صفر (۱ بایت)، عدد پروتکل (PTCL = 6، ۱ بایت) و طول قطعه TCP شامل هدر و داده (۲ بایت).
- در IPv6 (۳۲۰ بیت / ۴۰ بایت): آدرس مبدا (۱۶ بایت)، آدرس مقصد (۱۶ بایت)، طول لایه بالاتر (Upper-Layer Packet Length، ۴ بایت)، ۳ بایت صفر، و Next Header (۱ بایت با مقدار ۶).
۲.۴. گزینههای TCP (TCP Options)
گزینهها میتوانند فرمت تک بایتی یا چندبایتی (نوع / طول / داده) داشته باشند.
گزینههای الزامی (Mandatory Options Set)
طبق RFC 9293، تمام پیادهسازیهای TCP باید سه گزینه زیر را پشتیبانی کنند (MUST-4):
- End of Option List (EOL) - Kind 0: طول ۱ بایت. نشاندهنده پایان فهرست گزینهها در هدر است.
- No-Operation (NOP) - Kind 1: طول ۱ بایت. برای تراز کردن (Alignment) گزینههای بعدی روی مرزهای کلمه (Word) استفاده میشود.
- Maximum Segment Size (MSS) - Kind 2: طول ۴ بایت (Kind=2, Length=4, MSS Value=2 Bytes). حداکثر اندازه قطعه دریافتی را اعلام میکند. این گزینه فقط در قطعات اولیه برپایی اتصال (دارای بیت SYN) ارسال میشود (MUST-65).
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 2 | Length=4 | Maximum Segment Size (MSS) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
گزینههای متداول کارایی بالا (High-Performance Options)
- Window Scale (WS): برای افزایش اندازه پنجره به بیش از ۶۴ کیلوبایت (بر پایه RFC 7323).
- Timestamps (TS): برای اندازهگیری دقیق RTT و حفاظت در برابر شمارههای تسلسل پیچیدهشده (PAWS).
- Selective Acknowledgment (SACK): برای اعلام قطعات دریافت شده غیرمتوالی و تسریع در بازبازسازی قطعات گمشده.
قواعد پردازش گزینهها
- پیادهسازی TCP باید توانایی دریافت گزینهها را در هر قطعهای داشته باشد (MUST-5).
- گزینههای ناشناختهای که طول معتبر دارند باید بدون بروز خطا نادیده گرفته شوند (MUST-6).
- تمام گزینهها (به جز EOL و NOP) باید دارای فیلد طول باشند (MUST-68).
- در صورت مواجهه با طول گزینه غیرمجاز (مثلاً صفر)، پیادهسازی TCP باید اتصال را بازنشانی (Reset) کرده و خطا را ثبت کند (MUST-7).
بخش ۳: فضای شماره تسلسل و تاییدیه (Sequence Numbers & Sequence Space)
۳.۱. حساب پیمانهای (Modulo $2^{32}$ )
تمامی محاسبات مرتبط با شمارههای تسلسل، تاییدیهها و پنجرهها در فضای محدود $0$ تا $2^{32}-1$ و به صورت حساب پیمانهای Modulo $2^{32}$ انجام میپذیرد. در این محاسبات، نماد => به معنی "کوچکتر یا مساوی در فضای پیمانهای" است.
۳.۲. متغیرهای حالت اتصال (TCB State Variables)
برای هر اتصال، یک بلوک کنترل انتقال (TCB) نگهداری میشود که متغیرهای زیر در آن ذخیره میگردند:
متغیرهای ارسال (Send Sequence Variables)
- SND.UNA: قدیمیترین شماره تسلسل تاییدنشده (Send Unacknowledged).
- SND.NXT: شماره تسلسل بعدی برای ارسال (Send Next).
- SND.WND: اندازه پنجره ارسال (Send Window).
- SND.UP: اشارهگر دادههای فوری ارسال (Send Urgent Pointer).
- SND.WL1: شماره تسلسل قطعه بهکاررفته برای آخرین بهروزرسانی پنجره.
- SND.WL2: شماره تاییدیه قطعه بهکاررفته برای آخرین بهروزرسانی پنجره.
- ISS: شماره تسلسل اولیه ارسال (Initial Send Sequence Number).
1 2 3 4
----------|----------|----------|----------
SND.UNA SND.NXT SND.UNA
+SND.WND
1 - شمارههای تسلسل قدیمی که تایید شدهاند
2 - شمارههای تسلسل دادههای ارسالشده اما تاییدنشده
3 - شمارههای تسلسل مجاز برای ارسال دادههای جدید
4 - شمارههای تسلسل آینده که هنوز مجاز نیستند
متغیرهای دریافت (Receive Sequence Variables)
- RCV.NXT: شماره تسلسل بعدی مورد انتظار برای دریافت (Receive Next).
- RCV.WND: اندازه پنجره دریافت (Receive Window).
- RCV.UP: اشارهگر دادههای فوری دریافت (Receive Urgent Pointer).
- IRS: شماره تسلسل اولیه دریافت (Initial Receive Sequence Number).
1 2 3
----------|----------|----------
RCV.NXT RCV.NXT
+RCV.WND
1 - شمارههای تسلسل قدیمی که تایید شدهاند
2 - شمارههای تسلسل مجاز برای دریافت دادههای جدید
3 - شمارههای تسلسل آینده که هنوز مجاز نیستند
مت متغیرهای قطعه جاری (Current Segment Variables)
- SEG.SEQ: شماره تسلسل قطعه.
- SEG.ACK: شماره تاییدیه قطعه.
- SEG.LEN: طول فضای تسلسل اشغالشده توسط قطعه (شامل بایتهای داده + بیتهای SYN/FIN).
- SEG.WND: اندازه پنجره قطعه.
- SEG.UP: اشارهگر فوری قطعه.
۳.۳. آزمونهای پذیرش قطعات (Segment Acceptability Tests)
یک قطعه ورودی در صورتی معتبر و قابل قبول است که با پنجره دریافت همپوشانی داشته باشد:
| طول قطعه (SEG.LEN) | اندازه پنجره دریافت (RCV.WND) | شرط پذیرش قطعه (Acceptability Test) |
|---|---|---|
| $0$ | $0$ | SEG.SEQ = RCV.NXT |
| $0$ | $>0$ | RCV.NXT <= SEG.SEQ < RCV.NXT + RCV.WND |
| $>0$ | $0$ | غیرقابل قبول (Not Acceptable) |
| $>0$ | $>0$ |
RCV.NXT <= SEG.SEQ < RCV.NXT + RCV.WND یا RCV.NXT <= SEG.SEQ + SEG.LEN - 1 < RCV.NXT + RCV.WND |
۳.۴. مفهوم Quiet Time و طول عمر قطعه (MSL)
برای جلوگیری از سردرگمی قطعات سرگردان قدیمی (Old Duplicates) متعلق به تجسمهای قبلی (Previous Incarnations) یک اتصال، مفهوم MSL (Maximum Segment Lifetime) برابر با ۲ دقیقه تعیین شده است. اگر گرهای دچار راهاندازی مجدد (Reboot) شود و حافظه شمارههای تسلسل خود را از دست بدهد، باید به مدت یک MSL (Quiet Time) از ارسال قطعات خودداری کند، مگر اینکه از روشهای ذخیرهسازی زمان یا تولید امن ISN بهره ببرد.
بخش ۴: برپایی و خاتمه اتصال (Connection Lifecycle)
۴.۱. دستتکانی ۳ مرحلهای (Three-Way Handshake - 3WHS)
برای برپایی اتصال، دو طرف باید شمارههای تسلسل اولیه یکدیگر (ISS و IRS) را همگامسازی نمایند.
TCP Peer A TCP Peer B 1. CLOSED LISTEN 2. SYN-SENT --> <SEQ=100><CTL=SYN> --> SYN-RECEIVED 3. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED 4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED 5. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED
۴.۲. باز شدن همزمان (Simultaneous Open)
TCP باید از تلاشهای همزمان دو گره برای باز کردن اتصال پشتیبانی کند (MUST-10). در این حالت، هر دو طرف قطعه SYN بدون ACK ارسال میکنند و وضعیت آنها از SYN-SENT به SYN-RECEIVED تغییر مییابد.
TCP Peer A TCP Peer B 1. CLOSED CLOSED 2. SYN-SENT --> <SEQ=100><CTL=SYN> ... 3. SYN-RECEIVED <-- <SEQ=300><CTL=SYN> <-- SYN-SENT 4. ... <SEQ=100><CTL=SYN> --> SYN-RECEIVED 5. SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ... 6. ESTABLISHED <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED 7. ... <SEQ=100><ACK=301><CTL=SYN,ACK> --> ESTABLISHED
۴.۳. اتصالات نیمهباز (Half-Open Connections) و قطع اضطراری (Reset)
اتصال زمانی نیمهباز تلقی میشود که یکی از طرفین بدون اطلاع دیگری اتصال را بسته یا دچار Crash/Reboot شده باشد.
TCP Peer A TCP Peer B 1. (REBOOT) (send 300,receive 100) 2. CLOSED ESTABLISHED 3. SYN-SENT --> <SEQ=400><CTL=SYN> --> (??) 4. (!!) <-- <SEQ=300><ACK=100><CTL=ACK> <-- ESTABLISHED 5. SYN-SENT --> <SEQ=100><CTL=RST> --> (Abort!!) 6. SYN-SENT CLOSED
قواعد تولید قطعه Reset (RST)
- حالت CLOSED: اگر قطعه ورودی متناظر با هیچ اتصالی نباشد، RST ارسال میشود. اگر قطعه ورودی ACK داشته باشد، شماره تسلسل RST برابر با SEG.ACK خواهد بود؛ در غیر این صورت SEQ=0 و ACK = SEG.SEQ + SEG.LEN.
- حالتهای غیرهمگام (LISTEN, SYN-SENT, SYN-RECEIVED): اگر قطعه ورودی حاوی تاییدیه نامعتبر (Unacceptable ACK) باشد یا سطح امنیت/کمپارتمنت آن تطابق نداشته باشد، RST ارسال میشود.
- حالتهای همگام (ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, etc.): اگر قطعه نامعتبر (خارج از پنجره) برسد، یک ACK خالی صادر میشود. اما اگر سطح امنیت تطابق نداشته باشد، RST ارسال شده و اتصال به CLOSED میرود.
قواعد پردازش قطعه Reset
در تمامی حالتها (به جز SYN-SENT)، قطعه RST در صورتی معتبر است که شماره تسلسل آن درون پنجره دریافت قرار داشته باشد (SEG.SEQ in window). در حالت SYN-SENT، قطعه RST زمانی معتبر است که فیلد ACK آن، قطعه SYN ارسال شده را تایید کند.
۴.۴. خاتمه اتصال (Closing a Connection)
خاتمه اتصال در TCP یک پروسه دوطرفه مجزا (Simplex) است.
فرآیند بسته شدن عادی (Normal Close)
TCP Peer A TCP Peer B
1. ESTABLISHED ESTABLISHED
2. (Close)
FIN-WAIT-1 --> <SEQ=100><ACK=300><CTL=FIN,ACK> --> CLOSE-WAIT
3. FIN-WAIT-2 <-- <SEQ=300><ACK=101><CTL=ACK> <-- CLOSE-WAIT
4. (Close)
TIME-WAIT <-- <SEQ=300><ACK=101><CTL=FIN,ACK> <-- LAST-ACK
5. TIME-WAIT --> <SEQ=101><ACK=301><CTL=ACK> --> CLOSED
6. (2 MSL)
CLOSED
اتصال نیمهبسته (Half-Closed Connection)
اگر طرف A اقدام به بستن اتصال کند، فاز ارسال او متوقف میشود اما همچنان میتواند تا زمان دریافت FIN از طرف B، دادهها را در جهت دریافت کند.
وضعیت TIME-WAIT
گرهای که اقدام به بستن فعال (Active Close) میکند، باید به مدت $2 \times \text{MSL}$ (۴ دقیقه) در وضعیت TIME-WAIT باقی بماند (MUST-13). اهداف TIME-WAIT:
۱. اطمینان از دریافت ACK نهایی توسط طرف مقابل.
۲. اتمام طول عمر قطعات سرگردان قبلی در شبکه قبل از بازگشایی اتصال جدید با همان سوکتها.
بخش ۵: قطعهبندی، کنترل جریان و کنترل ازدحام (Segmentation, Flow & Congestion Control)
۵.۱. قطعهبندی و محاسبه MSS موثر ارسال (Effective Send MSS)
پیادهسازی TCP باید ارسال و دریافت گزینه MSS را پشتیبانی کند (MUST-14). در صورت عدم دریافت گزینه MSS در فاز برپایی، مقدار پیشفرض MSS ارسال برابر با ۵۳۶ بایت برای IPv4 و ۱۲۲۰ بایت برای IPv6 فرض میشود (MUST-15). محاسبه Effective Send MSS طبق رابطه زیر انجام میشود (MUST-16):
که در آن:
- SendMSS: مقدار MSS دریافت شده از میزبان مقابل (یا مقدار پیشفرض).
- MMS_S: حداکثر اندازه پیام لایه حمل که IP میتواند ارسال کند.
- TCPhdrsize: اندازه هدر TCP شامل گزینهها.
- IPoptionsize: اندازه گزینههای IP یا هدرهای توسعهای IPv6.
۵.۲. کشف MTU مسیر (Path MTU Discovery)
برای جلوگیری از شکستن داتاگرامها (Fragmentation) در طول مسیر، استفاده از مکانیزمهای PMTUD (بر پایه پیامهای ICMP و بیت DF) و PLPMTUD (بدون وابستگی به ICMP) به شدت توصیه شده است.
۵.۳. الگوریتم نیگل (Nagle Algorithm)
برای جلوگیری از ازدحام ناشی از ارسال قطعات بسیار کوچک (مثلاً در برنامههای Interactive مانند Telnet)، الگوریتم نیگل (RFC 896) پیادهسازی میشود (SHLD-7):
- اگر داده تاییدنشدهای در جریان باشد (SND.NXT > SND.UNA)، تمام دادههای جدید کاربر تا زمان دریافت تاییدیه یا تا زمان رسیدن حجم داده به یک قطعه کامل (Eff.snd.MSS) بافر میشوند.
- برنامه کاربردی باید قادر باشد الگوریتم نیگل را برای هر اتصال به طور مجزا غیرفعال کند (MUST-17).
۵.۴. مدیریت پنجره و پرهیز از سندرم پنجره احمقانه (Silly Window Syndrome - SWS)
پدیده SWS حالتی است که در آن پنجره دریافت با مقادیر بسیار کوچک حرکت کرده و بازده شبکه را به شدت کاهش میدهد.
الگوریتم SWS در سمت فرستنده
فرستنده باید از ارسال قطعات کوچک خودداری کند (MUST-38). داده جدید تنها زمانی ارسال میشود که یکی از شروط زیر برقرار باشد:
۱. امکان ارسال یک قطعه با حداکثر اندازه وجود داشته باشد: $\min(D, U) \ge \text{Eff.snd.MSS}$
۲. داده دارای برچسب PUSH بوده و کل داده بافر شده قابل ارسال باشد.
۳. حداقل کسر $F_s$ (مقدار پیشنهادی $1/2$ ) از حداکثر پنجره مشاهده شده قابل ارسال باشد: $\min(D, U) \ge F_s \times \text{Max}(\text{SND.WND})$
۴. تایمآوت اورراید (Override Timeout) بین $0.1$ تا $1.0$ ثانیه رخ دهد.
الگوریتم SWS در سمت گیرنده
گیرنده نباید لبه راست پنجره را مقادیر کوچک به سمت راست ببرد (MUST-39). لبه راست پنجره ثابت میماند تا زمانی که فضای خالی ایجاد شده شرط زیر را برآورده سازد:
که در آن $F_r = 1/2$ پیشنهاد میشود.
۵.۵. پردturbation/پروب پنجره صفر (Zero-Window Probing - ZWP)
اگر گیرنده پنجره دریافت خود را صفر اعلام کند (SND.WND = 0)، فرستنده ارسال دادههای جدید را متوقف میکند. اما برای جلوگیری از بنبست (Deadlock) در صورت گم شدن قطعه بهروزرسانی پنجره، فرستنده اقدام به ارسال قطعات ارزیابی یا ZWP مینماید (MUST-36).
- قطعه پروب حاوی ۱ بایت داده است.
- تا زمانی که گیرنده به قطعات پروب با ACK (که حاوی پنجره صفر است) پاسخ میدهد، فرستنده باید اتصال را باز نگه دارد (MUST-37).
- فواصل ارسال پروبها باید به صورت نمایی افزایش یابد (Exponential Backoff).
۵.۶. تاییدیههای به تاخیر افتاده (Delayed ACKs)
برای کاهش بار شبکه، گیرنده میتواند ارسال ACK را به تاخیر بیندازد (SHLD-18):
- میزان تاخیر باید کمتر از ۰.۵ ثانیه باشد (MUST-40).
- تاییدیه باید حداقل برای هر دومین قطعه با اندازه کامل (Full-Sized Segment) صادر شود (SHLD-19).
۵.۷. کنترل ازدحام و RTO
پیادهسازی TCP باید الگوریتمهای پایه کنترل ازدحام شامل Start Slow ، Congestion Avoidance و Exponential Backoff را برای RTO طبق RFC 5681 و RFC 6298 پشتیبانی کند (MUST-19).
تایمآوت بازارسال (Retransmission Timeout - RTO)
تایمآوت بازارسال بر اساس تخمین زمان رفتوبرگشت (RTT) و الگوریتم Karn (عدم نمونهبرداری RTT از قطعات بازارسالشده) محاسبه میشود (MUST-18).
مدیریت شکست اتصال (Connection Failures)
TCP دارای دو آستانه retransmission است (MUST-20):
- آستانه R1: در صورت رسیدن تعداد بازارسالها به R1، هشدار به لایه IP برای تشخیص Dead-Gateway داده میشود. R1 باید حداقل متناظر با ۳ بار بازارسال باشد (SHLD-10).
- آستانه R2: در صورت رسیدن به R2، اتصال قطع میشود. R2 باید حداقل متناظر با ۱۰۰ ثانیه باشد (SHLD-11).
- برای قطعات SYN، مقدار R2 باید امکان تلاش مجدد را حداقل به مدت ۳ دقیقه فراهم کند (MUST-23).
بخش ۶: رابط کاربری برنامهنویسی و توابع سیستمعاملی (User/TCP Interface)
توابع سیستمعاملی انتزاعی ارائه شده در RFC 9293 نحوه تعامل برنامه کاربردی با بلوک کنترل انتقال (TCB) را تعریف میکنند.
۶.۱. تشریح توابع API و نحوه تعامل با TCB
۱. تابع OPEN
OPEN (local port, remote socket, active/passive [, timeout] [, Diffserv field]
[, security/compartment] [, local IP address] [, options])
-> local connection name
- عملکرد: TCB جدیدی ایجاد کرده و آن را مقداردهی اولیه میکند.
- حالت Passive: TCB به حالت LISTEN میرود. میتواند سوکت مقصد مشخص داشته یا مشخصنشده (Unspecified) باشد. فراخوانی Passive نباید بر اتصالاتی که قبلاً ساخته شدهاند تاثیر بگذارد (MUST-41).
- حالت Active: بلافاصله فرآیند ارسال قطعه SYN و تغییر حالت به SYN-SENT را آغاز میکند.
- پارامتر local IP address: در سیستمهای چندآدرسی (Multihomed)، برنامه میتواند IP مبدا را تعیین کند (MUST-43). اگر تعیین نشود، لایه IP پیش از ارسال SYN آن را انتخاب میکند (MUST-44).
- اعتبارسنجی: آدرسهای مقصد Broadcast یا Multicast باید رد شوند (MUST-46).
۲. تابع SEND
SEND (local connection name, buffer address, byte count, URGENT flag
[, PUSH flag] [, timeout])
- عملکرد: دادههای بافر تعیینشده را روی اتصال مربوطه ارسال میکند.
- برچسب PSH: اگر پشتیبانی شود، بیت PSH در آخرین قطعه تولیدشده از بافر قرار میگیرد. اگر پشتیبانی نشود، TCP نباید دادهها را به طور نامحدود بافر کند (MUST-60) و بیت PSH را در آخرین قطعه موجود ست میکند (MUST-61).
- برچسب URGENT: اشارهگر دادههای فوری (SND.UP) را بهروزرسانی میکند. (نکته: برنامههای جدید نباید از Urgent استفاده کنند - SHLD-13).
۳. تابع RECEIVE
RECEIVE (local connection name, buffer address, byte count)
-> byte count, URGENT flag [, PUSH flag]
- عملکرد: بافری را برای دریافت داده اختصاص میدهد.
- در صورت وجود دادههای بافرشده، بافر پر شده و کنترل به برنامه برمیگردد. مشاهده بیت PSH باعث بازگشت سریع بافر به برنامه میشود.
۴. تابع CLOSE
CLOSE (local connection name)
- عملکرد: بستن محترمانه (Graceful Close) اتصال.
- به معنی "داده دیگری برای ارسال ندارم" است. ارسال دادههای قبلی در صف انجام شده و سپس قطعه FIN ارسال میگردد. برنامه همچنان میتواند داده دریافت کند.
۵. تابع ABORT
ABORT (local connection name)
- عملکرد: قطع فوری و غیرمحترمانه اتصال.
- تمامی صفهای ارسال و دریافت تخلیه شده، یک قطعه به طرف مقابل ارسال شده، TCB حذف و اتصال به حالت CLOSED میرود.
۶. تابع STATUS
STATUS (local connection name) -> status data
- عملکرد: استخراج اطلاعات از TCB متناظر مانند سوکتهای مبدا/مقصد، اندازه پنجرههای ارسال/دریافت، حالت جاری اتصال، تعداد بافرهای در انتظار تایید و وضعیت دادههای فوری.
۷. تابع FLUSH
FLUSH (local connection name)
- عملکرد: تمامی دادههای موجود در صف ارسال را که هنوز سمت راست پنجره ارسال قرار دارند تخلیه (پاک) میکند بدون اینکه همگامسازی شماره تسلسل برهم بخورد (پیادهسازی اختیاری - MAY-14).
۶.۲. گزارشهای ناهمگام (Asynchronous Reports)
پیادهسازی TCP باید مکانیزمی برای گزارش ناهمگام خطاهای نرم (Soft Errors) به برنامه ارائه دهد (MUST-47): ERROR_REPORT(local connection name, reason, subreason) این رویدادها شامل رسیدن پیامهای ICMP، بازارسالهای بیش از حد (R1) و پیشروی اشارهگر Urgent هستند. برنامه کاربردی باید بتواند دریافت این گزارشها را غیرفعال کند (SHLD-20).
۶.۳. تنظیم فیلد Differentiated Services (DSCP) و TTL
- برنامه کاربردی باید بتواند فیلد Diffserv (کد 6 بیتی DSCP) را برای قطعات خروجی تعیین کند (MUST-48).
- پارامتر Time to Live (TTL) برای قطعات خروجی باید قابل پیکربندی باشد (MUST-49).
بخش ۷: پردازش دقیق رویدادها و ماشین حالت (Event Processing & State Machine)
۷.۱. خلاصه حالتهای ۱۱ گانه ماشین حالت TCP
۱. LISTEN: در انتظار دریافت درخواست اتصال (SYN) از هر سوکت راه دور.
۲. SYN-SENT: ارسال درخواست اتصال (SYN) و در انتظار دریافت تاییدیه و SYN طرف مقابل.
۳. SYN-RECEIVED: دریافت و ارسال SYN؛ در انتظار دریافت تاییدیه (ACK).
۴. ESTABLISHED: اتصال باز است؛ فاز انتقال عادی دادهها.
۵. FIN-WAIT-1: ارسال FIN؛ در انتظار FIN یا ACKِ FIN از طرف مقابل.
۶. FIN-WAIT-2: دریافت ACKِ FIN؛ در انتظار دریافت FIN از طرف مقابل.
۷. CLOSE-WAIT: دریافت FIN از طرف مقابل؛ در انتظار درخواست CLOSE از برنامه کاربردی محلی.
۸. CLOSING: ارسال FIN و دریافت FIN همزمان؛ در انتظار ACKِ FIN.
۹. LAST-ACK: ارسال FIN پس از CLOSE-WAIT؛ در انتظار ACKِ FIN.
۱۰. TIME-WAIT: انتظار به مدت $2 \times \text{MSL}$ جهت اطمینان از دریافت ACK نهایی توسط مقصد.
۱۱. CLOSED: حالت فرضی؛ اتصال و TCB وجود ندارد.
۷.۲. دیاگرام متنی انتقال حالتها
+---------+ ---------\ active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | | CLOSE \ \
------------ | | ---------- \ \
create TCB | | delete TCB \ \
V | \ \
rcv RST (note 1) +---------+ CLOSE | \
-------------------->| LISTEN | ---------- | |
/ +---------+ delete TCB | |
/ rcv SYN | | SEND | |
/ ----------- | | ------- | V
+--------+ snd SYN,ACK / \ snd SYN +--------+
| |<----------------- ------------------>| |
| SYN | rcv SYN | SYN |
| RCVD |<-----------------------------------------------| SENT |
| | snd SYN,ACK | |
| |------------------ -------------------| |
+--------+ rcv ACK of SYN \ / rcv SYN,ACK +--------+
| -------------- | | -----------
| x | | snd ACK
| V V
| CLOSE +---------+
| ------- | ESTAB |
| snd FIN +---------+
| CLOSE | | rcv FIN
V ------- | | -------
+---------+ snd FIN / \ snd ACK +---------+
| FIN |<---------------- ------------------>| CLOSE |
| WAIT-1 |------------------ | WAIT |
+---------+ rcv FIN \ +---------+
| rcv ACK of FIN ------- | CLOSE |
| -------------- snd ACK | ------- |
V x V snd FIN V
+---------+ +---------+ +---------+
|FINWAIT-2| | CLOSING | | LAST-ACK|
+---------+ +---------+ +---------+
| rcv ACK of FIN | rcv ACK of FIN |
| rcv FIN -------------- | Timeout=2MSL -------------- |
| ------- x V ------------ x V
\ snd ACK +---------+delete TCB +---------+
--------------------->|TIME-WAIT|------------------->| CLOSED |
+---------+ +---------+
۷.۳. رویدادهای سهگانه و پردازش آنها
عملکرد TCP حاصل پاسخ به سه دسته رویداد است:
۱. فراخوانیهای کاربر (User Calls)
بر اساس حالت جاری TCB پردازش میشوند. برای مثال:
- فراخوانی SEND در حالت LISTEN اتصال را به حالت فعال تغییر داده و قطعه SYN ارسال میکند.
- فراخوانی CLOSE در حالت ESTABLISHED قطعه FIN ارسال کرده و حالت را به FIN-WAIT-1 تغییر میدهد.
۲. تایمآوتها (Timeouts)
- User Timeout: اگر زمان تحویل داده از تایمآوت تعیینشده توسط کاربر بگذرد، اتصال ABORT میشود.
- Retransmission Timeout (RTO): قطعه تاییدنشده دوباره ارسال شده، RTO دو برابر میشود (Exponential Backoff) و حالت کنترل ازدحام به Slow Start تغییر میکند.
- TIME-WAIT Timeout: پس از انقضای $2 \times \text{MSL}$ ، TCB حذف شده و اتصال به CLOSED میرود.
۳. قطعات ورودی (Arriving Segments)
پردازش قطعه ورودی طی مراحل منطقی زیر انجام میشود:
- بررسی شماره تسلسل (Sequence Number Check): آزمون پذیرش قطعه طبق جدول بخش ۳.۳ انجام میشود. اگر قطعه خارج از پنجره باشد و بیت RST نداشته باشد، یک ACK جبرانی صادر میگردد.
- بررسی بیت RST (Reset Check): اگر RST معتبر باشد، حالت اتصال بلافاصله تغییر کرده یا TCB حذف میشود.
- بررسی امنیت و اعتبار (Security/Compartment Check): اگر سطح امنیت قطعه ورودی با TCB تطابق نداشته باشد، RST ارسال میگردد.
- بررسی بیت SYN: اگر SYN در پنجره مجاز باشد و اتصال در حالت غیرمنتظره قرار گیرد، RST صادر میشود.
- بررسی فیلد ACK:
- در حالت SYN-SENT: اگر SEG.ACK معتبر باشد، اتصال به ESTABLISHED میرود.
- در حالت ESTABLISHED: اگر SND.UNA < SEG.ACK <= SND.NXT باشد، دادههای تاییدشده از صف بازارسال حذف میشوند و SND.UNA پیشروی میکند.
- پردازش بارگذاری و فیلد URG: بایتهای داده درون بافر دریافت کپی میشوند و اشارهگر Urgent ارزیابی میگردد.
- بررسی بیت FIN: دریافت FIN باعث پیشروی RCV.NXT و ارسال ACK میشود. حالت اتصال به CLOSE-WAIT (یا TIME-WAIT/CLOSING) منتقل میگردد.
بخش ۸: ملاحظات امنیتی و حملات شبکه (Security Considerations)
پروتکل TCP به دلیل ماهیت پایه خود در معرض حملات گوناگون شبکه قرار دارد. RFC 9293 راهکارهای استانداردی برای مقابله با این تهدیدات ارائه داده است.
۸.۱. تولید امن شماره تسلسل اولیه (ISN) بر پایه RFC 6528
اگر مهاجم کور (Off-Path Attacker) بتواند شماره تسلسل اولیه (ISN) اتصالات TCP را حدس بزند، میتواند بدون حضور در مسیر ترافیک، قطعات تزریقی (Spoofed Segments) ارسال کند یا اتصالات را برهم بزند.
الگوریتم ساخت ISN
برای جلوگیری از قابلیت پیشبینی، فرستنده باید از یک شمارنده ساعتی زمانمحور به همراه یک تابع شبهتصادفی رمزنگاری (PRF) استفاده کند (MUST-8 و SHLD-1):
که در آن:
- $M$ : شمارنده ۳۲ بیتی که تقریباً هر ۴ میکروثانیه یک واحد به آن اضافه میشود.
- $F()$ : یک تابع درهمسازی رمزنگاری (Cryptographic Hash Function) غیرقابل محاسبه از بیرون (MUST-9) است که پارامترهای ۴-تایی سوکت و یک کلید سرّی را ترکیب میکند.
۸.۲. دفاع در برابر حملات کور (Blind Attacks / RFC 5961)
حملات کور شامل ارسال قطعات RST، SYN یا DATA با شمارههای تسلسل حدسزدهشده جهت قطع اتصال یا تزریق داده است.
بهبودهای امنیتی بر پایه RFC 5961 و شفافسازی RFC 9293:
۱. پردازش قطعه RST ورودی: اگر یک قطعه RST ورودی دقیقاً منطبق بر RCV.NXT نباشد اما درون پنجره دریافت قرار گیرد (RCV.NXT < SEG.SEQ < RCV.NXT + RCV.WND)، گیرنده نباید اتصال را فوراً قطع کند؛ بلکه باید یک "Challenge ACK" ارسال کند تا صحت قطعه تایید شود.
۲. شفافسازی در حالت SYN-RECEIVED (تغییر RFC 9293 نسبت به RFC 5961): اگر در حالت SYN-RECEIVED (که از یک Passive Open ایجاد شده) قطعه RST نامعتبر یا SYN مجدد دریافت شود، TCP به حالت LISTEN بازمیگردد بدون اینکه TCB کاملاً نابود شود.
۸.۳. مقابله با حملات SYN Flooding
در حمله SYN Flooding، مهاجم تعداد زیادی قطعه SYN با آدرسهای مبدا جعلی ارسال میکند تا صف اتصالات نیمهباز (Backlog Queue) سرور پر شده و از پاسخدهی به کاربران واقعی باز بماند.
راهکارهای دفاعی:
- اعتبارسنجی آدرس مبدا (Source Address Validation): قطعات SYN ورودی با آدرس مبدا نامعتبر (مانند Loopback یا آدرسهای غیرمجاز) یا آدرسهای Broadcast/Multicast باید فوراً توسط لایه IP یا TCP بدون پاسخ نادیده گرفته و دور ریخته شوند (MUST-57 و MUST-63).
- استفاده از SYN Cookies: عدم تخصیص بافر TCB تا زمان دریافت ACK نهایی دستتکانی سهمرحلهای (با رمزنگاری پارامترهای اتصال در ISN ارسال شده).
۸.۴. پروتکلها و مکانیزمهای امنیتی مکمل
- IPsec (IP Security): فراهمکننده احراز هویت، یکپارچگی و رمزنگاری در لایه شبکه (IPv4 و IPv6) که پروتکل TCP را در برابر شنود و دستکاری ایمن میسازد.
- TCP-AO (TCP Authentication Option): جایگزین مدرن گزینه قدیمی MD5 Protective Option، جهت احراز هویت رمزنگاریشده قطعات TCP (بهویژه در جلسات BGP بین روترها).
- tcpcrypt: پروتکل مکملی که رمزنگاری فرصتطلبانه (Opportunistic Encryption) را در سطح لایه انتقال بدون نیاز به تغییر در برنامههای کاربردی فراهم میآورد.
- سطح امنیت TCB (Security/Compartment Matching): لایه TCP باید انطباق دقیق سطح امنیت و کمپارتمنت (Security Level and Compartment) درخواستشده در فراخوانی OPEN را با قطعات ورودی بررسی کند. در صورت عدم تطابق، قطعات ورودی رد شده و RST ارسال میگردد.