0

Bài 2: TCP vs UDP: Cuộc chiến của sự Đảm bảo và Tốc độ

Ở Bài 1, chúng ta đã làm quen với khái niệm Socket và biết rằng nó có thể hoạt động dựa trên hai giao thức truyền tải chính ở tầng Transport: TCP và UDP. Trong thế giới lập trình mạng, việc lựa chọn giữa TCP và UDP quyết định toàn bộ kiến trúc, độ trễ (latency) và tính ổn định của ứng dụng.

Bài học này sẽ mổ xẻ bản chất, ưu nhược điểm và thời điểm vàng để sử dụng từng loại giao thức.


1. TCP (Transmission Control Protocol): "Anh chàng cẩn thận, chắc chắn"

TCP là giao thức hướng kết nối (Connection-oriented) và đáng tin cậy (Reliable). Trước khi một byte dữ liệu nào được gửi đi, TCP bắt buộc phải thiết lập một "bắt tay" giữa client và server.

Cơ chế hoạt động cốt lõi của TCP:

  • Bắt tay 3 bước (3-Way Handshake): Thiết lập kết nối trước khi truyền dữ liệu (SYN -> SYN-ACK -> ACK).
  • Đảm bảo thứ tự và toàn vẹn: Mỗi gói tin (packet) gửi đi đều được đánh số thứ tự (Sequence Number). Nếu gói tin số 3 đến trước gói tin số 2, TCP bên nhận sẽ tự động sắp xếp lại cho đúng trật tự.
  • Phát hiện và truyền lại (Retransmission): Nếu bên nhận không thấy phản hồi (ACK) từ gói tin nào đó, TCP sẽ tự động yêu cầu bên gửi truyền lại gói tin đó cho đến khi nhận đủ thì thôi.
  • Kiểm soát tắc nghẽn (Flow Control & Congestion Control): TCP tự động điều chỉnh tốc độ gửi dữ liệu dựa trên băng thông thực tế của đường truyền mạng để tránh làm "nghẽn" hệ thống.

Nhược điểm của TCP:

  • Độ trễ cao hơn (Higher Latency): Do phải mất thời gian bắt tay ban đầu và cơ chế chờ xác nhận (ACK) cho từng gói tin.
  • Tốn tài nguyên (Overhead lớn): Mỗi gói tin TCP mang theo header lớn (tối thiểu 20 bytes) chứa nhiều thông tin quản lý.

2. UDP (User Datagram Protocol): "Anh chàng phóng khoáng, tốc độ"

Ngược lại với TCP, UDP là giao thức không hướng kết nối (Connectionless) và không đảm bảo (Unreliable). Nó hoạt động theo triết lý: Cứ gửi đi, tới đâu thì tới!

Cơ chế hoạt động cốt lõi của UDP:

  • Không cần bắt tay: Muốn gửi dữ liệu là gửi ngay lập tức, không cần thiết lập kết nối trước.
  • Không quan tâm hậu quả: UDP không đánh số thứ tự gói tin, không kiểm tra xem bên nhận có nhận được không, và không yêu cầu truyền lại nếu gói tin bị thất lạc trên đường đi.
  • Gói tin nhỏ gọn (Low Overhead): Header của UDP cực kỳ tinh gọn (chỉ 8 bytes), giúp tối ưu hóa tối đa băng thông mạng.

Nhược điểm của UDP:

  • Dữ liệu có thể bị mất gói tin (packet loss), đến sai thứ tự, hoặc bị lặp (duplicate).
  • Lập trình viên phải tự xử lý các logic bổ sung ở tầng ứng dụng nếu muốn đảm bảo tính toàn vẹn của dữ liệu.

3. So Sánh Trực Diện: TCP hay UDP?

Tiêu chí so sánh TCP (Transmission Control Protocol) UDP (User Datagram Protocol)
Bản chất kết nối Hướng kết nối (Connection-oriented) Không hướng kết nối (Connectionless)
Độ tin cậy Tuyệt đối (Đảm bảo đến nơi, không mất mát) Không đảm bảo (Có thể mất gói tin)
Thứ tự gói tin Đúng thứ tự sắp xếp Không quan tâm thứ tự
Tốc độ / Độ trễ Chậm hơn (Do kiểm tra và chờ ACK) Cực kỳ nhanh, độ trễ thấp
Kích thước Header Lớn (20 - 60 bytes) Nhỏ gọn (8 bytes)
Ứng dụng tiêu biểu Web (HTTP/HTTPS), Email, Truyền file, Database Livestream, Game Multiplayer, VoIP (Gọi thoại)

4. Khi Nào Nên Dùng Cái Nào Trong Thực Tế?

Khi nào BẮT BUỘC dùng TCP?

Khi ứng dụng của bạn không cho phép sai sót hoặc mất mát bất kỳ một dữ liệu nào:

  • Ví dụ: Bạn chuyển khoản ngân hàng, mua hàng online, đọc email, tải một file hình ảnh hoặc file code qua mạng. Nếu mất một vài byte dữ liệu, file sẽ hỏng hoặc số tiền giao dịch bị sai lệch — điều đó là không thể chấp nhận được.

Khi nào BẮT BUỘC dùng UDP?

Khi ứng dụng của bạn đặt tốc độ và tính thời gian thực (Real-time) lên hàng đầu, việc mất một vài khung hình hay vài gói tin nhỏ không ảnh hưởng lớn đến tổng thể:

  • Ví dụ: Gọi điện thoại WhatsApp/Messenger (nếu mất một mili-giây âm thanh, người nghe gần như không nhận ra, nhưng nếu dùng TCP mà đứng chờ truyền lại gói tin cũ, tiếng gọi thoại sẽ bị giật/lag kéo dài).
  • Ví dụ: Game bắn súng trực tuyến (tọa độ nhân vật phải cập nhật liên tục từng mili-giây, vị trí cũ mất đi không cần truyền lại vì đã có tọa độ mới nhất).

💡 Tổng Kết

TCP đảm bảo sự chính xác tuyệt đối, còn UDP đánh đổi sự chính xác đó lấy tốc độ tối đa. Hiểu rõ bản chất này giúp bạn đưa ra kiến trúc mạng chuẩn xác cho từng loại ứng dụng.

Trong Bài 3, chúng ta sẽ đi sâu vào cơ chế vận hành bên dưới của hệ điều hành để xem một kết nối Socket được tạo ra, lắng nghe và chấp nhận như thế nào qua các hàm Bind, Listen, Accept và Connect.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí