Bạn Đã Biết Gì Về Giao Thức Mạng TCP và UDP?

1. Tổng quan

Trong hệ thống mạng hiện nay, chúng ta có các mô hình kiến trúc phân tầng như OSI, TCP/IP,… Các mô hình này bao gồm nhiều tầng, mỗi tầng có một chức năng riêng giúp tổ chức dữ liệu và vận chuyển dữ liệu trong mạng lưới các máy tính. Một trong những tầng quan trọng của mô hình trên là tầng giao vận, nó bao gồm các giao thức hỗ trợ vận chuyển dữ liệu như TCP, UDP, DCCP, SCTP, IL,….

Trong đó có 2 giao thức được sử dụng phổ biến nhất hiện nay là TCP và UDP.

1. Một vài khái niệm cơ bản

Mô hình kiến trúc phân tầng OSI và TCP/IP:

Với mô hình như vậy, dữ liệu chuyển đi sẽ được đóng gói qua các tầng và được chuyển qua mạng, dữ liệu nhận sẽ được giải mã từ tầng dưới lên đến tầng ứng dụng (Application). Về cơ bản quy trình gửi và nhận dữ liệu giống với cách gửi và nhận 1 hộp quà.

Như vậy khi hai ứng dụng ở 2 máy khác nhau có thể giao tiếp với nhau, dữ liệu đều di qua tầng giao vận (Transport), ở đó có các giao thức hỗ trợ chúng. Trong bài này chúng ta cùng nhau tìm hiểu về 2 giao thức TCP và UDP tương đương với hai loại truyền thông: hướng liên kết và không liên kế.

Hướng liên kết (Connection-oriented): Dữ liệu được truyền qua một liên kết đã được thiết lập với 3 giai đoạn: thiết lập liên kết, truyền dữ liệu, đóng liên kết. Chuyền dữ liệu một cách tin cậy.

Không liên kết (Connectionless): Không cần 3 giai đoạn để thiết lập liên kết, chỉ có giai đoạn truyền dữ liệu. Chuyền dữ liệu không tin cậy.

2. Transmission Control Protocol là gì?

TCP hay Transmission Control Protocol là một trong những giao thức cốt lõi của bộ giao thức TCP/IP, nó thiết lập các quy tắc và quy trình tiêu chuẩn cho việc truyền thông tin qua internet. Giao thức này truyền dữ liệu với 3 giai giai đoạn của hướng liên kết, dữ liệu sẽ được truyền đi theo dòng byte một cách tin cậy và theo thứ tự.

Những lý do giúp đảm bảo độ tin cậy chính là có thiết lập liên kết, có kiểm soát luồng, kiểm soát tắc nghẽn và có cơ chế báo nhận.

Cơ chế báo nhận:

Khi bên A và bên B gửi dữ liệu, gói tin sẽ gửi kèm theo 2 số hiệu Seq và ACK. Với Seq là số hiệu của byte đầu tiên trong đoạn tin dữ liệu, ACK là số hiệu byte đầu tiên mong muốn được nhận từ bên còn lại. Với cách này TCP đảm bảo việc kiểm tra nhận và gửi giữa 2 phía.

Thiết lập liên kết với 3 giai đoạn (3-way handshake):

Giai đoạn 1: client A gửi cờ SYN (synchronization) với  yêu cầu thiết lập liên kết đến địa chỉ IP và số hiệu cổng phía server.

Giai đoạn 2: server khi nhận được SYN, nếu chấp nhận liên kết thì sẽ gửi lại packet kèm theo 2 số hiệu ACK/SYN (Acknowledgement/Synchronization) tới địa chỉ IP và số hiệu cổng của Client. Trường hợp server không chấp nhận liên kết thì sẽ gửi lại packet với 2 số hiệu RST/ACK (Reset/Acknowledgement).

Dù chấp nhận hay không chấp nhận liên kết server bắt buộc phải gửi lại packet xác nhận cho client, vì TCP là chuẩn tin cậy có cơ chế báo nhận, nếu không thông báo client sẽ nghĩ rằng gói tin bị mất hoặc nghẽn nên sẽ gửi lại.

Giai đoạn 3: Khi client nhận được SYN/ACK, client sẽ gửi lại gói tin ACK để thông báo cho server. Lúc này liên kết đã được thiết lập, dữ liệu có thể gửi luôn cùng gói tin ACK.

Đóng liên kết:

Khi muốn đóng liên kết, bên client sẽ gửi gói tin FIN (Finish) cho server

Server nhận được gói FIN, gửi gói ACK trả lời lại, đồng thời vào trạng thái đóng liên kết và gửi tiếp gói FIN

Client nhận được gói FIN, client gửi gói ACK để xác nhận

Cuối cùng Server nhận được gói ACK xác nhận và đóng liên kết

Kiểm soát luồng:

TCP đảm bảo rằng dữ liệu truyền đi sẽ không làm quá tải bên nhận, bởi vì khi bên nhận không còn khả năng nhận thêm dữ liệu những gói tin tiếp theo sẽ mất.

Để kiểm soát được luồng dữ liệu, bên nhận (reveiver) sẽ có một cửa sổ nhận Receiver Window (rwnd). Rwnd dùng để báo khoảng trống còn lại mà bên nhận có thể nhận. Mỗi khi nhận được một gói tin, bên nhận gửi một ACK đến bên gửi để xác nhận, trong gói tin ACK đó sẽ chứa giá trị của rwnd, từ đó bên gửi có thể tiếp tục gửi những gói tin tiếp theo.

Kiểm soát tắc nghẽn: TCP có 3 giai đoạn kiểm soát tắc nghẽn sau.

  • Slow-start: tăng tốc độ truyền gói tin theo cấp số mũ đến một ngưỡng nào đó (Threshold).
  • Congestion Avoidance: giai đoạn tránh tắc nghẽn, tốc độ sẽ tăng dần theo hàm tuyến tính hay cấp số cộng, thường là sau khi qua ngưỡng threshold.
  • Congestion detection: giai đoạn phát hiện tắc nghẽn, tắc nghẽn xảy ra khi timeout hoặc bên gửi nhận được 3 ACK trùng lặp.

TCP giúp cho dữ liệu được truyền đi đều đặn, tin cậy bỏ qua sự khác nhau về địa lý, phần cứng , phần mềm, đặc biệt nó linh hoạt và dễ nâng cấp. Một số ứng dụng cần đến sự tin cậy trong truyền dữ liệu của TCP như: http, mail, File transfer protocol (FTP),….

3. User datagram protocol là gì?

UDP hay User Datagram Protocol là loại giao thức giao tiếp không liên kết. UDP không lưu lại trạng thái liên kết ở bên gửi và bên nhận, vì vậy nó sẽ không chịu trách nhiệm với gói tin đã được truyền đi, bên gửi chỉ tạo một gói tin (datagram) kèm với địa chỉ IP, số hiệu cổng của bên nhận rồi gửi đi. UDP cũng không có quản lý tắc nghẽn và kiểm soát luồng như TCP, nhưng UDP cũng có khuôn dạng đoạn tin giống với  TCP:

Với UDP, mỗi gói tin sẽ kèm theo độ dài của dữ liệu mà gói đó có thể truyền đi, sự giới hạn này cùng với việc UDP không cần thiết lập liên kết đã giúp UDP truyền dữ liệu nhanh hơn, nên phù hợp với những ứng dụng cần tốc độ truyền dữ liệu nhanh.

Đi kèm với ưu điểm về tốc độ, UDP lại không có kiểm soát tắc nghẽn, kiểm soát luồng nên dẫn đến có thể làm tắc nghẽn Internet, gói tin đến không theo thứ tự gửi và đặc biệt là độ tin cậy thấp. Phát triển ứng dụng với UDP sẽ phức tạp hơn khi người phát triển phải cài đặt cơ chế kiểm soát độ tin cậy.

Một số ứng dụng sử dụng UDP hiện nay như: network time protocol (NTP), domain name service (DNS), Routing information protocol (RIP),…

Vậy là mình và các bạn đã tìm hiểu qua về 2 loại giao thức TCP và UDP. Mỗi loại sẽ có ưu điểm và nhược điểm riêng, việc chọn TCP hay UDP sẽ phụ thuộc vào ứng dụng các bạn đang phát triển. Thực tế, lập trình viên không cần phải đối mặt với những vần đề tắc nghẽn gói tin hay mất gói tin, ta chỉ cần truyền dữ liệu vào socket và các giao thức TCP, UDP sẽ lo việc còn lại. Các bạn cũng có thể tham khảo bài viết lập trình socket sau:

Lập trình socket với TCP :lap-trinh-socket-voi-tcp

Lập trình socket với UDP:lap-trinh-socket-với-udp

Lời kết

Qua bài này mình và các bạn đã tìm hiểu về hai loại giao thức phổ biến nhất hiên này là TCP và UDP. Trong bài viết mình có tham khảo một số tài liệu của Đại học Bách Khoa Hà Nội. Nếu bài viết có ý nghĩa bạn đọc hãy để lại đánh giá cũng như comment những thắc mắc bên dưới để mọi người cùng giải đáp. Cảm ơn bạn đọc, chúc bạn đọc thành công trên con đường học tập!

Leave a Reply

Your email address will not be published.