TCP و HTTP
TCP چیست و چرا Handshake؟
TCP پروتکل انتقال قابلاعتماد در لایهی Transport است. برخلاف UDP که بستهها را همینطور رها میکند و میفرستد، TCP قبل از هر تبادل واقعی داده، یک Handshake سهمرحلهای انجام میدهد: SYN, SYN-ACK, ACK. در همین سه گام، دو طرف شمارهترتیب بستهها را با هم هماهنگ میکنند؛ از آن پس TCP تضمین میکند بستهها به همان ترتیب برسند و اگر چیزی گم شد، دوباره فرستاده شود.
برای کار DevOps این Handshake یک نقطهی طلایی در عیبیابی است: اگر اتصال TCP اصلاً برقرار نمیشود، مشکل قطعاً قبل از هر چیز دیگری است — یک فایروال، سرویسی که خاموش است یا یک مشکل دیگر. پس اگر TCP وصل نشود، برنامه حتی فرصت نمیکند خطا هم بدهد.
HTTP: درخواست و پاسخ
HTTP پروتکل سطح Application است: کلاینت یک درخواست (Request) میفرستد و سرور با یک پاسخ (Response) جواب میدهد. درخواست از این تکهها ساخته شده:
- Method: قصد شما را میگوید —
GETبرای خواندن،POSTبرای ایجاد،PUT/PATCHبرای بهروزرسانی وDELETEبرای حذف - Path و نسخهی پروتکل: مانند
GET / HTTP/1.1 - Headers: متادیتای درخواست —
Host،User-Agent،Acceptو مواردی از این دست - Body (اختیاری): دادهی همراه درخواست — در
POSTوPUTمعمولاً هست
پاسخ هم همیشه یک کد وضعیت با خودش میآورد:
2xxموفق — مانند200 OK3xxجابهجایی — مانند301(دائمی) و302(موقت)4xxخطای سمت کلاینت — مانند404 Not Foundو403 Forbidden5xxخطای سمت سرور — مانند500و502 Bad Gateway؛ در عیبیابی سرویسهای پشت Proxy این کد را زیاد خواهید دید
تست پورت با nc
قبل از اینکه سراغ ابزارهای سطح Application برویم، با nc میتوانید بفهمید آیا TCP اصلاً باز است یا نه:
-zفقط چک میکند چیزی گوش میدهد یا نه، بدون اینکه واقعاً داده بفرستد.-vنتیجه را برایتان چاپ میکند؛ پیامConnection succeededیعنی TCP جواب داده است.
اگر بخواهید عمیقتر بروید، میتوانید یک درخواست خام را با دست تایپ کنید و HTTP را بدون هیچ مرورگری ببینید. با nc example.com 80 وصل شوید، این را بنویسید و دو بار Enter بزنید:
پاسخ خامِ HTTP همانجا در ترمینال ظاهر میشود، هم Headers و هم Body.
دیدن درخواست کامل با curl -v
curl -v هم TCP Handshake و هم کل تبادل HTTP را نشان میدهد و به همین دلیل یکی از رایجترین ابزار عیبیابی سرویسهای وب است:
- خطهای شروعشده با
>چیزی است که شما فرستادید، و<پاسخی است که سرور برگردانده. - خط
Connected toدقیقاً همان نقطهای است که TCP موفق شده. - گزینهی
-Iفقط هدرها را میگیرد (با متدHEAD) — راه سریعی برای دیدن فقط کد وضعیت، بدون دانلود کامل صفحه.
تمرین
- سرویس SSH را روشن کنید و با
nc -zv 127.0.0.1 22وضعیتش را چک کنید. بعد سرویس را متوقف کنید و همان دستور را دوباره بزنید — پیامConnection refusedرا با پیام موفقیت قبلی مقایسه کنید. - یک درخواست خام با
ncبهexample.comبفرستید و خط Status پاسخ را در خروجی پیدا کنید. - همین دو مورد را با
curl -vهم اجرا کنید و در خروجی سه لایه را از هم جدا کنید: Handshake، Headers درخواست و کد وضعیت پاسخ.
آخرین قدم، همان چیزی است که بعداً در عیبیابی واقعی زیاد به کارتان میآید: وقتی nc -zv یک پورت را «باز» گزارش میکند اما curl -v همچنان خطا میدهد، این یعنی مشکل از TCP نیست — چون تا همینجا موفق شده — بلکه خودِ برنامه یا HTTP روی آن پورت درست کار نمیکند. جدا کردن همین دو حالت، بخش زیادی از سردرگمی عیبیابی را از بین میبرد.
منابع یادگیری
مستندات و مقالات
- MDN — Overview of HTTP — مرور مفاهیم HTTP و کدهای وضعیت
- MDN — A Typical HTTP Session — جریان کامل یک Session از Request تا Connection
ویدیو
- Practical Networking — TCP: 12 Simple Ideas — ایدههای کلیدی TCP در سطح مورد نیاز این دوره
- HTTP Fundamentals in 10 Minutes — The Cyber Mentors — مفاهیم اساسی HTTP