Thứ Ba, 25/08/2026, 17:00 (GMT+0)

Socket là gì? Cách hoạt động và các loại Socket phổ biến

Quay lại Trang chủ Blog
Trên trang này

Socket là gì và đóng vai trò thế nào trong giao tiếp mạng? Bài viết sẽ phân tích chi tiết cấu trúc, nguyên lý hoạt động và so sánh chi tiết giữa Stream Socket (TCP), Datagram Socket (UDP) và Unix Domain Socket. Qua đó, bạn có thể chủ động lựa chọn mô hình truyền tải dữ liệu phù hợp, tối ưu hóa độ trễ và nâng cao độ tin cậy cho ứng dụng quy mô doanh nghiệp.

Socket là gì?

Socket là một điểm cuối (endpoint) của kênh giao tiếp hai chiều, cho phép hai chương trình trao đổi dữ liệu qua mạng. Mỗi socket được gắn với một địa chỉ mạng gồm IP và port, giúp hệ điều hành xác định dữ liệu cần được gửi đến thiết bị và dịch vụ nào.

Ví dụ, khi một ứng dụng trên máy tính kết nối đến server 192.168.1.10 qua port 443, socket đóng vai trò là điểm giao tiếp để ứng dụng gửi request và nhận dữ liệu phản hồi từ server. Ở phía server cũng có một socket tương ứng để tiếp nhận và xử lý kết nối.

socket-la-gi-1.jpg

Ở góc độ lập trình, socket là giao diện do hệ điều hành cung cấp để ứng dụng thực hiện các thao tác mạng như tạo socket, thiết lập kết nối, gửi, nhận và đóng dữ liệu. Với TCP, quá trình thường gồm các thao tác như socket(), bind(), listen(), accept() ở phía server và socket(), connect() ở phía client.

Hiểu đơn giản, nếu IP là địa chỉ của một ngôi nhà và port là số căn phòng, socket chính là điểm liên lạc để hai bên có thể bắt đầu “nói chuyện” và trao đổi dữ liệu.

Các hàm phổ biến trong lập trình Socket 

Hàm

Mô tả

socket()

Tạo một socket mới

bind()

Gán socket với một địa chỉ cụ thể, thường gồm địa chỉ IP và số cổng

listen()

Đưa socket vào trạng thái lắng nghe và sẵn sàng tiếp nhận kết nối

connect()

Yêu cầu thiết lập kết nối đến socket phía bên kia

accept()

Chấp nhận một yêu cầu kết nối đến

write()

Gửi dữ liệu qua socket

read()

Nhận dữ liệu từ socket

close()

Đóng socket hoặc kết nối

Tại sao cần dùng đến Socket?

Socket cần thiết vì nó cung cấp giao diện chuẩn để ứng dụng gửi và nhận dữ liệu qua mạng mà không phải tự xây dựng cơ chế giao tiếp từ đầu. Nhờ Socket API, chương trình có thể thiết lập kết nối, gửi dữ liệu, nhận phản hồi và đóng kết nối thông qua các thao tác do hệ điều hành cung cấp.

Ví dụ, một web server cần nhận hàng nghìn request từ các trình duyệt khác nhau. Thay vì tự xử lý từng chi tiết của quá trình truyền dữ liệu ở tầng mạng, server có thể sử dụng socket để lắng nghe kết nối, chấp nhận client và trao đổi dữ liệu. Các hệ điều hành phổ biến như Linux, Windows và macOS đều cung cấp cơ chế socket, đồng thời socket được hỗ trợ trong nhiều ngôn ngữ như C, C++, Java, Python và C#.

socket-la-gi-2.jpg

Socket cũng là nền tảng cho nhiều mô hình giao tiếp mạng, từ kết nối TCP truyền thống đến UDP và các cơ chế giao tiếp thời gian thực. Vì vậy, socket xuất hiện phía dưới nhiều loại ứng dụng như web server, API, ứng dụng chat, game online, truyền dữ liệu và hệ thống phân tán.

Cách hoạt động của Socket

Socket hoạt động trên cả hai giao thức TCP và UDP, cho phép các ứng dụng thiết lập kênh giao tiếp và trao đổi dữ liệu qua mạng. Có thể hiểu đơn giản: 

Socket = Địa chỉ IP + Số port

Trong đó, địa chỉ IP xác định thiết bị, còn port xác định dịch vụ hoặc tiến trình đang giao tiếp trên thiết bị đó. Port là một số có độ dài 16 bit, có giá trị từ 0 đến 65.535. Về mô hình mạng, socket gắn với hoạt động ở tầng 4 (Transport layer), nơi TCP và UDP đảm nhiệm việc vận chuyển dữ liệu giữa các ứng dụng.

Quá trình khởi tạo kết nối Socket từ Client tới Server

Trên Server, một số port thường được sử dụng cho các dịch vụ mạng cụ thể theo quy ước của IANA (Internet Assigned Numbers Authority), chẳng hạn: như Port 80: HTTP, Port 443: HTTPS, Port 22: SSH, Port 25: SMTP, Port 20/21: FTP. 

Khi Client muốn kết nối tới một dịch vụ, hệ điều hành sẽ cấp cho Client một port tạm thời (ephemeral port), sau đó Client sử dụng port này để kết nối tới địa chỉ IP và port mà dịch vụ trên Server đang lắng nghe.

Ví dụ, quá trình Client kết nối tới một Web Server sử dụng HTTP có thể diễn ra như sau:

  1. Client tạo socket: Client có địa chỉ IP1 và được hệ điều hành cấp một port tạm thời, chẳng hạn 5000. Khi đó, endpoint phía Client có thể được biểu diễn là (IP1, 5000).
  2. Client yêu cầu kết nối tới Server: Client sử dụng endpoint (IP1, 5000) để kết nối tới Web Server có địa chỉ IP2 và đang lắng nghe trên port 80, tức (IP2, 80).
  3. TCP thiết lập kết nối: Nếu sử dụng TCP, Client và Server thực hiện quá trình three-way handshake gồm SYN → SYN-ACK → ACK. Sau khi handshake hoàn tất, kết nối TCP được thiết lập.
  4. Hai bên trao đổi dữ liệu: Client và Server có thể bắt đầu gửi và nhận dữ liệu thông qua kết nối đã thiết lập. Ví dụ, Client gửi HTTP request đến Server, sau đó Server xử lý request và trả về HTTP response.

Cách Client và Server duy trì kết nối

Sau khi TCP connection được thiết lập, Client và Server có thể tiếp tục sử dụng kết nối đó để trao đổi dữ liệu mà không cần thực hiện lại quá trình bắt tay cho mỗi lần truyền.

Kết nối có thể được đóng khi một trong hai bên chủ động kết thúc phiên, chẳng hạn thông qua quy trình FIN/ACK, hoặc bị hủy đột ngột bằng RST. Ngoài ra, trong trường hợp kết nối không có dữ liệu trong thời gian dài, cơ chế TCP Keep-Alive có thể được sử dụng để kiểm tra xem phía bên kia còn hoạt động hay không.

Cơ chế TCP Keep-Alive

TCP Keep-Alive giúp phát hiện những kết nối mà phía bên kia có thể đã mất kết nối nhưng chưa thực hiện quy trình đóng TCP một cách bình thường. Trên Linux, cơ chế này thường được kiểm soát bởi ba tham số chính:

  • tcp_keepalive_time: Khoảng thời gian kết nối không hoạt động trước khi hệ thống bắt đầu gửi Keep-Alive probe. Giá trị mặc định thường là 7.200 giây (2 giờ).
  • tcp_keepalive_intvl: Khoảng thời gian giữa các lần gửi probe tiếp theo nếu chưa nhận được phản hồi. Giá trị mặc định thường là 75 giây.
  • tcp_keepalive_probes: Số lần thử gửi probe trước khi hệ thống xác định kết nối không còn khả dụng. Giá trị mặc định thường là 9 lần.

Quá trình Keep-Alive diễn ra như sau:

  1. Client thiết lập kết nối TCP với Server.
  2. Kết nối không hoạt động: Sau khoảng thời gian tcp_keepalive_time mà không có dữ liệu trao đổi, Client bắt đầu gửi Keep-Alive probe để kiểm tra trạng thái kết nối.
  3. Client chờ phản hồi từ Server:
    • Nếu Server phản hồi: Hệ thống xác nhận kết nối vẫn còn hoạt động, reset bộ đếm Keep-Alive và tiếp tục duy trì kết nối.
    • Nếu Server không phản hồi: Hệ thống chờ tcp_keepalive_intvl rồi gửi lại probe.
    • Quá trình này tiếp tục cho đến khi đạt số lần thử được quy định bởi tcp_keepalive_probes.
    • Nếu vẫn không nhận được phản hồi: Hệ điều hành xác định kết nối không còn khả dụng và đóng kết nối hoặc thông báo lỗi cho ứng dụng.

Với các giá trị mặc định trên, thời gian từ lúc bắt đầu kiểm tra đến khi hoàn tất các lần thử có thể vào khoảng:

tcp_keepalive_time + tcp_keepalive_intvl × tcp_keepalive_probes = 7200 + 75 × 9 = 7.875 giây, tương đương khoảng 2 giờ 11 phút 15 giây.

Tuy nhiên, đây không phải thời gian cố định mà mọi socket TCP đều tồn tại. Các tham số Keep-Alive phụ thuộc vào hệ điều hành và có thể được tùy chỉnh theo yêu cầu của ứng dụng. Ngoài ra, timeout của ứng dụng, firewall, load balancer hoặc các thiết bị mạng trung gian cũng có thể khiến kết nối bị đóng sớm hơn.

Các loại hình Socket phổ biến 

Trong thực tế, socket thường được phân thành bốn nhóm dựa trên giao thức và phạm vi sử dụng. Mỗi nhóm có đặc điểm riêng, phù hợp với những bài toán khác nhau.

Stream Socket

Là loại socket cung cấp luồng byte có thứ tự và hướng kết nối. Trong Internet socket, SOCK_STREAM thường được sử dụng cùng TCP. Tuy nhiên, Unix Domain Socket cũng có thể sử dụng SOCK_STREAM. 

  • Ưu điểm: TCP cung cấp cơ chế đánh số thứ tự, xác nhận và truyền lại, nên dữ liệu thường đến đúng thứ tự và được khôi phục khi có gói bị mất. Giao thức cũng có kiểm soát luồng và chống tắc nghẽn, phù hợp với truyền file, giao dịch, API và ứng dụng cần độ tin cậy cao.
  • Hạn chế: Quá trình bắt tay và duy trì trạng thái kết nối tạo thêm chi phí, đặc biệt khi số lượng kết nối lớn. Ngoài ra, cơ chế truyền lại có thể làm tăng độ trễ trong môi trường mạng kém ổn định.
socket-la-gi-5.jpg

Datagram Socket

Datagram Socket, hay socket không hướng kết nối, hoạt động qua giao thức UDP với kiểu SOCK_DGRAM. Ứng dụng có thể gửi dữ liệu mà không cần thiết lập kết nối trước giữa hai máy.

  • Ưu điểm: Mô hình xử lý đơn giản, không tốn chi phí bắt tay và duy trì trạng thái kết nối. Nhờ đó, UDP thường được chọn cho DNS, thoại và video thời gian thực, telemetry hoặc game trực tuyến.
  • Hạn chế: Dữ liệu có thể mất, đến sai thứ tự hoặc bị lặp mà giao thức không tự phát hiện. Ứng dụng phải tự xây dựng cơ chế kiểm soát nếu cần độ tin cậy, đồng thời cân nhắc kích thước datagram để tránh phân mảnh.

WebSocket

WebSocket là giao thức ở tầng ứng dụng, cung cấp kênh giao tiếp hai chiều giữa client và server trên nền một kết nối TCP. Kết nối bắt đầu bằng handshake sử dụng HTTP, sau đó được nâng cấp để trao đổi dữ liệu dưới dạng frame WebSocket.

  • Ưu điểm: Cho phép server chủ động đẩy dữ liệu về client mà không cần client hỏi lại, phù hợp với chat, thông báo và dashboard trực tuyến. Một kết nối duy nhất có thể phục vụ luồng dữ liệu liên tục theo cả hai chiều, giảm số lượng request so với polling.
  • Hạn chế: Kết nối dài hạn có thể bị proxy, load balancer hoặc firewall đóng nếu hạ tầng chưa được cấu hình phù hợp. Ứng dụng cũng cần tự xử lý reconnect và heartbeat để phát hiện kết nối đã mất.

Cần lưu ý WebSocket không đồng nghĩa với socket của hệ điều hành. Trình duyệt cung cấp API WebSocket cho JavaScript, chứ không cho phép mã phía client tự tạo raw TCP hoặc UDP socket.

socket-la-gi-6.jpg

Unix Domain Socket

Khác với SOCK_STREAM và SOCK_DGRAM, Unix Domain Socket là một communication domain/address family dành cho giao tiếp giữa các tiến trình trên cùng hệ thống. AF_UNIX có thể sử dụng SOCK_STREAM, SOCK_DGRAM hoặc SOCK_SEQPACKET. 

  • Ưu điểm: Bỏ qua các bước xử lý của tầng mạng nên thường có độ trễ thấp hơn khi so với kết nối qua địa chỉ loopback. Đây là lựa chọn phổ biến cho web server giao tiếp với application server, hoặc ứng dụng kết nối tới cơ sở dữ liệu chạy cùng host.
  • Hạn chế: Chỉ dùng được khi các tiến trình nằm trên cùng một máy, nên không phù hợp với kiến trúc phân tán nhiều server. Quyền truy cập vào file socket cũng cần được cấu hình đúng, tránh trường hợp dịch vụ không kết nối được do sai phân quyền.

Mức chênh lệch hiệu năng so với TCP loopback thay đổi theo hệ điều hành, kích thước dữ liệu và cách ứng dụng đọc ghi, nên đội kỹ thuật nên tự đo trên môi trường của mình.

Hy vọng bài viết đã giúp bạn hiểu Socket là gì, các thành phần cấu thành một socket, cơ chế trao đổi dữ liệu giữa client với server và đặc điểm của Stream Socket, Datagram Socket, WebSocket cùng Unix Domain Socket. Nắm rõ những khái niệm này sẽ hỗ trợ bạn lựa chọn mô hình giao tiếp phù hợp khi phát triển API, dịch vụ backend hoặc ứng dụng thời gian thực.

#Network
#Network
Sovereign Cloud không chỉ là đặt máy chủ trong nước. Với bối cảnh pháp lý dữ liệu mới tại Việt Nam, đây đang trở thành bài toán hạ tầng quan trọng cho doanh nghiệp Việt và doanh nghiệp nước ngoài hoạt động tại Việt Nam
Sovereign Cloud - Đám mây chủ quyền là gì? Và vì sao doanh nghiệp hoạt động tại Việt Nam nên quan tâm từ bây giờ?
Tiếp tục đọc