📡 TCP vs UDP

Hai giao thức Transport Layer — Tin cậy vs Tốc độ

🔵 TCP (Transmission Control Protocol)

Kết nối trước khi truyền (3-way handshake). Đảm bảo thứ tự, không mất gói. Chậm hơn.

🟡 UDP (User Datagram Protocol)

Gửi và quên (fire-and-forget). Không đảm bảo thứ tự hay đến nơi. Nhanh, nhẹ.

1. TCP — Connection-Oriented

3-Way Handshake (thiết lập kết nối):

Client                     Server
  │                           │
  │──── SYN ──────────────→  │  "Tôi muốn kết nối"
  │                           │
  │←─── SYN + ACK ──────── │  "OK, tôi đồng ý"
  │                           │
  │──── ACK ──────────────→  │  "Bắt đầu truyền!"
  │                           │
  │←──→ DATA ←──→   │  Truyền data
  │                           │
  │──── FIN ──────────────→  │  "Tôi muốn ngắt"
  │←─── ACK ──────────────  │  "OK, bye"

Đặc điểm:

  • Reliable: Đảm bảo data đến đúng, đủ, đúng thứ tự
  • Flow control: Điều chỉnh tốc độ gửi theo khả năng nhận
  • Congestion control: Giảm tốc khi mạng tắc nghẽn
  • Error detection: Kiểm tra checksum, gửi lại gói lỗi
  • Ordered: Data nhận đúng thứ tự gửi
// TCP Server (Node.js)
const net = require('net');
const server = net.createServer((socket) => {
    console.log('Client connected');

    socket.on('data', (data) => {
        console.log('Received:', data.toString());
        socket.write('ACK: ' + data.toString()); // gửi lại xác nhận
    });

    socket.on('end', () => console.log('Client disconnected'));
});

server.listen(3000, () => console.log('TCP server on port 3000'));

2. UDP — Connectionless

UDP (fire-and-forget):

Client                     Server
  │                           │
  │──── Packet 1 ──────────→ │  Gửi luôn, không cần handshake
  │──── Packet 2 ──────────→ │  Không chờ ACK
  │──── Packet 3 ──────────→ │  Packet 3 có thể đến trước Packet 2
  │──── Packet 4 ─────── ✗   │  Packet 4 mất → không gửi lại
  │                           │

Đặc điểm:

  • Fast: Không handshake, overhead thấp
  • Lightweight: Header chỉ 8 bytes (TCP: 20-60 bytes)
  • No guarantee: Gói có thể mất, đến sai thứ tự
  • Broadcast/Multicast: Gửi đến nhiều receivers cùng lúc
  • Real-time: Phù hợp cho data cần latency thấp
// UDP Server (Node.js)
const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
    console.log(`Received: ${msg} from ${rinfo.address}:${rinfo.port}`);
    // Không cần ACK, không cần connection
});

server.bind(3000, () => console.log('UDP server on port 3000'));

3. Bảng So Sánh

Tiêu chí 🔵 TCP 🟡 UDP
Kết nối Connection-oriented (handshake) Connectionless
Tin cậy Guaranteed delivery Best effort, có thể mất
Thứ tự Đúng thứ tự Không đảm bảo
Tốc độ Chậm hơn (overhead) Nhanh hơn (nhẹ)
Header 20-60 bytes 8 bytes
Flow control Không
Use case HTTP, Email, File transfer DNS, Video call, Gaming

4. Ví Dụ Dễ Hiểu

📞 Ví dụ đời thường:

TCP = Gửi thư bảo đảm 📮 — Bưu điện xác nhận đã gửi, người nhận ký nhận, nếu thất lạc sẽ gửi lại.

UDP = Phát thanh radio 📻 — Đài phát sóng liên tục, ai nghe được thì nghe, mất vài giây cũng không sao.

5. Ứng Dụng Thực Tế

TCP dùng cho:
• HTTP/HTTPS (web browsing)
• SMTP/IMAP (email)
• FTP (file transfer)
• SSH (remote access)
• Database connections

UDP dùng cho:
• DNS (name resolution)
• Video/Voice calls (WebRTC)
• Online gaming
• Live streaming
• IoT sensor data