پروتکل انتقال ابرمتن نگارش ۲

بندانگشتی|پروتکل انتقال ابرمتن نگارش ۲
**HTTP/2** (در اصل به نام **HTTP/2.0**) یک بازنگری عمده بر روی پروتکل شبکه ای HTTP می‌باشد که در وب جهان گستر استفاده می‌گردد. پروتکل HTTP/2 از پروتکل تجربی SPDY، که توسط گوگل توسعه داده شده، مشتق شده‌است. HTTP/2 توسط کار گروه پروتکل انتقال ابر متن موسوم به httpbis (که در آن  به معنی "دوم") است توسعه داده شده‌است که این کارگروه خود بخشی از نیروی ضربت مهندسی اینترنت است. HTTP/2 اولین نسخه جدید HTTP از HTTP 1.1 بود که در سال ۱۹۹۷ در RFC 2068 به صورت یک استاندارد درآمده است. کار گروه، HTTP/2 را در دسامبر ۲۰۱۴ جهت در نظر گرفته شدن به صورت یک استاندارد پیشنهادی به گروه راهبری مهندسی اینترنت ارائه کردند و این نهاد در هفده فوریه ۲۰۱۵ اجازه انتشار آن را به عنوان یک استاندارد پیشنهادی صادر نمود. مشخصات HTTP/2 تحت عنوان RFC 7540 در مارس ۲۰۱۵ منتشر گردیدند.

این استاندارد توسط مرورگرهای کروم، اپرا، فایرفاکس، اینترنت اکسپلورر ۱۱، سافاری ،آمازون سیلک و ادج پشتیبانی شده‌است. از پایان سال ۲۰۱۵، اکثر مرورگرهای اصلی پشتیبانی از HTTP/2 را به قابلیت‌هایشان افزوده‌اند.

بر اساس گزارش W3Techs، ، ۲۶٫۵ درصد از ۱۰ میلیون وب سایت از HTTP/2 پشتیبانی می‌نموده‌اند.

## اهداف
در منشور کارگروه چند هدف و موضوع قابل توجه ذکر شده‌است:
* ایجاد یک مکانیسم گفتگو که به کلاینت‌ها و سرورها اجازه می‌دهد تا انتخاب نمایند که از HTTP 1.1, 2.0 یا به‌طور بالقوه پروتکل‌های دیگر غیر ازHTTP استفاده نمایند.
* فراهم کردن سطح بالایی از سازگاری با HTTP 1.1 (برای مثال با متدها، کدهای وضعیت ،Uriها و اغلب فیلدهای سرآیند).
* کاهش زمان تأخیر به منظور بهبود سرعت لود صفحه در مرورگرهای وب با توجه به:
** فشرده سازی داده‌ها ی HTTP headers
** HTTP/2 فشار سرور
** خط لوله سازی درخواستها
** رفع مشکل مسدودسازی سر خط در HTTP 1.x
** تسهیم درخواست‌های متعدد بر روی یک اتصال TCP
* پشتیبانی از موارد استفاده عمومی موجود HTTP، مانند مرورگرهای وب دسکتاپ، مرورگرهای وب موبایل، رابط‌های برنامه‌نویسی کاربردی وب، وب سرورها در مقیاس‌های مختلف، پروکسی سرورها، پروکسی معکوس سرورها، فایروال‌ها و شبکه‌های تحویل محتوا.

## تفاوت‌ها از HTTP 1.1
تغییرات پیشنهادی نیاز به هیچ گونه تغییراتی در چگونگی کارکرد برنامه‌های کاربردی وب موجود ندارند، اما برنامه‌های جدید می‌توانند از ویژگی‌های جدید برای افزایش سرعت استفاده کنند.

HTTP/2 بیشتر سینتکس سطح بالای HTTP 1.1، مانند متدها، کدهای وضعیت، فبلدهای سرآیند و Uri را به همان صورت حفظ کرده‌است. آنچه جدید است این است که چگونه داده‌ها قاب‌بندی شده و بین کلاینت و سرور انتقال داده شوند.

وب سایت‌هایی که کارآمد هستند، تعداد درخواست‌های مورد نیاز برای رندر کردن کل صفحه را با عمل خلاصه‌سازی کد منبع (کاهش مقدار کد و بسته‌بندی قطعات کوچکتر از کد را در بسته‌های نرم‌افزاری، بدون کاهش توانایی عملکرد کد) مثلاً در مورد تصاویر و اسکریپت‌ها، به حداقل می‌رسانند. اما خلاصه‌سازی کد منبع نه لزوماً مناسب و نه کارآمد است و ممکن است هنوز نیاز به اتصالات HTTP جداگانه ای برای دریافت صفحه و منابع خلاصه‌سازی شده داشته باشد. HTTP/2 به سرور اجازه می‌دهد تا محتوا را «فشار» دهد، این کار سبب می‌شود که داده لازم برای پاسخ به مواردی که پرس‌وجوها بیشتر از آنچه کلاینت حقیقتاً درخواست کرده هستند، فراهم گردد. این کار به سرور اجازه می‌دهد تا داده‌هایی را که می‌داند یک مرورگر وب برای ارائه یک صفحه وب به آن‌ها نیاز خواهد داشت، بدون انتظار برای اینکه مرورگر به بررسی پاسخ اولیه بپردازد و بدون سربار اضافی برای یک چرخه درخواست اضافه تر، برای آن تأمین نماید.

افزون بر این، بهبودهای عملکرد دیگری هم در اولین پیش‌نویس از HTTP/2 (که یک کپی از SPDY بود) از طریق تسهیم درخواست‌ها و پاسخ‌ها به منظور جلوگیری از مشکل مسدودسازی سر خط در HTTP 1 (حتی زمانی که خط لوله سازی HTTP استفاده شده‌است)، فشرده سازی سرآیند و اولویت بندی درخواست‌ها حاصل شده‌است.HTTP/2 دیگر از مکانیسم انتقال رمزگذاری تکه بندی شده HTTP 1.1 را پشتیبانی نمی‌کند و به جای آن مکانیسم کارآمدتر خودش را برای جریان دهی داده‌ها استفاده می‌کند.

## پیدایش از روی SPDY و تفاوتهای بعدی با آن
SPDY (تلفظ مانند "اسپیدی") بود یک پروتکل جایگزین قبلی برای HTTP بود که توسط یک پروژه تحقیقاتی پیشگام توسط گوگل توسعه یافته بود. SPDY در درجه اول بر کاهش زمان تأخیر متمرکز شده بود، از همان خط لوله TCP استفاده می‌کرد، اما به منظور دستیابی به این کاهش از پروتکل‌های متفاوتی استفاده می‌نمود. پایه ای‌ترین تغییرات اعمال شده بر روی HTTP 1.1 برای ایجاد SPDY شامل: «خط لوله سازی صحیح درخواستها بدون محدودیت‌های FIFO، مکانیسم قاب بندی پیامها برای ساده سازی توسعه کلاینت و سرور، فشرده سازی اجباری (شامل سرآیندها)، زمان بندی اولویت‌ها و حتی ارتباط دوسویه» بودند.

کارگروه httpbis پروتکل Google SPDY، پیشنهاد پروتکل مایکروسافتی HTTP Speed+Mobility (بر مبنایSPDY), و ارتقا شبکه-پسند HTTP را مورد تحقیق قرار دادند. در ژوئیه ۲۰۱۲ فیس بوک برای هر کدام از این پیشنهادها بازخوردی را ارائه کرد و توصیه نمود که HTTP/2 بر اساس SPDY بنا شود. پیش‌نویس اولیه HTTP/2 در ماه نوامبر سال ۲۰۱۲ منتشر شد و بر مبنای یک کپی مستقیم از SPDY تهیه شده بود.

بزرگترین تفاوت میان HTTP/1.1 و SPDY این بود که هر عمل کاربر در SPDY دارای یک "شناسه جریان " بود، که این به معنی وجود تنها یک کانال اتصال TCP از کاربر به سرور است. SPDY درخواست‌ها را به دو دسته "کنترل" یا "داده " با استفاده از " پروتکل باینری آسان جهت پارسه کردن با دو نوع قاب" تقسیم می‌کرد. SPDY بهبود چشمگیری را نسبت به HTTP به نمایش گذاشت به طوری که سرعت بارگذاری صفحات بین ۱۱٫۸۱٪ تا ۴۷٫۷٪ سریعتر شده بود.

HTTP/2 از SPDY به عنوان یک سکوی پرش استفاده کرد. در میان بسیاری از تفاوت‌های مفصل بین پروتکل‌ها، قابل توجه‌ترین تفاوت این است که HTTP/2، به جای استفاده از فشرده سازی پویای مبتنی بر جریان در SPDY، از یک الگوریتم فشرده سازی سرآیند ثابت بر مبنای کد هافمن استفاده می‌کند. این امر به کاهش خطر بالقوه حملات فشرده سازی اوراکل در پروتکل، مانند حملات CRIME کمک می‌نماید.

در فوریه ۹، ۲۰۱۵ گوگل اعلام کرد قصد دارد پشتیبانی از SPDY را در مرورگر کروم به نفع پشتیبانی از HTTP/2 حذف نماید؛ که این حذف از مرورگر کروم ۵۱ عملی گردید.

## رمزگذاری
HTTP/2 برای هر دو HTTP Uri (یعنی بدون رمزگذاری) و HTTPS Uri (بر روی TLS یا استفاده از توسعه ALPN که در آن TLS 1.2 یا جدیدتر مورد نیاز است) تعریف شده‌است.

اگر چه خود استاندارد نیاز به استفاده از رمزگذاری ندارد، همه پیاده‌سازی‌های اصلی کلاینت (فایرفاکس، کروم، سافاری، اوپرا، اینترنت اکسپلورر، ادج) اعلام کرده‌اند که آن‌ها تنها از HTTP/2 بر روی TLS پشتیبانی می‌کنند که باعث می‌شود رمزگذاری *عملاً* الزامی باشد.

## انتقادات
فرایند توسعه HTTP/2 و خود پروتکل با انتقاداتی مواجه شده‌اند.

پل هنینگ کمپ توسعه دهنده ای که در فری بی اس دی و ورنیش فعالیت می‌نماید، ادعا می‌کند که استاندارد طی یک زمان‌بندی غیرواقع گرایانه و کوتاه آماده شده که نتیجه آن حذف کلیه مفاهیم جدید در HTTP/2 به جز آن‌ها که در پروتکل SPDY آمده‌اند بوده و در نتیجه سایر فرصت‌ها برای بهینه‌سازی از دست رفته‌اند. هنینگ کمپ از خود پروتکل نیز برای ناپایداری و داشتن پیچیدگی غیر ضروری و بیش از اندازه انتقاد می‌کند. او همچنین می‌گوید که این پروتکل، اصل لایه بندی پروتکلها را، به عنوان مثال با تکثیر کنترل جریان در لایه انتقال (TCP)، نقض می‌کند. با این وجود بیشترین نگرانی‌ها مربوط به مسائل رمزگذاری می‌شوند.

## رمزگذاری
در ابتدا برخی از اعضای کارگروه سعی در تعریف یک نیازمندی جهت رمزگذاری در پروتکل نمودند. این کار با انتقاداتی مواجه شد.

منتقدان اعلام کردند که رمزگذاری هزینه‌های رایانشی غیرقابل چشم پوشی در برخواهد داشت و بسیاری از برنامه‌های کاربردی HTTP در واقع نیاز به رمزگذاری ندارند و ارائه دهندگان هیچ تمایلی به صرف منابع اضافی بر روی آن نخواهند داشت. طرفداران رمزگذاری اعلام کرده‌اند که این سربار تولید شده توسط رمزگذاری در عمل قابل اغماض است. پل هنینگ کمپ از IETF به خاطر پیروی از یک رویه سیاسی خاص در مورد HTTP/2 انتقاد نمود. برای اعضای جامعه منبع باز، انتقاد از رویه رمزگذاری اجباری بر روی یک چارچوب صدور گواهی موجود، چیز جدید و منحصر به فردی نیست. یک کارمند سیسکو در سال ۲۰۱۳ اظهار داشت: که مدل گواهی دهی فعلی برای دستگاه‌های کوچک مانند روترها سازگار نیست، چرا که در مدل فعلی نه تنها نیاز به ثبت نام سالانه و عدم چشم پوشی از هزینه‌های ناچیز برای هر گواهی می‌باشد، بلکه باید این درآمدهای ناچیز طور مستمر در حساب درآمدهای سالانه شرکت تکرار شوند. کارگروه در نهایت بر سر اجباری بودن رمزگذاری به اجماع نرسیدند، اگر چه بیشتر پیاده‌سازی‌های سمت کلاینت به آن نیاز دارند که باعث می‌شود رمزگذاری *عملاً* مورد نیاز باشد.

هم چنین پروتکل HTTP/2 در خصوص عدم پشتیبانی از رمزگذاری فرصت طلبانه با انتقاداتی مواجه شده‌است. رمزگذاری فرصت طلبانه یک معیار جهت مقاومت در برابر نظارت غیر محسوس است که شبیه به مکانیسم STARTTLS می‌باشد که از گذشته در پروتکل‌های اینترنت مانند SMTP موجود بوده‌است. منتقدان اعلام کرده‌اند که پیشنهاد HTTP/2 در تناقض با RFC7258 "نظارت غیرمحسوس یک حمله است " خود IETF می‌باشد، که آن نیز همچنین دارای یک وضعیت بهترین تجربه فعلی می‌باشد. RFC7258/BCP188 اجبار می‌کند که که نظارت غیرمحسوس به عنوان یک حمله در نظر گرفته شود. پروتکل‌های طراحی شده توسط IETF باید گامهایی را جهت محافظت در برابر نظارت غیرمحسوس (برای مثال از طریق استفاده از رمزگذاری فرصت طلبانه) بردارند. تعدادی پیش‌نویس مشخصات برای رمزگذاری فرصت طلبانه HTTP/2 تهیه گردیدند که از بین آن‌ها draft-nottingham-http2-encryption به عنوان آیتم کاری رسمی توسط کارگروه به تصویب رسید که در نهایت منجر به انتشار RFC 8164 در مارس ۲۰۱۷ گردید.

## نقاط عطف توسعه

## سمت سرور پشتیبانی
### نرم‌افزار سرور
* Apache 2.4.12 supports HTTP/2 via the module mod_h2, although appropriate patches must be applied to the source code of the server in order for it to support that module. As of Apache 2.4.17 all patches are included in the main Apache source tree, although the module itself was renamed mod_http2. Old versions of SPDY were supported via the module mod_spdy, however the development of the mod_spdy module has stopped.
* Apache Tomcat supports HTTP/2 with version 8.5 and newer with a configuration change.
* Apache Traffic Server supports HTTP/2.
* Caddy supports HTTP/2.
* Citrix NetScaler 11.x supports HTTP/2.
* Sucuri Supports HTTP/2.
* F5 BIG-IP Local Traffic Manager 11.6 supports HTTP/2.
* h2o was built from the ground up for HTTP/2 support.
* HAProxy 1.8 supports HTTP/2.
* Jetty 9.3 supports HTTP/2.
* LiteSpeed Web Server 5.0 supports HTTP/2.
* Microsoft IIS supports HTTP/2 in Windows 10 and Windows Server 2016.
* Netty 4.1 supports HTTP/2.
* nginx 1.9.5 supports HTTP/2.
* Node.js 5.0 supports HTTP/2 with a module and Node 8.4 introduced experimental built-in support for HTTP/2.
* OpenLiteSpeed 1.3.11 and 1.4.8 supports HTTP/2.
* Proxygen supports HTTP/2.
* Pulse Secure Virtual Traffic Manager 10.2 supports HTTP/2.
* Radware Alteon NG supports HTTP/2.
* ShimmerCat supports HTTP/2.
* Vert.x 3.3 supports HTTP/2.
* Warp (Haskell web server, used by default in Yesod) supports HTTP/2.
* Wildfly 9 supports HTTP/2.

### شبکه تحویل محتوا
* Akamai اولین CDN عمده پشتیبانی‌کننده از HTTP/2 و HTTP/2 فشار سرور . http2.akamai.com اجرای پیاده‌سازی HTTP/2 از جمله فشار سرور را توسط Akamai به نمایش می‌گذارد.
* Microsoft Azure, از HTTP/2 پشتیبانی می‌کند.
* CDN77 با استفاده از nginx (۲۰ اوت ۲۰۱۵) از HTTP/2 پشتیبانی می‌کند . http2demo.io نمایشی از اجرای HTTP/2 توسط CDN77 می‌باشد.
* Cloudflare با استفاده از nginx از HTTP/2 پشتیبانی می‌کند با SPDY به عنوان یک جایگزین برای مرورگرهای فاقد پشتیبانی در حالی که امنیت و عملکرد خدمات حفظ می‌شود. Cloudflare اولین CDN عمده بود که از فشار سرور HTTP/2 پشتیبانی کرد.
* AWS CloudFront از HTTP/2 پشتیبانی می‌کند.
* Fastly از HTTP/2 از جمله فشار سرور پشتیبانی می‌کند.
* Duane baker Incapsula CDN از HTTP/2 پشتیبانی می‌کند. http2.incapsula.com پیاده‌سازی HTTP/2 توسط Incapsula را به نمایش می‌گذارد. پیاده‌سازی هم چنین شامل پشتیبانی برای WAF و جلوگیری از DDoS نیز می‌شود.
* KeyCDN با استفاده از nginx (اکتبر ۶، ۲۰۱۵) از HTTP/2  پشتیبانی می‌کند. HTTP/2 تست یک صفحه تست است به منظور بررسی اینکه آیا سرور شما پشتیبانی از HTTP/2 می‌نماید.

### برنامه‌ریزی نشده
* lighttpd هیچ پشتیبانی از SPDY نمی‌کند و HTTP/2 ممکن است در نسخه ۱٫۵ پشتیبانی شود.

### پیاده‌سازی
* دیگر پیاده سازی‌ها GitHub HTTP/2 wiki جمع‌آوری شده‌اند.

## جستارهای وابسته
* خط لوله سازی HTTP
* کویک
* اسپیدی
* وب سوکت
* مقایسه مرورگرهای وب و پشتیبانی از پروتکلها

## منابع

رده:معرفی‌شده‌های ۲۰۱۵ (میلادی)
رده:پروتکل انتقال ابرمتن
رده:پروتکل‌های لایه کاربرد
رده:معرفی‌شده‌های مرتبط با رایانه در ۲۰۱۵ (میلادی)