TCP / UDP(トランスポート層)

IP がパケットを「届くかもしれない」レベルで転送するのに対し、 トランスポート層はプロセス間で信頼性ある通信や軽量な通信を提供する。TCP / UDP / QUIC を一通り。

役割

ポート番号

16 ビット = 0〜65535。

範囲名称用途
0〜1023Well-knownHTTP=80, HTTPS=443, SSH=22, DNS=53, SMTP=25...
1024〜49151RegisteredMySQL=3306, PostgreSQL=5432, Redis=6379...
49152〜65535Dynamic / Ephemeralクライアント側が自動で取る

よく使うポート

20/21FTP
22SSH
23Telnet
25SMTP
53DNS (UDP/TCP)
67/68DHCP
80HTTP
110POP3
143IMAP
443HTTPS / HTTP/3 (UDP)
465 / 587SMTPS / SMTP submission
993 / 995IMAPS / POP3S
3389RDP

TCP(Transmission Control Protocol)

コネクション指向 + 信頼性ありのストリーム型。HTTP / HTTPS / SSH / SMTP の土台。

特徴

3-way ハンドシェイク

TCP は通信開始前に3 回の往復でコネクションを確立する。

Client                    Server
   |                         |
   |---- SYN (seq=x) ------>|
   |                         |
   |<- SYN+ACK (seq=y, ack=x+1)
   |                         |
   |--- ACK (ack=y+1) ------>|
   |                         |
   |==== コネクション確立 =====|
   |                         |
   |--- アプリ通信 ---------->|
      

この間で 1.5 RTT。HTTPS だと TLS のハンドシェイクが追加でかかる。

4-way 切断

Client                    Server
   |---- FIN ------------->|
   |<--- ACK --------------|
   |                       |
   |<--- FIN --------------|
   |---- ACK ------------->|
   |                       |
   |== TIME_WAIT (2MSL) ==|
      

TIME_WAIT: 古い遅延パケットが新しい接続に紛れ込まないよう、最後のソケットがしばらく残る。 高負荷サーバではこの数が問題になる(→ SO_REUSEADDR / SO_REUSEPORT)。

TCP コネクションの状態

netstat -an で見える状態。

シーケンス番号と再送

フロー制御(受信ウィンドウ)

受信側のバッファ余裕を Window Size として返し、送信側はそれを超えて送らない。

輻輳制御

ネットワーク全体の混雑を避けるため、送信レートを動的に変える仕組み。

Nagle / Delayed ACK

UDP(User Datagram Protocol)

コネクションレス + 信頼性なし + 順序保証なしの軽量プロトコル

UDP ヘッダ(8 バイトだけ)

+-----------------+-----------------+
| Source Port (16)| Dest Port (16)  |
+-----------------+-----------------+
| Length (16)     | Checksum (16)   |
+-----------------+-----------------+
| データ
      

UDP の特徴

UDP の用途

TCP vs UDP まとめ

TCPUDP
接続あり (3-way)なし
順序保証保証なし
再送ありなし
遅延大きい小さい
オーバーヘッド20+ B8 B
用途確実性が要る速度・リアルタイム

QUIC

Google が開発し IETF で標準化(RFC 9000)されたUDP 上のトランスポートプロトコル。 HTTP/3 の土台。

SCTP / DCCP

TCP / UDP 以外のトランスポート(SCTP=複数ストリーム、DCCP=順序なし TCP)。 WebRTC のデータチャネルが SCTP を内部で使う。

ソケット

OS が提供する通信のAPI 抽象。プログラムはsocket()bind()listen() / connect() のように扱う。

// C の例: TCP サーバ最小
int s = socket(AF_INET, SOCK_STREAM, 0);
bind(s, ...);
listen(s, 128);
int c = accept(s, ...);
read(c, buf, 1024);
write(c, "hello", 5);
close(c);

Node.js / TypeScript で TCP / UDP

TCP

import net from "node:net"

const server = net.createServer((socket) => {
  socket.write("hello\n")
  socket.on("data", (d) => console.log(d.toString()))
})
server.listen(3000)

// クライアント
const client = net.createConnection({ port: 3000 })
client.write("hi")

UDP

import dgram from "node:dgram"

const sock = dgram.createSocket("udp4")
sock.on("message", (msg, rinfo) => {
  console.log(`recv ${msg} from ${rinfo.address}:${rinfo.port}`)
})
sock.bind(41234)

// 送信
sock.send("hello", 41234, "127.0.0.1")

確認コマンド

# 開いているポート / 接続中
ss -tnlp           # Linux 推奨
netstat -tnlp      # 古典版
lsof -i :3000      # 指定ポートのプロセス

# ポート疎通テスト
nc -zv host 443
nc -uzv host 53    # UDP

# ベンチ
iperf3 -s          # サーバ
iperf3 -c host     # クライアント

トラブル例

症状原因
connection refusedそのポートで LISTEN しているプロセスがない
connection timed outFW / 経路 / 宛先サーバ停止
RST が返るサーバがコネクションを拒否
遅延が大きいRTT、帯域、輻輳、Nagle/DelayedACK
TIME_WAIT が大量短時間に大量接続。SO_REUSEADDR 等で対策
UDP で届かないNAT で経路維持できず、保持タイマー切れ
大原則

TCP は安心、UDP は速い」。HTTP/3 は UDP の上で TCP 級の信頼性を再構築した形で、 今後の Web プロトコルの主流になる。