شاید برای شما هم سوال پیش اومده باشه که چرا این همه پروتکل مختلف برای برقراری ارتباط بین کاربر و سرور وجود داره و حتی فرق اینا چیه؟ اصلا دونستن اینا به توسعه دهندهها یا کارسشناسای امنیت کمکی میکنه؟ (بله کمک میکنه?)
مخصوصا تو بحث امنیت بهنظر من دونستن تفاوتهای بین نسخههای مختلف این پروتکلها میتونه فهمیدن کارکرد و نقاط ضعف و قوتشون رو برای شما شفافتر کنه و این یعنی درک بهتر ساختار یه فناوری. (دارم سعی میکنم با استفاده از جملات انگیزشی مثلا شما رو ترغیب کنم? )
خب؛ میتونیم تفاوتهای این دوتا پروتکل رو خیلی ساده و خودمونی، توی 5 دسته مختلف بررسی کنیم:
نسخه HTTP/0.9 در تاریخ 1991 بهعنوان اولین نسخه کاربردی از HTTP ارائه شد (سنش از منم بیشتره) و پنج سال بعد یعنی تو سال 1996 نسخه HTTP/1.0 رونمایی شد که درواقع یه نسخه ارتقاء یافته از HTTP/0.9 بود که هم ایراداتش بر طرف شده بود و هم یکسری قابلیت باحال بهش اضافه شده بود.
خب نسخه 0.9 خیلی مسخره بود!! باورتون میشه؟ فقط از متد GET پشتبانی میکرد. یعنی عملا شما بهجز دریافت اطلاعات، کار دیگهای نمیتونی باهاش انجام بدی؛ ولی توی نسخه 1.0 کلی متد جدید یعنی متدهایی مثل POST و HEAD بهش اضافه شد که به کاربر امکان ارسال داده برای سرور رو فراهم کرد و کلی دست توسعه دهندهها رو برای ساخت سامانههای خفنتر باز کرد.
اصلا این یکی رو دیگه باورتون نمیشه. تو نسخه 0.9 پاسخ سرور شامل هیچ سرآیندی نبود? (سرآیند همون Header میشه) ینی پاسخی که دریافت میشد، یک نسخه خالص و خام از HTML بود. ولی خب یک پدر آمرزیدهای اومد و توی نسخه 1.0 سرآیندها رو به پاسخ سرور اضافه کرد، یعنی سرور توی این نسخه، میتونه یکسری اطلاعات اضافی برای کاربر ارسال کن؛ اطلاعاتی که ساختار پاسخ رو شفاف میکنند، مثل سرآیندهای Content-Type، Content-length، Server، User-Agent و...
خب توی نسخه 0.9 فقط خودش یدونه بود و کسی جلودارش نبود، پس توی درخواستها چیزی به اسم نسخه درخواست یا همون HTTP version تعریف نشده بود. اما توی نسخه 1.0، هم در درخواست و هم در پاسخ، مشخص شده که از چه نسخهای از این پروتکل استفاده میشه.
وقتی که نسخه 0.9 اومد، به نظر کسی در نظر نگرفته بود که ممکنه خطاهای مختلفی موقع ارتباط برقرار کردن با سرور رخ بده. ینی بهش فکر کرده بودنا، ولی خیلی کلی؛ فقط اگه خطایی رخ میداد، سرور بهت میگفت خطا رخ داده! ولی نسخه 1.0 اومد و کلا زندگی ما رو عوض کرد! ینی چیزی رو تحت عنوان کد وضعیت (Status Code) معرفی کرد که مثلا وقتی همه چیز اوکی باشه، کد 200 میده، چیزی پیدا نشه 404 میده، خیلی درخواست بفرستی سرور عصبانی بشه 429 میده و...
خب؛ این دوتا درواقع خیلی تفاوت چشمگیری مثل تفاوت نسخه 0.9 و 1.0 ندارن؛ اما یکم بهبودش دادن و بهتر از قبل شده، بریم با هم بررسی کنیم که چیا اینجا جدیده:
خب توی نسخه 1.0 یک ارتباط (Connection) با سرور برقرار میشه، پاسخ دریافت میشه و ارتباط بسته میشه. تامام! ? ولی توی نسخه 1.1 این قضیه فرق میکنه و کاربر میتونه بیشتر از یک درخواست و پاسخ رو تنها توی یک ارتباط رد و بدل کنه که این موضوع بهشدت روی کارایی (Performance) و سرعت یک سامانه تاثیر میذاره. البته توجه کنید که این ارتباط در لحظه فقط میتونه یک درخواست ارسال کنه و یک پاسخ دریافت کنه و همزمان نمیتونه چندین درخواست بفرسته یا حتی نمیتونه در حین ارسال یک درخواست، پاسخی دریافت کنه.
توی نسخه 1.0 چیزی تحت عنوان Pipeline وجود نداره و کاربر مجبوره منتظر بمونه تا پاسخ یکی از درخواستهاش بیاد تا بتونه درخواست دوم رو ارسال کنه. این خیلی رو مخ بود، ولی خب توی نسخه 1.1 قابلیتی اضافه شد که به کاربر اجازه میده تا هر چندتا درخواست که دلش میخواد رو بفرسته، قبل از اینکه جواب درخواستهای قبلی رو گرفته باشه.
خب اینو دیگه زیاد کشش نمیدم، نسخه 1.0 همه سرآیندها رو پشتیبانی نمیکرد، این سرآیندها تو نسخه 1.1 اضافه شدن، سرآیندهایی مثل Cache-Control، Transfer-Encoding و Upgrade. (البته سرآیند Host هم هست که تو مورد بعدی جدا توضیحش دادم)
توی نسخه 1.0 سرآیندی به اسم Host وجود نداشت و قطعا تو استفاده از هاستهای اشتراکی داستان درست میشد! (البته بعضی از افسانهها میگن که توی این نسخه هم میشد از سرآیند Host استفاده کرد ولی خیلی از سرورها و کاربران اونو متوجه نمیشدن و همچنین استفاده از اون اجباری نبوده) ولی تو نسخه 1.1 این سرآیند به طور اجباری باید در تمام درخواستها وجود داشته باشه.
اینجا هم دوباره یک جهش بزرگ تو پروتکل داشتیم و کلی قابلیت جدید بهش اضافه شده، قراره اینا رو هم با هم دیگه بررسی کنیم و کلی لذت ببریم! ?
در نسخه 1.1 درسته که ما میتونستیم چندین درخواست رو تنها توی یک ارتباط، ارسال و پاسخها رو هم همونجا دریافت کنیم، اما قابلیت ارسال و دریافت همزمان وجود نداشت. تو نسخه 2 از این پروتکل، ما میتونیم به صورت موازی، چندین درخواست و پاسخ رو هم زمان ارسال و دریافت کنیم. ینی در حالی که داریم درخواستمون رو میفرستیم، میتونیم هم زمان پاسخ درخواست قبلی رو هم بگیریم.
تو نسخه 1.1، سرآیندها به صورت متن واضح ارسال میشدن که یه سری ایرادات امنیتی هم داشت. اما تو نسخه 2 دیگه از این خبرا نیست و سرآیندها با استفاده از الگوریتم HPACK فشرده میشن و بعد ارسال میشن. HPACK علاوهبر اینکه سرآیندها رو در قالب جدیدی ارسال میکنه، بلکه از کدگذاری Huffman هم استفاده میکنه تا حجم سرآیندها رو کاهش بده و داده کمتری این وسط رد و بدل بشه.
همه مون با نسخه 1.1 کار کردیم و دیدیم که محتوا و سرآیندها به صورت متنی ارسال میشن. این مورد برای انسانها قابل فهمتر و راحتتره ولی کارآمدی کمتری هنگام پردازش داره. نسخه 2 اومده و از قابلیت ارسال دادهها به صورت باینری استفاده کرده. مخصوصا سرآیندها که کلا دیگه در قالب باینری ارسال میشن.
این یکی از قابلیتهای خیلی جذابه. تو نسخه 1.1، سرور تنها در صورتی میتونست به کاربر دیتا بفرسته که کاربر درخواست داده بود. ینی بهتر بخوام بگم، سرور فقط میتونست به درخواستها پاسخ بده. ولی تو نسخه 2 قابلیتی به اسم Push Server اضافه شده که سرور هروقت حس کنه که ممکنه دادهای لازم بشه، بدون اینکه کاربر درخواستی بزنه، اون دادهها رو برای کاربر ارسال میکنه. ینی نشستی داری ماستتو میخوری که یهو از سرور پاسخ دریافت میشه!
تموم شد دیگه، دنبال چه هستی او رفته از اینجا (متن بسیار خنده دار) ? ?? ?
اگر به نظرتون جالب بود و خوشتون اومده،حتما بازخورد بدید تا در صورت تمایل، تفاوتهای HTTP/2 و HTTP/3 رو هم با هم بررسی کنیم. ❤️