Node.js において、net と http はいずれもネットワーク通信に関連するコアモジュールですが、抽象化レベルと利用シーンが全く異なります。
つまり: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の上位に構築されている- 内部では
httpがnet.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. なぜ http は net を完全に置き換えられないのか?
なぜなら、HTTP がすべてのケースに対応できるわけではないからです:
- リアルタイム通信(頻繁なヘッダーオーバーヘッド)
- 独自バイナリプロトコル
- 極めて低遅延通信
そのため:
- Web / API には
http - 低レイヤー通信 / 長時間接続には
net
5. 関係図(理解の助け)
アプリケーション層
├── http モジュール(Node)
│ └── net.Socket
│ └── TCP
└── net モジュール(Node)
└── TCP
6. 記憶法(コトバ)
net は「データをどうやって送るか」、http は「リクエストをどうやって送るか」