
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à 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.

Ở 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.
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 |
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 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.
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.
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:
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:
Quá trình Keep-Alive diễn ra như sau:
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.
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.
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.

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.
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.
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.

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.
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.
