HTTP/2 در Node.js: API اصلی، نشست‌ها و جریان‌ها

ماژول node:http2 در Node.js پیاده‌سازی پایدار پروتکل HTTP/2 را فراهم می‌کند. برخلاف API مربوط به HTTP/1، API اصلی HTTP/2 به‌طور ویژه برای ویژگی‌های این پروتکل طراحی شده است؛ مثل جریان‌های چندگانه (multiplexed streams)، قابلیت server push و کنترل جریان پیشرفته. این API طراحی متقارن بین کلاینت و سرور دارد و رویدادهایی مانند stream، error و connect در هر دو سمت قابل استفاده هستند. برای سازگاری با مرورگرها باید از سرور امن (http2.createSecureServer) استفاده کرد و کلاینت‌ها می‌توانند با http2.connect متصل شوند.

http2 Core API / Compatibility APIHttp2Session / ServerHttp2Session / ClientHttp2SessionHttp2Stream lifecycleEvents: stream, goaway, ping, settings, timeoutserver push / ALTSVC / ORIGIN frames

~9 min read • Updated Dec 29, 2025

1. معرفی


ماژول http2 از طریق require('node:http2') در دسترس است. این ماژول یک API سطح پایین برای ویژگی‌های HTTP/2 و یک API سازگار برای مهاجرت آسان‌تر از HTTP/1 ارائه می‌دهد.


2. نمونهٔ سرور


const http2 = require('node:http2');
const fs = require('node:fs');

const server = http2.createSecureServer({
  key: fs.readFileSync('localhost-privkey.pem'),
  cert: fs.readFileSync('localhost-cert.pem'),
});

server.on('stream', (stream, headers) => {
  stream.respond({ 'content-type': 'text/html; charset=utf-8', ':status': 200 });
  stream.end('

Hello World

'); }); server.listen(8443);

3. نمونهٔ کلاینت


const http2 = require('node:http2');
const fs = require('node:fs');

const client = http2.connect('https://localhost:8443', {
  ca: fs.readFileSync('localhost-cert.pem'),
});

const req = client.request({ ':path': '/' });
req.on('response', (headers) => {
  for (const name in headers) console.log(`${name}: ${headers[name]}`);
});
req.setEncoding('utf8');
let data = '';
req.on('data', (chunk) => { data += chunk; });
req.on('end', () => { console.log(data); client.close(); });
req.end();

4. Http2Session


Http2Session نمایندهٔ یک نشست فعال بین کلاینت و سرور است. این کلاس مدیریت تنظیمات، کنترل جریان و جریان‌های چندگانه را بر عهده دارد. رویدادهای مهم شامل:


  • close: هنگام نابودی نشست.
  • connect: هنگام اتصال موفق به همتا.
  • error: هنگام بروز خطا.
  • goaway: هنگام دریافت فریم GOAWAY.
  • stream: هنگام ایجاد جریان جدید.
  • timeout: هنگام عدم فعالیت پس از زمان مشخص.

5. چرخهٔ Http2Stream


Http2Stream جریان‌های دوطرفه روی یک نشست را نمایندگی می‌کند. این جریان‌ها در شرایط زیر ساخته می‌شوند:


  • سرور یک HEADERS جدید دریافت کند.
  • کلاینت متد session.request() را فراخوانی کند.
  • سرور یا کلاینت یک push stream ایجاد کند.

جریان‌ها با close()، destroy() یا دریافت فریم RST_STREAM نابود می‌شوند.


6. قابلیت‌های پیشرفته


  • ALTSVC: معرفی سرویس‌های جایگزین (RFC 7838).
  • ORIGIN: معرفی originهای معتبر (RFC 8336).
  • ping(): ارسال فریم PING برای اندازه‌گیری تأخیر.
  • settings(): به‌روزرسانی تنظیمات محلی و انتظار برای تأیید.

7. نمونهٔ Server Push


server.on('stream', (stream) => {
  stream.respond({ ':status': 200 });
  stream.pushStream({ ':path': '/style.css' }, (err, pushStream) => {
    if (err) throw err;
    pushStream.respond({ ':status': 200, 'content-type': 'text/css' });
    pushStream.end('body { color: red; }');
  });
  stream.end('');
});

نتیجه‌گیری


ماژول http2 در Node.js امکان ساخت برنامه‌های مدرن، کارآمد و امن را با استفاده از ویژگی‌های HTTP/2 مانند جریان‌های چندگانه، server push و کنترل جریان پیشرفته فراهم می‌کند. با استفاده از Http2Session و Http2Stream توسعه‌دهندگان کنترل دقیق بر ارتباطات کلاینت-سرور خواهند داشت.


1. ویژگی‌های Http2Stream


  • aborted: نشان‌دهندهٔ قطع غیرعادی جریان.
  • bufferSize: تعداد کاراکترهای بافر شده برای نوشتن.
  • closed: جریان بسته شده است.
  • destroyed: جریان نابود شده و دیگر قابل استفاده نیست.
  • endAfterHeaders: مشخص می‌کند که پس از هدرها داده‌ای دریافت نخواهد شد.
  • id: شناسهٔ عددی جریان.
  • pending: جریان هنوز شناسهٔ عددی ندارد.
  • rstCode: کد خطای RST_STREAM هنگام نابودی جریان.

2. مدیریت هدرها و تریلرها


  • sentHeaders: هدرهای خروجی ارسال‌شده.
  • sentInfoHeaders: هدرهای اطلاعاتی اضافی ارسال‌شده.
  • sentTrailers: تریلرهای خروجی ارسال‌شده.
  • sendTrailers(headers): ارسال تریلرها پس از رویداد wantTrailers.

3. مدیریت زمان‌بندی و وضعیت


  • setTimeout(msecs, callback): تنظیم timeout برای جریان.
  • state: وضعیت فعلی جریان شامل window size و وضعیت بسته شدن.

4. ClientHttp2Stream


نسخهٔ کلاینت Http2Stream رویدادهای زیر را مدیریت می‌کند:


  • continue: هنگام دریافت وضعیت 100 Continue.
  • headers: هنگام دریافت هدرهای اطلاعاتی.
  • push: هنگام دریافت پاسخ push از سرور.
  • response: هنگام دریافت پاسخ اصلی.

5. ServerHttp2Stream


نسخهٔ سرور Http2Stream متدهای زیر را ارائه می‌دهد:


  • respond(headers[, options]): آغاز پاسخ به کلاینت.
  • pushStream(headers[, options], callback): ایجاد جریان push برای ارسال دادهٔ اضافی.
  • respondWithFD(fd[, headers[, options]]): ارسال داده از یک فایل‌دسکریپتور.
  • respondWithFile(path[, headers[, options]]): ارسال فایل به‌عنوان پاسخ.

6. Http2Server و Http2SecureServer


این کلاس‌ها سرورهای HTTP/2 را مدیریت می‌کنند و رویدادهایی مانند request، session، stream و timeout را ارائه می‌دهند. نسخهٔ امن (Http2SecureServer) از TLS برای ارتباطات رمزگذاری‌شده استفاده می‌کند.


7. مثال ساده


const http2 = require('node:http2');
const server = http2.createServer();

server.on('stream', (stream) => {
  stream.respond({ ':status': 200 });
  stream.end('Hello from HTTP/2 stream');
});

server.listen(8000);

نتیجه‌گیری


کلاس Http2Stream و نسخه‌های کلاینت و سرور آن در Node.js ابزارهای قدرتمندی برای مدیریت جریان‌های HTTP/2 هستند. این امکانات به توسعه‌دهندگان اجازه می‌دهند ارتباطات سریع‌تر، امن‌تر و کارآمدتری ایجاد کنند، با پشتیبانی از ویژگی‌هایی مانند server push و ارسال فایل مستقیم.


1. رویدادهای مهم


  • timeout: زمانی که فعالیتی در سرور برای مدت مشخصی انجام نشود.
  • unknownProtocol: زمانی که کلاینت نتواند پروتکل مجاز (HTTP/2 یا HTTP/1.1) را مذاکره کند.

2. مدیریت سرور


  • server.close([callback]): توقف ایجاد نشست‌های جدید و بستن سرور.
  • server.setTimeout([msecs][, callback]): تنظیم زمان‌بندی برای درخواست‌های سرور.
  • server.timeout: مدت زمان بیکاری قبل از قطع اتصال سوکت.
  • server.updateSettings([settings]): به‌روزرسانی تنظیمات سرور.

3. ایجاد سرور HTTP/2


  • http2.createServer([options][, handler]): ایجاد سرور HTTP/2 بدون رمزگذاری.
  • http2.createSecureServer(options[, handler]): ایجاد سرور امن HTTP/2 با TLS.

4. اتصال کلاینت


http2.connect(authority[, options][, listener]) برای اتصال کلاینت به سرور HTTP/2 استفاده می‌شود. این متد یک ClientHttp2Session برمی‌گرداند.


5. کدهای خطا (http2.constants)


کدهای خطا برای فریم‌های RST_STREAM و GOAWAY شامل موارد زیر هستند:


  • NGHTTP2_NO_ERROR: بدون خطا.
  • NGHTTP2_PROTOCOL_ERROR: خطای پروتکل.
  • NGHTTP2_INTERNAL_ERROR: خطای داخلی.
  • NGHTTP2_FLOW_CONTROL_ERROR: خطای کنترل جریان.
  • NGHTTP2_CANCEL: لغو جریان.
  • NGHTTP2_ENHANCE_YOUR_CALM: خطای ناشی از رفتار نادرست کلاینت.

6. مدیریت هدرها


  • هدرها به‌صورت کلید-مقدار در اشیای جاوااسکریپت نمایش داده می‌شوند.
  • نام هدرها به‌صورت lowercase ارسال می‌شوند.
  • هدرهای حساس (مانند Cookie یا Authorization) می‌توانند با http2.sensitiveHeaders علامت‌گذاری شوند تا در الگوریتم فشرده‌سازی ایندکس نشوند.
  • هدرهای خام (raw headers) نیز قابل استفاده هستند برای حفظ ترتیب و تکرارها.

7. مثال ساده


const http2 = require('node:http2');
const fs = require('node:fs');

const options = {
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem'),
};

const server = http2.createSecureServer(options);

server.on('stream', (stream, headers) => {
  stream.respond({ 'content-type': 'text/html; charset=utf-8', ':status': 200 });
  stream.end('

Hello World

'); }); server.listen(8443);

نتیجه‌گیری


مدیریت رویدادها و تنظیمات در سرورهای HTTP/2 در Node.js به توسعه‌دهندگان امکان می‌دهد سرورهایی امن، پایدار و انعطاف‌پذیر ایجاد کنند. با استفاده از متدهایی مانند setTimeout و updateSettings و رویدادهایی مانند timeout و unknownProtocol می‌توان کنترل دقیق بر چرخهٔ ارتباطات داشت.


1. Push Streams on the Client


برای دریافت جریان‌های push در کلاینت، باید listener برای رویداد stream روی ClientHttp2Session تنظیم شود. این جریان‌ها داده‌های اضافی از سرور را بدون درخواست مستقیم کلاینت ارسال می‌کنند.


2. پشتیبانی از متد CONNECT


متد CONNECT برای استفاده از سرور HTTP/2 به‌عنوان پروکسی TCP/IP استفاده می‌شود. سرور CONNECT درخواست‌ها را بررسی کرده و اتصال مستقیم به مقصد برقرار می‌کند. کلاینت نیز می‌تواند با ارسال درخواست CONNECT به پروکسی متصل شود.


3. پروتکل CONNECT توسعه‌یافته (RFC 8441)


این پروتکل امکان استفاده از جریان CONNECT به‌عنوان تونل برای پروتکل‌های دیگر (مانند WebSocket) را فراهم می‌کند. سرور باید گزینه enableConnectProtocol را فعال کند و کلاینت پس از دریافت فریم SETTINGS می‌تواند از هدر :protocol استفاده کند.


4. Compatibility API


این API تجربه‌ای مشابه HTTP/1 فراهم می‌کند تا توسعه‌دهندگان بتوانند برنامه‌هایی بسازند که همزمان از HTTP/1 و HTTP/2 پشتیبانی کنند. کلاس‌های Http2ServerRequest و Http2ServerResponse برای این منظور طراحی شده‌اند.


5. ALPN Negotiation


با استفاده از ALPN می‌توان همزمان HTTPS و HTTP/2 را روی یک سوکت پشتیبانی کرد. سرور می‌تواند با گزینه allowHTTP1 درخواست‌های HTTP/1 را نیز قبول کند.


6. Http2ServerRequest


این کلاس نمایندهٔ درخواست‌های ورودی در سرور HTTP/2 است. ویژگی‌های مهم:


  • aborted: نشان‌دهندهٔ قطع غیرعادی درخواست.
  • headers: هدرهای درخواست.
  • httpVersion: نسخهٔ HTTP (معمولاً 2.0).
  • method: متد درخواست (GET, POST, DELETE).
  • url: مسیر درخواست.

7. Http2ServerResponse


این کلاس نمایندهٔ پاسخ خروجی سرور است. ویژگی‌ها و متدهای مهم:


  • addTrailers(headers): افزودن trailing headers.
  • appendHeader(name, value): افزودن مقدار جدید به هدر موجود.
  • createPushResponse(headers, callback): ایجاد پاسخ push.
  • end([data]): پایان پاسخ.
  • getHeader(name)، getHeaders(): مشاهدهٔ هدرها.
  • setHeader(name, value): تنظیم هدر.
  • setTimeout(msecs, callback): تنظیم timeout برای پاسخ.

8. مثال ساده


const http2 = require('node:http2');

const server = http2.createServer((req, res) => {
  res.setHeader('Content-Type', 'text/html; charset=utf-8');
  res.writeHead(200);
  res.end('Hello from HTTP/2');
});

server.listen(8000);

نتیجه‌گیری


ویژگی‌های کلاینت و سرور در HTTP/2 در Node.js امکانات قدرتمندی برای مدیریت جریان‌های push، پروکسی CONNECT، و سازگاری با HTTP/1 فراهم می‌کنند. این ابزارها به توسعه‌دهندگان اجازه می‌دهند برنامه‌هایی مدرن، امن و انعطاف‌پذیر بسازند.


1. ویژگی‌های اصلی


  • response.statusCode: تعیین کد وضعیت پاسخ هنگام استفاده از implicit headers. پس از ارسال هدرها، مقدار نشان‌دهندهٔ کد وضعیت واقعی است.
  • response.statusMessage: در HTTP/2 پشتیبانی نمی‌شود و همیشه رشتهٔ خالی برمی‌گرداند.
  • response.stream: شیء Http2Stream پشتیبان پاسخ.
  • writableEnded: پس از فراخوانی end() مقدار true می‌شود.

2. ارسال داده‌ها


  • response.write(chunk[, encoding][, callback]): ارسال بخشی از بدنهٔ پاسخ. در صورت عدم فراخوانی writeHead()، به حالت implicit header تغییر می‌کند.
  • این متد می‌تواند چندین بار برای ارسال بخش‌های متوالی بدنه فراخوانی شود.
  • در پاسخ‌های HEAD، 204 و 304 نباید بدنه ارسال شود.

3. متدهای ویژه


  • response.writeContinue(): ارسال وضعیت 100 Continue برای اعلام ادامهٔ ارسال بدنهٔ درخواست.
  • response.writeEarlyHints(hints): ارسال وضعیت 103 Early Hints همراه با هدر Link برای preload یا preconnect منابع.
  • response.writeHead(statusCode[, statusMessage][, headers]): ارسال هدرهای پاسخ همراه با کد وضعیت. فقط یک بار قبل از end() قابل فراخوانی است.

4. مدیریت هدرها


  • هدرهای تنظیم‌شده با setHeader() با هدرهای writeHead() ادغام می‌شوند و هدرهای writeHead() اولویت دارند.
  • Content-Length باید بر حسب بایت تعیین شود. در خروجی Node.js بررسی تطابق طول بدنه با Content-Length انجام نمی‌دهد، اما در ورودی این بررسی انجام می‌شود.

5. جمع‌آوری معیارهای عملکردی


با استفاده از PerformanceObserver می‌توان معیارهای زیر را جمع‌آوری کرد:


  • برای Http2Stream: bytesRead، bytesWritten، id، timeToFirstByte، timeToFirstHeader.
  • برای Http2Session: framesReceived، framesSent، pingRTT، streamCount، maxConcurrentStreams.

6. نکته دربارهٔ :authority و host


HTTP/2 نیازمند وجود هدر :authority یا host است. در ساخت مستقیم درخواست HTTP/2 باید از :authority استفاده شود، اما در تبدیل از HTTP/1 (مانند پروکسی‌ها) می‌توان از host استفاده کرد.


7. مثال ساده


const http2 = require('node:http2');

const server = http2.createServer((req, res) => {
  res.setHeader('Content-Type', 'text/plain; charset=utf-8');
  res.writeHead(200);
  res.write('Hello ');
  res.end('World');
});

server.listen(8000);

نتیجه‌گیری


کلاس Http2ServerResponse در Node.js ابزارهای قدرتمندی برای مدیریت پاسخ‌های HTTP/2 فراهم می‌کند. با استفاده از متدهایی مانند writeHead، writeEarlyHints و writeContinue می‌توان کنترل دقیق بر چرخهٔ پاسخ داشت و با Performance Observer معیارهای عملکردی را جمع‌آوری کرد.


Written & researched by Dr. Shahin Siami