HTTP چیست؟
HTTP پروتکلی برای انتقال منابع (اعم از فایل های html، تصاویر و ...) بر روی شبکه جهانی وب است. HTTP معمولا از طریق سوکت های TCP/IP پیاده سازی می شود. یک مرورگر وب مانند گوگل کروم یا فایرفاکس یک کلاینت HTTP است زیرا درخواست ( یا request) های HTTP را به سمت یک سرور HTTP یعنی یک وب سرور میفرستد و پاسخ (response) را از وب سرور دریافت می کند. پورت استاندارد برای سرورهای HTTP یا وب سرورها 80 است که از طریق آن به درخواست های HTTP گوش می کنند.
منبع یا Resource چیست؟
HTTP برای انتقال منابع و نه فقط فایل ها استفاده می شود. یک منبع شامل تکه ای اطلاعات است که می تواند توسط URL شناخته شده و پیدا شود. معروفترین شکل یک منبع فایل است اما یک منبع می تواند نتیجه ی یک درخواست باشد که به صورت داینامیک ایجاد شده است.
ساختار تراکنشهای HTTP
مانند بسیاری از پروتکل های شبکه HTTP از مدل کلاینت-سرور استفاده می کند. کلاینت HTTP یک اتصال (connection) باز کرده و متن درخواست (request message) را به سمت سرور HTTP فرستاده و سرور پیام پاسخ (response message) را باز می گرداند که معمولا شامل منبعی است که درخواست شده است. پس از تحویل پیام، سرور اتصال را می بندد به همین دلیل HTTP یک پروتکل بی حالت (stateless) است یعنی هیچ اطلاعاتی از اتصال در تراکنش HTTP نگه داشته نمی شود. فرمت متن های درخواست و پاسخ شبیه به هم است. هر دو پیام شامل موارد زیر هستند:
- خط آغازین
- صفر یا چند خط هدر
- یک خط خالی
- یک متن پیام اختیاری (به عنوان مثال یک فایل، داده های یک درخواست یا خروجی های یک درخواست)
فرمت یک پیامHTTP از قرار زیر است:
<خط آغازین که برای درخواست و پاسخ با هم متفاوت است>
Header1: value1
Header2: value2
Header3: value3
<داده های اختیاری مانند پارامترهای ارسالی یا پاسخ های دریافتی مانند فایل یا ... در بدنه پیام قرار می گیرد>

خط آغازین درخواست
خط اول درخواست HTTP در پیام های درخواست و پاسخ با هم متفاوت است. سه قسمت تشکیل دهنده خط اول درخواست HTTP عبارتند از: نام متد، مسیر نسبی منبع مورد درخواست و نسخه ی HTTP :
GET /path/to/file/index.html HTTP/1.0
نکات قابل توجه:
- GET پرکاربردترین متد HTTP است و به عبارت ساده می گوید که «چیزی را به من بده». متدهای پرکاربرد دیگر عبارتند از POST، DELETE، PUTو HEAD
- مسیر نسبی قسمتی ازURL است که بعد از نام هاست می آید (یعنی نام وب سایت یا آی پی همراه با پورت)
خط آغازین پاسخ
خط اول پیام پاسخ HTTP به خط وضعیت (status line) نیز معروف است و شامل سه قسمت نسخه HTTP ، کد وضعیت پاسخ HTTP و عبارت دلیل که کد وضعیت را شرح می دهد می باشد. مانند خط زیر که کد 200 را برگردانده یعنی همه چیز خوب است.
HTTP/1.0 200 OK
یا
HTTP/1.0 404 Not Found
که نشان می دهد منبع مورد درخواست از سرور HTTP یافت نشده است.
نکات قابل توجه:
- فرمت نسخه HTTP در خط اول پاسخ با خط اول درخواست یکی است.
- کد وضعیت پاسخ یک عدد صحیح سه رقمی است که می توان به کمک رقم اول نوع یا دسته بندی کلی پاسخ را مشخص کرد:
- 1xx: پیام فقط جنبه اطلاع رسانی دارد
- 2xx: نشان دهنده موفقیت آمیز بودن درخواست است.
- 3xx: این پیام کلاینت را به URL دیگری ریدایرکت یا هدایت می کند
- 4xx: نشان دهنده یک خطا در سمت کاربر است
- 5xx: نشان دهنده یک خطا در سمت سرور است
معروفترین کدهای وضعیت عبارتند از:
200 OK
درخواست موفقیت آمیز بوده و منبع مورد درخواست در بدنه پیام به سمت کلاینت فرستاده شده است
404 Not Found
منبع مورد درخواست موجود نیست
301 Moved Permanently
302 Moved Temporarily
منبع مورد درخواست به URL دیگری انتقال یافته است. URL جدید در بخش Location در قسمت هدر پاسخ HTTP قرار دارد.
500 Server Error
خطایی در سمت سرور به دلایل مختلف رخ داده است.
خطوط هدر
این خطوط اطلاعاتی در مورد درخواست، پاسخ یا در مورد داده هایی که در بدنه پیام منتقل می شود در اختیار قرار می دهد. در هر خط از درخواست یا پاسخ HTTP یک هدر یا سرآیند قرار داده می شود که به شکل "Header-Name: value" است. HTTP 1.1 46 هدر تعریف می کند که در این بین "Host:" اجباری است. در زیر چند هدر معروف که عموما در درخواست های HTTP وجود دارند را ملاحظه می کنید:
Host: sepidaria.com
Accept-Language: en-US,en;q=0.8,fa;q=0.6,es;q=0.4
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept: text/html,application/xhtml+xml, application/xml;q=0.9, image/webp,*/*;q=0.8
هدر اول مشخص کننده مقصد درخواست، هدر دوم نشان دهنده زبان های تحت پوشش، هدر سوم نشان دهنده ارسال کننده درخواست مثلا مرورگر کروم یا فایرفاکس و هدر آخر نشان دهنده نوع داده ای است که در پاسخ قابل قبول است.
بدنه پیام
بعد از خطوط هدر ممکن است بدنه پیام حاوی داده هایی برای ارسال به سرور و دریافت از آن باشد. اگر یک پیام HTTP شامل بدنه باشد معمولا دو خط هدر زیر نیز وجود دارند که داده های موجود در بدنه پیام را توصیف می کنند:
Content-Type: که نوع داده های موجود در متن پیام را مشخص می کنند مثل text/html یا image/gif
Content-Length: تعداد بایت های داده در متن پیام
مثالی از نحوه ارسال و دریافت پیام HTTP
فرض کنید می خواهیم فایلی را در URL زیر از سرور دریافت کنیم:
http://www.somehost.com/path/file.html
ابتدا یک سوکت بر روی هاست www.somehost.com بر روی پورت 80 ایجاد کرده و سپس پیام HTTP شبیه به پیام زیر را از طریق آن ارسال می کنیم (کاری که معمولا مرورگرها می کنند):
GET /path/file.html HTTP/1.0
From: someuser@jmarshall.com
User-Agent: HTTPTool/1.0
[blank line here]
حال سرور باید پاسخ HTTP شبیه به خطوط زیر برای ما ارسال کند (معمولا مرورگرها پاسخ را دریافت و با شکل مناسب به ما نمایش می دهند):
HTTP/1.0 200 OK
Date: Fri, 31 Dec 1999 23:59:59 GMT
Content-Type: text/html
Content-Length: 1354
<html>
<body>
<h1>Hello World!</h1>
...
</body>
</html>

پس از ارسال پاسخ سرور سوکت را می بندد.
با دقت در مثال بالا کل فرآیند درخواست و پاسخ در وب برای شما ملموس تر می شود. با دانستن اصول و کلیات پروتکل HTTP شما اکنون درک بهتری از نحوه کارکرد وب داشته و این موجب می شود شما به شکل کارامدتری سیستم های تحت وب را طراحی کنید.