خب تو این مقاله  و مقاله بعدی سعی داریم موردی رو بررسی کنیم که شاید کمتر کسی در موردش اطلاعات کامل داشته باشه و یا شاید هم علاقه ای ندارند چون این پروتکل به بهترین شکل (شاید) داره کارشو انجام میده واغلب شبکه کارا ترجیح میدن برن سر مباحث عملیاتی و خودشون رو درگیر نکنند.

ولی نه !!

سوال می پرسید چرا؟؟!!

همه چیز توی شبکه از OSI  شروع میشه و با آن تمام میشه از یک آدرس دهی ساده ، نوع سرویس تا نحوه انتقال و تکنولوژی انتقال و …….

پس اگر درک ما نسبت به OSI  فقط حفظ بودن هفت لایه باشه با عرض پوزش  اسم ما شبکه کار نیست و نمی توانیم نیاز هامون را برطرف کنیم.

براتون یک مثال بزنم که نشون میده ما هم می تونیم روی تک تک لایه های OSI  اثر بگذاریم مثل QOS  (چقدر این مبحث قشنگه امیدوارم توی یک مقاله در موردش صحبت کنیم).

شرکتی رو فرض کنید که  پهنای باند اینترنتی پایینی دارد و همزمان هزاران تلفن روی بستر اینترنت (VOIP) در حال فعالیت هستند حال اگر یک نفر با پروتکل FTP  شروع به دانلود کند کل پهنای باند پر می شود و پروتکل RTP  که برای Video  و Voice  می باشد با بسته های کوچک پشت بسته های FTP  از بین می روند یا Delay  می خورند و همه میدانیم که RTP روی UDP  کار میکند و اگر بسته ای Drop  شود چه بلایی سر اون تماس های تلفنی می آید.

اینجا شبکه کارها به دو دسته تقسیم می شوند کسانی که QOS  بلد هستند و کسانی که QOS  بلد نیستند.

تکلیف افرادی که بلد نیستند مشخص است یعنی دادن Solution  های پر هزینه مانند افزایش پهنای باند و در نهایت اخراج ولی کسی که QOS  بلد است می داند می تواند به کمک فیلد TOS  در هدر IP   بسته ها را بر اساس پروتکل (FTP  یا RTP  )   دسته بندی یا Classification  کند و روی روتر Policy  خاصی اعمال کند که بسته های Voice  توی رقابت برای گرفتن پهنای باند از FTP  جلو بزنند و یک تماس با کیفیت برقرار شود.

انجام این کار فقط و فقط با درک کامل نسبت به OSI  امکان پذیر است که بدانیم در هدر IP  یک فیلد یک بایتی برای QOS  کنار گذاشته اند.

خب حالا که نیاز به درک کامل به OSI  را توی کارمون دیدیم بریم سر TCP

ما اینجا می خواهیم یک پروتکل لایه هفت معروف  Server  و Client  ای مانند FTP  که بر روی TCP  کار می کند را مثال بزنیم.

اول از همه ساختار هدر TCP  رو باید بشناسیم.

 

 

مقدار Source Port  وقتی Peer  ای آغازگر Session باشد مقدار Random  است بسته به OS

به عنوان مثال برای مایکروسافت  ویندوز ۸ از ۴۹۱۵۲  تا ۶۵۵۳۵

و مقدار Dst-Port  بسته به پروتکلی که توی لایه هفت مشخص شده است یعنی وقتی Firefox  رو باز می کنید و آدرس Itnovin.com را وارد می کنید یک Session TCP  برقرار می شود(بعد از DNS)بین شما و مقصد (سرور Itnovin.com) که کامپیوتر شما Src-Port  را مقدار رندوم خالی   (۴۹۱۵۲ تا ۶۵۵۳۵ )   و Dst-Port  را ۸۰  قرار می دهد.  و در جواب سرور در بسته جدید مقدار Src-Port  را ۸۰  و مقدار Dst-port  را همان شماره پورت رندمی که کامپیوتر شما در Src-Port  قرار داده بود ( کامپیوتر شما با قرار دادن اون پورت رندوم در Src-Port  روی آن پورت Listen  می کند و منتظر جواب است).

برای مشاهده کانکشن ها در ویندوز در CMD  دستور زیر را تایپ کنید.

Netstat –na

با این دستور پورت  های که ویندور روی آن پورت ها Listen  می کند (پورت های باز خطرناک را با فایروال ویندوز ببندید) را می توانید ببینید. ممکن است یک سری از پورت ها به صورت موقت باز باشد و Application  خاصی به OS  فرمان داده که روی اون پورت ها Listen  کند  و آن پورت  باز باشد  مثلا اگر در ویندوزتون FTP  سرور بالا آورده باشید  روی FTP  پورت ۲۱  ویندوز شما Listen  میکند.

با دستور Netstat  حتی کانکشن های بر قراری هم میتوان مشاهده کرد.

مقدار Seq-Num  یا ISN  برای شماره گذاری Segment  ها است.

Ack-Num  رسید یا Acknowledgment  شماره بسته ای که از Peer  مقابل گرفته ایم.( یا رسید بسته Seq طرف مقابل)

در مورد    Window و Control Flag  ها  صحبت خواهیم کرد که فیلدی هستند برای Flow Control  در TCP

حالا بریم سر اصل مطلب:

وقتی بسته از لایه های بالای تحویل لایه چهار داده میشود در این لایه اول از همه Segmentation  صورت می گیرد و بسته به Segment  های مختلف تقسیم می شود و هر Segment  یک Sequence-Number  می گیرد و به هر Segment  هدر لایه ۴ Encapsulate  میشود و تحویل لایه سه و دو می دهد. (یک عکس ۱۰MB  با یک Segment  جا به جا نمی شود).

این اتفاق در UDP  نیز صورت می گیرد ولی در UDP  دیگر Segment  ها شماره یا ID  ندارند زیرا در TCP  فقط Error Correction  داریم و UDP  به صورت Stream  بسته ها را پشت هم می فرستد و کاری ندارد که بسته ها به مقصد میرسد یا نه ندارد زیرا به صورت Connection Less  کار می کند و سرعت اهمیت دارد ولی TCP  به صورت Connection Oriented  است و رسیدن بسته به هر چیزی الویت دارد و در صورت نرسیدن بسته تصیح خطا یا Error Correction می کند.

( در زمان پرداخت های مالی اینترنتی که با کمک پروتکل SSL  یا  HTTPS  صورت میگیرد اهمیت و الویت رسیدن بسته ها به مقصد است نه سرعت)

قبل از هر چیزی توی TCP  باید با three way handshake  آشنا بشیم.

این همون سلام علیک خودمونه که ۳ مرحله ای هست و اولین قدم یک کانکشن TCP  هست که مطمئن بشیم سرور ما زنده هست یا یا اصلا علاقه ای به ایجاد کانکشن دارد یا نه.

وقتی Firefox  رو باز می کنید و ITnovin.com  را تایپ میکنید و enter  را میزنید TCP  شروع به کار میکند و با مرحله ی three way handshake شروع می شود که  کامپیوتر شما یک بسته بدون DATA  یعنی بدون محتوا را اینگونه هدر TCP  می زند که به Segment  یک Sequence-num  میدهد (معمولا بسته SYN شماره ۰ را دارد) و بیت کنترلی SYN  را Set  یا یک می کند و در فیلد Option یک سری از شرایط خود را به طرف مقابل اعلام میکند مانند MSS  یا Maximum Segment Size  یعنی کامپیوتر مقابل Segment  ها را با این سایز بفرست و سگمنت های با این سایز را میتونم قبول کنم ( معمولا ۱۴۶۰  است) MSS  همان MTU  بدون هدر TCP  و هدر IP

MSS=1500(MTU)-20(IP header)-20(TCP Header)=1460

 

این اولین مرحله از three way handshake  بود که معروف به بسته SYN  می باشد .

طرف مقابل یعنی  (سرور ITnovin.com ) بعد از دریافت بسته SYN  از Peer  مقابل اگر به هر دلیلی علاقه با ایجاد کانکشن نداشته باشد یک بسته بدون DATA  با هدر TCP  که بیت کنترلی RST  یا Reset  را Set  یا یک میکند و می فرستد و کانکشن بسته میشود.مثل این که شما به کسی سلام کنید و اون به شما بگه برو بابا.

در شرایط نرمال سرور اگر مایل به برقراری ارتباط باشد اینگونه عمل میکند که بسته ای بدون محتوا که در هدر TCP  به بسته یک Sequence-num  می دهد (معمولا مقدار ۰ را در نظر میگیرد) و مقدار Ack-Num  را Sequence Number Client + 1  (که با توجه با این که بسته SYN مقدار SEQ  آن صفر بود ، مقدار ACK-Number برابر با ۱ میشود) می گذارد یعنی من بسته قبلی را گرفتم منتظر بسته بعدی هستم.و از بیت های کنترلی Flag  های SYN  و ACK  را set  میکند و در فیلد Option  شرایط خود را میگوید مثل همان MSS یا ماکسیموم سایز سگمنی که قبول می کند در این کانکشن.

نکته : مقدار نهایی MSS برابر مینیموم مقداری که دو طرف کانکشن به یکدیگر اعلام کردند ، یعنی مقدار MSS  برای هر دو طرف در نهایت کمترین مقدار دو طرف است که با Negotiate مشخص شده است.

نکته : مقدار MSS کاملا وابسته به سیستم عامل (معمولا ویندوز ۱۲۶۰) است و حتی ممکن است ، Application ای که کانکشن TCP میزند مقدار MSS را آن برنامه مشخص کرده باشد یعنی برنامه نویس آن برنامه مقدار MSS یا بزرگترین Segment هایی که می پذیرد را دست کاری کند به هر دلیلی.

این هم از مرحله ۲ که بسته SYN-ACK  نیز میگویند.

و مرحله آخر:

Client  با گرفتن بسته SYN-ACK  باید رسید این بسته را به سرور بدهد که بگه سلام تو رو گرفتم به این نحو است که یک بسته باز بدون DATA  با هدر TCP  تولید کرده و یک Sequence-num  به بسته میدهد( شماره  ID  سگمنت قبلی +۱ یعنی ۰+۱ که میشود ۱ )  و مقدار Ack-Num را مقدار یک قرار میدهد (Server-isn+1  یا Sequence Number Server + 1 )      یعنی من بسته قبلی را گرفتم منتظر بسته بعدی هستم و بیت کنترلی ACK  را Set  میکند و به سمت سرور می فرستد .

به این مرحله به اصطلاح ACK  گفته میشود.

نکات:

تمامی این ۳ مرحله بسته بدون DATA  است.

به تمامی این بسته ها  باید هدر لایه  ۳ یا همان IP  و هدر لایه ۲ اضافه میشود که مورد بحث ما در این مقاله نیست.

فیلد Window  در مقاله بعد به صورت کامل بررسی میشود.(از دست ندید)

بعد از موفقیت این سه مرحله کانکشن به اصطلاح Established  میشود.

به عکس های زیر خوب دقت کنید.

 

 

 

 

حال بریم three way handshake  رو توی دنیای واقعی و با مثال FTP  ببنیم.

دراین مثال بسته هایthree way handshake توسط نرم افزار Wireshark  ، Capture  کردیم.

(معمولا   Wireshark  بسته های three way handshake  را به درستی نمایش نمی دهد که البته اگر کمی کار با Wireshark  را بلد باشیم و با اعمال Filter Display  می توان این کار را انجام داد که می توانید از Wiki Wireshark  را کمک بگیرید).

سناریو زیر را در نظر بگیرید.

ابتدا بسته SYN  را با هم ببینیم:

 

حال بسته را باز میکنیم تا تمامی فیلد های TCP  را ببینیم.

بسته دوم بسته SYN-ACK  بود:

 

 

 

 

حال بسته آخر یعنی ACK :

 

 

حالا هر سه بسته ی Three way handshake  را در کنار هم ببینیم.

 

 

بعد از Transfer  شدن Data  بین سرور و کلاینت session یا connection  باید بسته شود ( باز بودن کانکشن باعث مصرف RAM  می شود زیرا در TCP  به ازای هر کانکشن دستگاه یک  Buffer  برای آن کانکشن کنار می گذارد که در مقاله بعدی در این مورد بحث می شود) برای بسته شدن کانکشن از FIN flag  کمک می گیرد.

 

 

 

 

در مقاله بعد سعی می شود در مورد Negotiate  شدن برای انتخاب سایز پنجره (RWND) و انتخاب لوکالی CWND  که تاثیر بسیار زیادی در مبحث Flow Control   می باشد صحبت شود.

با ITNovin  همراه باشید.

One Thought to “Everything about TCP connection part 1”

  1. حسین کیان

    عالی بود..ممنون

Leave a Comment