net は原始的な TCP、http は TCP 上の HTTP プロトコルラッパー

Node.js において、nethttp はいずれもネットワーク通信に関連するコアモジュールですが、抽象化レベルと利用シーンが全く異なります
つまり:
net は「生の TCP」、http は「TCP 上に構築された HTTP プロトコルのラッパー」と考えることができます。

一句比較

モジュール 抽象レベル 対象ユーザー 用途
net 低レベル(TCP) プロトコル・ネットワーク開発者 独自プロトコル、長時間接続、リアルタイム通信
http 高レベル(HTTP) アプリケーション開発者 Web インタフェース、フロントエンドとの通信、REST API

1. net モジュール(TCP ネイティブ通信)

本質

  • TCP ソケットを直接操作
  • プロトコルの意味を持たない
  • データは Buffer / string

通信プロトコルは自分で定義する必要があります

特徴

  • バイトストリーム指向
  • リクエスト/レスポンスの概念がない
  • ヘッダー/ボディなし
  • 状態管理機能なし
  • パフォーマンスが高い、制御力がある

例:TCP サーバー

const net = require('net');

const server = net.createServer((socket) => {
  socket.on('data', (data) => {
    console.log('受信データ:', data.toString());
    socket.write('pong');
  });
});

server.listen(3000);

TCP クライアント

const net = require('net');

const client = net.createConnection(3000, () => {
  client.write('ping');
});

client.on('data', (data) => {
  console.log(data.toString());
});

利用シーン

  • チャットサーバー
  • ゲームサーバー
  • 独自バイナリプロトコル
  • 高性能な長時間接続
  • RPC の下位実装

2. http モジュール(TCP 上の HTTP ラッパー)

本質

  • net の上位に構築されている
  • 内部では httpnet.Socket を使用している
  • HTTP プロトコルの詳細を自動で処理する

特徴

  • リクエスト/レスポンス指向
  • ヘッダー/ボディを持つ
  • 自動で処理される内容:
    • Content-Length
    • Chunked
    • Keep-Alive
    • ステータスコード

例:HTTP サーバー

const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('hello http');
}).listen(3000);

HTTP クライアント

http.get('http://localhost:3000', (res) => {
  res.on('data', chunk => {
    console.log(chunk.toString());
  });
});

利用シーン

  • Web API
  • フロントエンドのインタフェース
  • マイクロサービス
  • 管理画面
  • サードパーティとの連携

3. 核心差分比較表(重要)

比較項目 net http
トランスポート層 TCP TCP
プロトコル なし HTTP
データ形式 生のバイトストリーム ヘッダー+ボディ
抽象度 非常に低い 非常に高い
手動でのパケット分割 必要 不要
リクエスト/レスポンス なし あり
ブラウザ対応 なし あり
使用難易度

4. なぜ httpnet を完全に置き換えられないのか?

なぜなら、HTTP がすべてのケースに対応できるわけではないからです

  • リアルタイム通信(頻繁なヘッダーオーバーヘッド)
  • 独自バイナリプロトコル
  • 極めて低遅延通信

そのため:

  • Web / API には http
  • 低レイヤー通信 / 長時間接続には net

5. 関係図(理解の助け)

アプリケーション層
 ├── http モジュール(Node)
 │     └── net.Socket
 │           └── TCP
 └── net モジュール(Node)
       └── TCP

6. 記憶法(コトバ)

net は「データをどうやって送るか」、http は「リクエストをどうやって送るか」

タグ: Node.js net HTTP TCP HTTPプロトコル

5月20日 16:21 投稿