HTTP 2: প্রয়োজনীয়, কিন্তু অপেক্ষাকৃত অবহেলিত প্রযুক্তি

কাউকে যদি জিজ্ঞেস করি, ওয়েব ডেভেলপমেন্টের গুরুত্বপুর্ন দশটা পার্ফরমেন্স টিপস বলেন, এর মধ্যে কোন যায়গায় থাকবে, "সব রিসোর্স একসাথে করে একটা ফাইল বানায়ে ফেলা"। টার্গেট হচ্ছে HTTP রিকুয়েস্টের সংখ্যা কমানো। কারনটাও খুব লজিকাল, HTTP এর পুরান ভার্শনে প্রতিটা কানেকশন কনটেন্ট লোড করার স্পিড কমায়ে দেয়, আর প্রতিটা ব্রাউজার একই সাথে একটা সার্ভারে লিমিটেড সংখ্যাক কানেকশন তৈরী করতে পারে। তাই আপনার রিসোর্স সংখ্যা ম্যক্সিমাম কানেকশনের সংখ্যার বেশী হলে, বাকী কনটেন্টগুলোকে অপেক্ষা করতে হবে।

এখন হয়ত অনেকে ভাবছেন, HTTP2 তে এই সংখ্যা বাড়ানো হয়েছে। ব্যাপারটা আসলে অন্যরকম। HTTP2 এর এইরকম আরো কিছু অদ্ভুত ব্যাপার নিয়ে আজকের আর্টিকেল। চলেন শুরু করা যাক

via GIPHY

HTTP২ নিয়ে কথা বলার আগে একটু HTTP নিয়ে কথা বলা দরকার, সমস্যা হচ্ছে এই টপিক আসলে অনেক বড়। তবে বেশীভাগ ক্ষেত্রে HTTP ট্রান্জ্যাকশন বেসিকালি দুইটা ঘটনার কম্বিনেশন। একটা হচ্ছেরিকুয়েস্ট।  উদাহরন দিয়ে বলি: মনে করেন, আপনি আপনার ব্রাউজারে লিখলেন facebook.com এখন আপনার ব্রাউজার বিভিন্ন সার্ভারে গিয়ে জিজ্ঞেস করবে:

"আজ্ঞে দাদা, ফেসবুকটা যেন কোনদিকে?"

এটা নিয়ে আরেকদিন বিস্তারিত লিখবো, এখন টপিকে ফিরে আসি, এই সার্ভারগুলো একজন একজন করে আপনার ব্রাউজারকে পথ দেখাতে দেখাতে একসময় সে ফেসবুকের সার্ভারের ঠিকানায় পৌছাবে এবং এক এক করে ফেসবুকের দেয়া ফাইলগুলো আপনার ব্রাউজারে নিয়ে আসবে, সার্ভার থেকে যখন কিছু ফেরত পাবে, সেটা HTTP এর দুইটা অংশের পরের অংশ রেসপন্স। এখন HTTP2 এর ক্ষেত্রে রিকুয়েস্ট রেসপন্স আছে, তবে মেকানিজম সামান্য আলাদা। ছোটবেলায় একটা টিভি এডের ডায়ালগ মনে পড়ে গেল:

"বারবার আসনের সময় নাই, পুরা প্যাকেট দাও",  

HTTP2, এর প্রধান দুইটা উদ্দেশ্যের মধ্যে একটা কানকশন লেয়ারকে ইফিশিয়েন্ট করা। এটা বলার পর অনেকের ধারনা হয়ে যায়, HTTP2 তাদের ইন্টারনেটের স্পিড ম্যাজিকালি বাড়ায়ে দিবে। ব্যাপারটা আসলে এমন না। তবে ইফিশিয়েন্সির কারনে আপনার ডকুমেন্ট লোড হওয়ার সময় কমে যাবে। একবার একটা সার্ভারে কানেক্ট হয়ে গেলে ঐ কানেকশন দিয়েই চেষ্টা করবে সবগুলো ফাইল নিয়ে চলে আসার। মানে মনে করেন একটা বস্তা ভরে facebook.com এর হোমপেজের মার্কআপ, সিএস এস আর ডিফল্ট ইমেজগুলো নিয়ে চলে আসবে। এই ব্লগের শুরুর দিকে বেস্ট প্রাকটিসের কথা বলছিলাম, কানেকশন সংখ্যা কমানোর জন্য আর ফাইল সাইজ কমানোর জন্য সব ফাইল একসাথে করে একটা ফাইল বানানোর একটা বেস্ট প্রাকটিস আছে। HTTP2 তে এই কারনে এই বেস্ট প্রাকটিস এর দরকার নাই।

HTTP দিয়ে ট্রান্সমিট হওয়া প্রতিটা রিসোর্সের(ফাইলের) সাথে কিছু হেডার থাকে। কিছু হেডার আপনার ক্লায়েন্ট (ব্রাউজার) পাঠায়। নিজের পরিচয়, কুকি, কি ধরনের রেসপন্স আশা করছে এই টাইপের তথ্য থাকে হেডারে। রেসপন্স আবার যখন আসে সেটার সাথেও কিছু হেডার থাকে। যেমন রেসপন্সের রিসোর্সের টাইপ, সাইজ এই টাইপের তথ্য। HTTP2 তে এই হেডার ইনফরমেশন কমপ্রেস করা যায়, আর কমপ্রেস করার কারনে অনেক রিসোর্সের ক্ষেত্রে প্রায় ৩০% পর্যন্ত কম ডাটা ট্রান্সফার করা সম্ভব।এই কমপ্রেশনের মেকানিজমের নাম HPACK.

আরো একটা মজার ফিচার আছে HTTP2 তে, সার্ভার পুশ। এই টপিক নিয়ে আলাদা একটা পোস্ট লেখা যাবে। তবে খুব সিম্প্লিফাই করে বলতে গেলে, সার্ভার পুশ দিয়ে আপনি চাইলে পরে লাগবে এমন ফাইল, কানেনশন চালু থাকা অবস্থায় আগেই পাঠিয়ে রাখতে পারেন।

সবচেয়ে গুরুত্বপুর্ন কথাটাই এখনো আলোচনা করা হয়নি। ব্যাকওয়ার্ড কম্পাটিবিলিটি। HTTP2 পুরোপুরি ব্যাকওয়ার্ড কম্পাটিবল। আপনার ক্লায়েন্টে HTTP2 এর সাপোর্ট না থাকলে অটোমেটিক HTTP1.1 এর মত কাজ করা শুরু করবে।

বিভিন্ন ওয়েব সার্ভার/ফ্রেমওয়ার্কে HTTP2 সাপোর্ট দেয়ার প্রোসেস আলাদা, নীচে আমি কিছু রিলেভেন্ট লিংক দিয়ে দিচ্ছি রেফারেন্সের জন্য:

  1. https://http2.github.io/
  2. HTTP2 সাপোর্ট করে এমন সার্ভার আর ফ্রেমওয়ার্কের লিস্ট

আধুনিক এপ প্লাটফর্ম (Heroku, Google Cloud Platform) এ বেশীভাগ ক্ষেত্রে HTTP2 পাবেন, আর পাবেন S3 এর মত কনটেন্ট হোস্টিং সার্ভিসে।

আর আপনার সার্ভারে HTTP2 থাকলে সার্চ ইন্জিনেও এক্সট্রা খাতির পাবেন।

HTTP2 নিয়ে এত ছোট আর্টিকেলে অনেক কিছু চাইলেও বলা সম্ভব না, কারন আলোচনা অনেক বড়। উপরে দেয়া লিংক দুইটাতে অনেক তথ্য আছে, সার্ভারে HTTP2 কিভাবে ইনেবল/ব্যাবহার করতে হবে সেটারও ডকুমেন্টেশন আছে।

হাতে যদি অফুরন্ত সময় আর মাথা অসম্ভব ঠান্ডা হলে HTTP2 এ স্পেসিফিকেশন RFC 7540 পড়তে পারেন।

সার্ভার আর রিলেটেড প্রযুক্তি নিয়ে জানতে লিনাক্স নিয়ে অনলাইন কোর্সে অংশগ্রহন করতে পারেন

জাভাস্ক্রিপ্ট দিয়ে HTTP2 ইনেবল্ড ওয়েব এপ্লিকেশন বানানোর জন্য আমার ফুলস্ট্যাক জাভাস্ক্রিপ্ট কোর্সে অংশগ্রহন করতে পারেন