حمیدرضا کشاورز . ماهنامه رایانه خبر
همه شما با عبارت http:// در ابتدای نام وبسایتها آشنا هستید. حتی زمانی که تیم برنرز-لی اولین وبسایت اینترنتی را در سال ۱۹۹۱ به راه انداخت، آدرس آن با HTTP آغاز میشد. مرورگرها و سرورها از همان روز نخست از طریق پروتکل انتقال ابرمتن (Hyper Text Transfer Protocol) با یکدیگر ارتباط برقرار میکردهاند.
نسخه فعلی HTTP 1.1 است که از سال ۱۹۹۹ مورد استفاده بوده است. این نسخه عملا تغییر زیادی نکرده و چند اصلاح کوچک روی آن انجام شده است. اما همین بهروز نشدن باعث مشکلات فراوانی شده است.
وبسایتهای ۱۵ سال پیش ساختار بسیار سادهای داشتند. صفحات تشکیل میشدند از یک کد HTML و چند تصویر. همین و بس. اما از آن هنگام تاکنون تعداد اشیایی که یک صفحه وبسایت را میسازند چند برابر شده است. همچنان فایلهای JPEG بیشترین سهم را از عناصر یک صفحه وب دارند، اما فایلهای بسیار بزرگ جاوااسکریپت هم هستند که مرورگر باید آنها را بخواند، و تحلیل و اجرا کند. به اینها CSS (شیوهنامه آبشاری) را هم اضافه کنید که تعیین میکند عناصر HTML یک صفحه چگونه باید به نمایش درآیند.
وبسایتهای مدرن اکنون بیشتر شبیه به برنامههای ساده هستند تا وبسایتهای اواخر قرن بیستم. HTTP 1.1 هرگز نتوانسته با این تغییرات همراه باشد. این پروتکل نمیتواند صفحات با ساختارهای پیچیده را به شکلی کارآمد به مرورگرهای مدرن وب ارسال کند. این باعث میشود که ارتباط HTTP زمان زیادی صرف کند، و وبسایتها با سرعتی بسیار کمتر از آنچه میتوانند باز شوند.
پهنای باند اینترنت شما ۵۱۲ کیلوبیت در ثانیه باشد یا ۲ مگابیت، تفاوتی در سرعت لود شدن یک صفحه وب ایجاد نمیشود.
نسخه جدید HTTP، قرار است این مساله را حل کند.
HTTP/2 روی تمامی مرورگرهای محبوب پیادهسازی شده و سرعت لود شدن صفحات را به شکل قابل توجهی افزایش میدهد. هدف این است که زمان پاسخ سرور بهحدی کاهش یابد که کاربر بتواند با سرویسهای تحت وب به نحوی کار کند که انگار دارد با یک برنامه نصبشده روی کامپیوتر یا گوشی و تبلت خود کار میکند. از همه بهتر این که استفاده از HTTP/2 بسیار ساده است.
HTTP 1.1 از سرعت اینترنت میکاهد
اکنون زمان آن رسیده که پروتکل HTTP جدیدی به عرصه بیاید. مشکلات نسخه ۱.۱ عمیق است و از تعامل در سطح TCP (پروتکل هدایت انتقال) آغاز میشود. TCP تعیین میکند که بستههای اطلاعاتی (پاکتهای دیتا) چطور ارسال میشوند، و مکانیزمهایی دارد که اگر پاکتها از دست بروند، یا در گلوگاه گیر کنند، مشکل را برطرف کند. برای مثال، وقتی که یک روتر دچار لود سنگین میشود و بسیاری از پاکتها را نمیپذیرد، TCP راهی برای حل مشکل دارد. این پروتکل در زمانی بهترین عملکرد را دارد که مرورگرها و سرورها تنها یک اتصال TCP داشته باشند و مرتبا به هم داده ارسال کنند.
اما در عمل HTTP 1.1 تعداد بیش از حدی از اتصالات TCP را برقرار میکند. این به این دلیل است که الگوی ارتباط بیش از حد ساده است. مرورگر درخواست خود را میفرستد و سرور هم پاسخش را میدهد. طبق این الگو، مرورگر ابتدا فایل HTML مرکزی را با یک دستور GET درخواست میدهد و سرور آن را به مرورگر ارسال میکند. مرورگر فایل HTML را تحلیل میکند و تمام فایلهایی که در Style Sheetها و اسکریپتها آمده را درخواست میکند تا بتواند طرح کلی وبسایت را به نمایش درآورد. فایلها شامل تصاویر، بنرها، آیکونها، فونتها و ویدیوها میشود. مرورگر برای این که سرعت نشان دادن صفحه را بالا ببرد، تا هشت اتصال TCP موازی را باز میکند تا بتواند ۱۲۰ شیء را روی کامپیوتر لود کند. مرورگر برای هر شیء یک اتصال میسازد و سپس دستور GET را برای آن ارسال میکند.
اما هر اتصال TCP نیاز به یک handshake بین سرور و مرورگر دارد. پس از آن است که سرور دادههای درخواستی را از طریق HTTP ارسال میکند. بسته به تعداد اشیا، کیفیت اتصال و میزان لود سرور، زمان پاسخ ممکن است چند ثانیه طول بکشد.
مشکل بعدی زمانی روی میدهد که مرورگر باید ابتدا برای هر اتصال دادهها را پردازش کند و سپس درخواستهای جدید بفرستد. اگر این کار نیاز به محاسبات زیادی داشته باشد، کارها روی هم انباشته میشوند و بلوکه شدن Head-of-Line روی میدهد. این مشکل بهویژه زمانی نمود پیدا میکند که پاکتهای TCP در جریان انتقال گم شوند و مرورگر مجبور شود آنها را دوباره درخواست دهد.
طراحان صفحات وب راههایی برای حل این مشکلات دارند. آنها مثلا فایلهای تصویری کوچک را داخل یک فایل تصویری بزرگ قرار میدهند تا این فایلها به یکباره لود شوند (Sprinting)، یا این که آنها را مستقیم در CSS قرار میدهند (Inlining). این کار از تعداد درخواستهای HTTP میکاهد. قرار دادن دستورهای پرشمار جاوااسکریپت در یک فایل هم میتواند این کاهش را انجام دهد. این کارها تعداد اتصالات را کم میکنند اما احتمال بلوکه شدن Head-of-Line را بالا میبرند. مشکل زمانی شدت مییابد که کاربر بخواهد محتویات یک وبسایت خبری را ریفرش کند تا خبرهای جدید را ببیند. در این حالت، باید اتصال جدیدی از طریق TCP ایجاد شود چون تنها مرورگر قصد ریفرش کردن دادهها را دارد. اما HTTP 1.1 به سرور اجازه نمیدهد که دادهها را به شکل مستقل به مرورگر بفرستد. از سوی دیگر، سرور باید فایلها را به شکل کامل از نو انتقال بدهد. سناریو ایدهآل این است که سرور تنها بخشی از کد که تغییر کرده را ارسال کند. اما چنین کاری تنها در HTTP/2 ممکن است.
گزینه Push در HTTP/2
نسخه جدید پروتکل HTTP به دنبال برطرف کردن نواقص نسخه ۱.۱ است.برای این کار ارتباط بین مرورگرها و سرورها بر اساس اصل دیگری شکل میگیرد:
اگر یک اتصال برقرار شود، سرور میتواند به صورت مستقل و مستقیم محتوا را به مرورگر بفرستد. این قابلیت Push سرور نام دارد و نهتنها باعث بهتر شدن ریفرش کردن وبسایتهایی میشود که قبلا لود شدهاند، بلکه حتی در هنگامی که وبسایت برای بار اول لود میشود هم سرعت لود را افزایش میدهد.
HTTP/2 هم مانند نسخه ۱.۱ کار انتقال دادهها را با یک اتصال TCP آغاز میکند. اما پس از آن ماجرا متفاوت میشود. HTTP/2 کل ترافیک داده را از طریق همین یک اتصال برقرار میسازد. به کمک Push سرور، مرورگر دیگر نیازی ندارد که ببیند چه اسکریپتهایی و چه Style Sheetهایی را باید از سرور درخواست کند؛ سرور خودش بهصورت خودکار آنها را برای مرورگر ارسال میکند. این کار باعث کاهش انتقالات رفت و برگشتی شده و بلوکه شدن Head-of-Line را هم برطرف میسازد. مرورگر اکنون میتواند حتی زمانی که سرور دارد پاکتهای داده را ارسال میکند درخواستهای جدیدی بفرستد.
چون پروتکل جدید ساختاری متفاوت برای پاکتهای دادهای دارد، قابلیت مالتیپلکسینگ در HTTP/2 برقرار میشود.
HTTP/2 تنها یک اتصال برقرار میکند که دادهها از طریق آن اتصال به صورت مداوم منتقل میشوند. مرورگر و سرور برای این هدف ممکن است چندین جریان را داخل یک اتصال باز کنند و به صورت همزمان پیامها را از طریق این جریانها ارسال و دریافت کنند. هر جریان یک شناسه دارد تا سرور جریانهای دادهای را با هم اشتباه نگیرد.
ارسال زودتر دادههای مهم
نکته مهمتر این است که هر جریان یک سطح اولویت دارد. در HTTP 1.1، مرورگر درک نمیکند که کدام دادهها برای نمایش سریعتر وبسایت مهمتر است. پروتکل هیچ اطلاعاتی در این باره ندارد. تنها پس از تحلیل فایل HTML است که مرورگر درمییابد وبسایت به چه Style Sheetها و اسکریپتهایی نیاز دارد. در HTTP/2، تمامی جریانها (Streams)یک سطح اولویت دارند و مرورگر ابتدا جریانهای با بالاترین اولویت را پردازش میکند. به این ترتیب، HTTP/2 تکنیکهایی مانند Inlining و Sprinting را منسوخ میسازد.
در جریانها (Streams)، همه دادهها در پیامهایی ذخیره میشوند که به چندین فریم تقسیم شدهاند. هر پیام با یک فریم سرآغاز (Header) شروع میشود و پس از آن چندین فریم دادهای میآید. تمامی فریمهای یک پیام به صورت منفرد فرستاده میشوند. پیامها مواردی مانند فایلها، درخواستها یا اطلاعات را ارسال میکنند. در نتیجه، یک پیام تنها یک فریم میتواند داشته باشد که سطح اولویت جریان را مشخص میسازد.
استاندارد HTTP/2 برای تبادل اطلاعات دهها نوع فریم تعریف کرده است.
حذف موارد غیرضروری
هدرها در HTTP 1.1 فضای بیشتری اشغال میکنند؛ ۵۰۰ تا ۸۰۰ بایت در هر انتقال.
اگر کوکی وجود داشته باشد، اندازه هدر به چندین کیلوبایت میرسد. این سرباری بسیار زیاد است، بهویژه برای اشیایی مانند آیکونها یا بنرها که خودشان چند کیلوبایت حجم میگیرند. به علاوه، هدرهای HTTP بهندرت اطلاعات جدیدی در خود دارند. در نتیجه اطلاعاتی مانند آدرس، تاریخ یا اتصال مرتبا در هدرهای مختلف تکرار میشود، در حالی که هم مرورگر و هم سرور این اطلاعات را در همان آغاز ارتباط دریافت کرده بودند. به علاوه، هدرها به فرمت متنی ارسال میشوند و فشرده نیستند. این هم باعث میشود فضای بیشتری اشغال شود.
هدرهای HTTP/2 اما فشرده میشوند و با کد باینری ارسال میشوند. HTTP/2 احتمال افزونگی دادهها را از بین میبرد. مرورگرها و سرورها یک جدول برای اطلاعاتی که قبلا دریافت کردهاند میسازند و در هدر جدید، تنها اطلاعاتی که در جدول موجود نیست ارسال میشود.
سالها طول میکشد تا HTTP/2 در اینترنت جا بیفتد. اما پیادهسازی آن دارد بهسرعت انجام میشود. گوگل در حال حاضر پیشرو در این زمینه است. آنها پنج سال پیش بود که حرکت در این مسیر را شروع کردند و پروتکلی به نام SPDY (که به صورت speedy تلفظ میشود) معرفی کردند که پایه HTTP/2 فعلی شد.
در سال ۲۰۱۳، نیروی ویژه مهندسی اینترنت (IETF) از SPDY 2.0 به عنوان الگویی برای نسخه اولیه HTTP/2 استفاده کرد. IETF سپس نسخه اولیه ۱۵ برای HTTP/2 را در نوامبر ۲۰۱۴ منتشر کرد و اکنون نسخه نهایی HTTP/2 به عنوان استاندارد پیشنهادی تایید شده است.
مرورگرهای محبوب هم با روند پیشرفت HTTP/2 خود را سازگار کردهاند. اگر جدیدترین نسخههای فایرفاکس یا کروم را داشته باشید میتوانید از HTTP/2 بهره ببرید. اینترنت اکسپلورر ۱۱ در نسخه پیشنمایش ویندوز ۱۰ هم این قابلیت را دارد. اپل هم سرانجام در Safari 8 از پروتکل SPDY استفاده کرد.
ارتقای خودکار به HTTP/2
البته سرورهای زیادی نیستند که از HTTP/2 استفاده کنند. در نتیجه، مرورگرهایی که از HTTP/2 پشتیبانی میکنند مجبورند در هنگام نمایش اطلاعات این سرورها به نسخه ۱.۱ بازگردند. در حال حاضر مرورگرها در هدر HTTP اولین درخواست خود درخواست تغییر نسخه به ۲ را میدهند. اگر سرور این درخواست را بپذیرد، از آن پس اطلاعات از طریق HTTP/2 منتقل میشود.
HTTP/2 نهتنها سرعت لود شدن صفحات برای کاربران را کاهش میدهد که بار روی سرور را هم میکاهد، چرا که دیگر سرورها زیر فشار سنگین درخواستهای TCP قرار نمیگیرند. پیادهسازیهای HTTP/2 برای وب سرورهای محبوبی مانند Apache یا Nginx هم در دسترس است. نسخه بعدی جاوا هم از HTTP/2 استفاده خواهد کرد.
البته در حال حاضر نمیتوان از قابلیتهای HTTP/2 به صورت کامل استفاده کرد. ابتدا وبسایتها باید به نسخه جدید و مطابق با این نسخه مهاجرت کنند. هنوز این بهینهسازی وبسایتها انجام نشده است. اما تعجبی هم ندارد؛ هر چه باشد، مدتهای مدیدی است که اتفاقی به این بزرگی در دنیای وب نیفتاده است.
شکلها:
==========================================================
Five Policies..
پنج سیاستنامهای که اینترنت را کنترل میکنند
انتقال و بازیابی یک وبسایت به کمک چندین پروتکل انجام میشود. TCP برای انتقال مهم است و HTTP برای ارتباط.
HTML
لایه نمایش
این کد تحت وب محتوای صفحه را در مرورگر نشان میدهد.
HTTP
لایه برنامه
لایه برنامه ارتباطات بین مرورگرها و سرورها را تنظیم میکند.
SSL, TLS
لایه امنیتی
این لایه کار رمزگذاری ارتباطات اینترنتی را انجام میدهد.
TCP
لایه انتقال
این لایه تعیین میکند که پاکتهای دادهای چگونه ارسال شوند.
IP
لایه آدرس
هر دستگاه در شبکه یک آدرس منحصربهفرد دارد.
لینک کوتاه: