Socket là gì? Khái niệm cần biết về giao thức TCP/IP và UDP
Thịnh Văn Hạnh
06/04/2026
3174 Lượt xem
Chia sẻ bài viết
Khi bước vào thế giới công nghệ thông tin, dù bạn là lập trình viên, quản trị viên mạng hay chỉ đang bắt đầu tìm hiểu về hệ thống máy tính, thuật ngữ Socket gần như chắc chắn sẽ xuất hiện rất sớm. Đây là một khái niệm nền tảng trong lập trình mạng, nhưng cũng là điểm khiến nhiều người mới dễ bối rối nhất. Lý do rất đơn giản: Socket thường được nhắc đến cùng TCP, UDP, port, client-server và nhiều khái niệm liên quan khác, khiến người đọc dễ nhầm lẫn về bản chất thực sự của nó.
Trong bài viết này, bạn sẽ được giải thích rõ Socket là gì, cách nó hoạt động, các loại Socket phổ biến và sự khác nhau giữa TCP Socket với UDP Socket. Mục tiêu không chỉ là hiểu khái niệm, mà còn giúp bạn nhìn đúng vai trò của Socket trong giao tiếp mạng và ứng dụng thực tế.

Tóm Tắt Bài Viết
Socket là gì?
Khi bắt đầu tìm hiểu về lập trình mạng, nhiều người thường bị “ngợp” bởi các khái niệm như TCP, UDP, port hay client-server. Trong đó, socket là nền tảng quan trọng nhất nhưng lại dễ bị hiểu sai nhất. Nếu không nắm đúng bản chất, bạn sẽ rất khó hiểu cách các ứng dụng giao tiếp với nhau qua Internet.
- Socket là điểm cuối (endpoint) của một kết nối mạng, cho phép hai chương trình (process) gửi và nhận dữ liệu với nhau.
- Có thể hiểu đơn giản: Socket chính là “cổng giao tiếp” giữa client và server trong mô hình mạng.
- Một socket không tồn tại độc lập, mà luôn gắn với 3 thành phần cốt lõi:
- IP Address → xác định máy nào đang giao tiếp
- Port → xác định ứng dụng cụ thể trên máy đó
- Protocol (TCP/UDP) → xác định cách dữ liệu được truyền đi
- Khi 3 yếu tố này kết hợp lại, bạn có một kết nối hoàn chỉnh, ví dụ:
- 192.168.1.1:8080 (TCP) → client kết nối đúng server, đúng ứng dụng và đúng cách truyền
Tóm lại, socket không phải là giao thức hay chỉ là một con số port đơn lẻ. Nó là tổ hợp giúp định danh và duy trì một kết nối mạng, đóng vai trò trung tâm trong mọi hoạt động giao tiếp giữa các hệ thống.

Vai trò của Socket
Nhiều socket được sử dụng liên tục để tiết kiệm thời gian và nâng cao hiệu suất làm việc.
Ưu điểm lớn nhất của socket là hỗ trợ hầu hết các hệ điều hành bao gồm MS Windows, Linux,… Ngoài ra, nó cũng được sử dụng với nhiều ngôn ngữ lập trình, gồm C, C++, Java, Visual Basic hay Visual C++,… Vì thế nó tương thích với hầu hết mọi đối tượng người dùng với những cấu hình máy khác nhau.
Cách thức hoạt động của socket

Như đã đề cập trước đó, chức năng của socket là kết nối giữa máy khách và máy chủ thông qua TCP/IP và UDP để truyền và nhận dữ liệu qua Internet. Giao diện lập trình ứng dụng mạng này chỉ có thể hoạt động khi biết thông số IP và số hiệu cổng của 2 ứng dụng cần trao đổi dữ liệu cho nhau.
Điều kiện cần giữa 2 ứng dụng truyền thông tin để socket hoạt động:
- 2 ứng dụng nằm cùng trên một máy hoặc 2 máy khác nhau.
- Trường hợp 2 ứng dụng nằm trên cùng một máy, số hiệu cổng không trùng nhau.
>> Đọc thêm: HTML là gì? Tất cả thông tin về ngôn ngữ HTML dễ hiểu nhất
Phân loại Socket
Socket được chia làm 4 loại khác nhau, cụ thể:
- Stream Socket
- Datagram Socket
- Websocket
- Unix socket
Cùng BKNS tìm hiểu chi tiết về mỗi loại ở phần bên dưới:
Stream Socket là gì?

Stream Socket – socket hướng kết nối – hoạt động thông qua giao thức TCP (Transmission Control Protocol). Stream Socket chỉ hoạt động khi server và client đã kết nối với nhau. Điều này phần nào giải thích cho câu hỏi: “Giao thức TCP là gì?“
TCP/IP viết tắt của Transmission Control Protocol (TCP) và Internet Protocol (IP) là giao thức cài đặt truyền thông, chồng giao thức mà hầu hết các mạng máy tính ngày nay đều sử dụng để kết nối.
TCP/IP được đặt theo tên của 2 giao thức là giao thức điều khiển giao vận và giao thức liên mạng. Đây là 2 giao thức đầu tiên trên thế giới được định nghĩa và được phát triển vào năm 1978 bởi 2 nhà khoa học Bob Kahn và Vint Cerf.
Ưu điểm của Stream Socket là gì?
- Dữ liệu truyền đi đến đúng địa chỉ nhận, đúng thứ tự và thời gian nhanh chóng.
- Mỗi thông điệp gửi đi đều có xác nhận để thông báo cho người dùng thông tin về quá trình truyền tải.
Nhược điểm của Stream Socket là gì?
- Giữa máy chủ và máy nhận chỉ có 1 IP, nên khi kết nối, 1 máy phải chờ máy còn lại chấp nhận kết nối.
Datagram Socket là gì?

Datagram Socket – socket không hướng kết nối – hoạt động thông qua giao thức UDP ( User Datagram Protocol). Nó có thể hoạt động kể cả khi không có sự thiết lập kết nối giữa 2 máy với nhau. Điều này phần nào giải thích cho câu hỏi: “Giao thức UDP là gì?”
Ưu điểm của Datagram Socket là gì?
- Quá trình kết nối và truyền tải thông tin đơn giản, ít thao tác.
- Thời gian truyền tải dữ liệu cực nhanh.
Nhược điểm của Datagram Socket là gì?
- Quá trình truyền thông tin không đảm bảo tin cậy, thông tin có thể truyền sai thứ tự hoặc bị lặp.
Websocket là gì?

Websocket là công cụ hỗ trợ việc kết nối qua lại trên internet giữa client và server. Giúp diễn ra nhanh chóng và hiệu quả hơn thông qua việc sử dụng TCP socket. Websocket có thể áp dụng cho bất kì ứng dụng nào khác cần có sự trao đổi thông tin trên Internet, không riêng ứng dụng web.
Ưu điểm của Websocket là gì?
Websocket mang lại nhiều ưu điểm trong việc kết nối giữa client và server như:
- Tăng tốc độ truyền tải thông tin 2 chiều
- Dễ phát hiện và xử lý trong trường hợp có lỗi xảy ra
- Dễ dàng sử dụng, không cần cài đặt thêm các phần mềm bổ sung khác
- Không cần sử dụng nhiều phương pháp kết nối khác nhau
Nhược điểm của Websocket là gì?
Một số nhược điểm của Websocket mà bạn cần lưu ý khi sử dụng có thể kể đến như:
- Chưa hỗ trợ trên tất cả các trình duyệt
- Với các dịch vụ có phạm vi yêu cầu, Websocket chưa hỗ trợ hoàn toàn.
Unix socket là gì?

Unix socket là điểm giao tiếp hỗ trợ trao đổi giữa các ứng dụng khác nhau ngay trên cùng máy tính. Nó giúp tốc độ kết nối và truyền tải dữ liệu giữa các ứng dụng trên cùng một máy tính diễn ra nhanh, nhẹ và hiệu quả hơn.
Unix socket có thể tránh được các bước kiểm tra hoặc routing. Vì thế mà quá trình truyền tin sẽ đảm bảo và dễ dàng.
Ưu điểm Unix socket là gì?
Unix socket có nhiều ưu điểm vượt trội cụ thể như:
- Tăng tốc độ truy cập MySQL lên đến 30-50%
- Giảm thời gian latency xuống, từ 60ms còn 5ms
- Tăng PostgreSQL lên hơn 30%
- Tăng Redis lên 50%
- …
Nhược điểm Unix socket là gì?
Bên cạnh đó, Unix socket cũng còn tồn tại một số nhược điểm:
- Nếu các ứng dụng nằm trên những máy chủ khác nhau, sẽ không thể kết nối bằng Unix socket.
- Vấn đề phân quyền giữa các tệp tin trên Unix socket đôi khi vẫn xảy ra, ảnh hưởng đến việc sử dụng và thao tác.
>> Có thể bạn quan tâm: SDK là gì? Lợi ích và đặc điểm của một SDK tốt
Code Java ví dụ giao thức TCP/IP
TCP/IP Socket Server
package org.o7planning.tutorial.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleServerProgram {
public static void main(String args[]) {
ServerSocket listener = null;
String line;
BufferedReader is;
BufferedWriter os;
Socket socketOfServer = null;
// Mở một ServerSocket tại cổng 9999.
// Chú ý bạn không thể chọn cổng nhỏ hơn 1023 nếu không là người dùng
// đặc quyền (privileged users (root)).
try {
listener = new ServerSocket(9999);
} catch (IOException e) {
System.out.println(e);
System.exit(1);
}
try {
System.out.println(“Server is waiting to accept user…”);
// Chấp nhận một yêu cầu kết nối từ phía Client.
// Đồng thời nhận được một đối tượng Socket tại server.
socketOfServer = listener.accept();
System.out.println(“Accept a client!”);
// Mở luồng vào ra trên Socket tại Server.
is = new BufferedReader(new InputStreamReader(socketOfServer.getInputStream()));
os = new BufferedWriter(new OutputStreamWriter(socketOfServer.getOutputStream()));
// Nhận được dữ liệu từ người dùng và gửi lại trả lời.
while (true) {
// Đọc dữ liệu tới server (Do client gửi tới).
line = is.readLine();
// Ghi vào luồng đầu ra của Socket tại Server.
// (Nghĩa là gửi tới Client).
os.write(“>> “ + line);
// Kết thúc dòng
os.newLine();
// Đẩy dữ liệu đi
os.flush();
// Nếu người dùng gửi tới QUIT (Muốn kết thúc trò chuyện).
if (line.equals(“QUIT”)) {
os.write(“>> OK”);
os.newLine();
os.flush();
break;
}
}
} catch (IOException e) {
System.out.println(e);
e.printStackTrace();
}
System.out.println(“Sever stopped!”);
}
}
TCP/IP Client Socket
package org.o7planning.tutorial.socket;
import java.io.*;
import java.net.*;
public class SimpleClientDemo {
public static void main(String[] args) {
// Địa chỉ máy chủ.
final String serverHost = “localhost”;
Socket socketOfClient = null;
BufferedWriter os = null;
BufferedReader is = null;
try {
// Gửi yêu cầu kết nối tới Server đang lắng nghe
// trên máy ‘localhost’ cổng 9999.
socketOfClient = new Socket(serverHost, 9999);
// Tạo luồng đầu ra tại client (Gửi dữ liệu tới server)
os = new BufferedWriter(new OutputStreamWriter(socketOfClient.getOutputStream()));
// Luồng đầu vào tại Client (Nhận dữ liệu từ server).
is = new BufferedReader(new InputStreamReader(socketOfClient.getInputStream()));
} catch (UnknownHostException e) {
System.err.println(“Don’t know about host “ + serverHost);
return;
} catch (IOException e) {
System.err.println(“Couldn’t get I/O for the connection to “ + serverHost);
return;
}
try {
// Ghi dữ liệu vào luồng đầu ra của Socket tại Client.
os.write(“HELO”);
os.newLine(); // kết thúc dòng
os.flush(); // đẩy dữ liệu đi.
os.write(“I am Tom Cat”);
os.newLine();
os.flush();
os.write(“QUIT”);
os.newLine();
os.flush();
// Đọc dữ liệu trả lời từ phía server
// Bằng cách đọc luồng đầu vào của Socket tại Client.
String responseLine;
while ((responseLine = is.readLine()) != null) {
System.out.println(“Server: “ + responseLine);
if (responseLine.indexOf(“OK”) != –1) {
break;
}
}
os.close();
is.close();
socketOfClient.close();
} catch (UnknownHostException e) {
System.err.println(“Trying to connect to unknown host: “ + e);
} catch (IOException e) {
System.err.println(“IOException: “ + e);
}
}
}
Code Java ví dụ giao thức UDP
UDP Client Socket
package com.mycompany.testmqtts;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPServer {
public static void main(String args[]) throws Exception {
//khởi động udp server với port 8000
DatagramSocket socket = new DatagramSocket(8000);
System.out.println(“server is running”);
//tạo chuỗi byte
byte[] inServer = new byte[1024];
byte[] outServer = new byte[1024];
//tạo packet nhận dữ liệu
DatagramPacket rcvPkt = new DatagramPacket(inServer, inServer.length);
while (true) {
// chờ nhận dữ liệu từ client
socket.receive(rcvPkt);
System.out.println(“Packet Received!”);
System.out.println(“ip Address!” + rcvPkt.getAddress());
System.out.println(“port!” + rcvPkt.getPort());
System.out.println(“message Received!” + new String(rcvPkt.getData()));
InetAddress IP = rcvPkt.getAddress();
int port = rcvPkt.getPort();
//lấy dữ liệu nhận và gửi dữ liệu lại cho client
String temp = new String(rcvPkt.getData());
temp = “server :” + temp.toUpperCase();
outServer = temp.getBytes();
//gửi dữ liệu lại cho client
DatagramPacket sndPkt = new DatagramPacket(outServer, outServer.length, IP, port);
socket.send(sndPkt);
}
}
UDP Server Socket
package com.mycompany.testmqtts;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
public static void main(String args[]) {
try {
//tạo kết nối udp socket
DatagramSocket socket = new DatagramSocket();
//tạo các chuỗi byte
byte[] inData = new byte[1024];
byte[] outData = new byte[1024];
//ip or hostname của server udp
InetAddress IP = InetAddress.getByName(“localhost”);
//chuỗi dữ liệu gửi tới udp server
String data = “hello kaka”;
outData = data.getBytes();
//gửi dữ liệu tới server udp
DatagramPacket sendPkt = new DatagramPacket(outData, outData.length, IP, 8000);
System.out.println(“ready connect server”);
socket.send(sendPkt);
socket.setSoTimeout(10000);
System.out.println(“connect server success”);
//chờ nhận dữ liệu từ udp server gửi về
DatagramPacket recievePkt = new DatagramPacket(inData, inData.length);
System.out.println(“ready receive message from server)”);
socket.receive(recievePkt);
System.out.println(“receive messag”);
System.out.println(“Replay from Server: “ + new String(recievePkt.getData()));
} catch (Exception e) {
System.out.println(“error connect udp server”);
}
}
}
Ứng dụng thực tế của Socket trong đời sống công nghệ
Nếu không có Socket, thế giới mạng hiện đại mà chúng ta đang tận hưởng sẽ sụp đổ. Nó là công nghệ lõi đứng sau hàng loạt ứng dụng quen thuộc:
- Ứng dụng nhắn tin theo thời gian thực (Chat Apps): Messenger, Zalo, Telegram hay Discord đều sử dụng các dạng kết nối Socket (đặc biệt là WebSocket) để tin nhắn của bạn hiện lên máy người nhận ngay lập tức với độ trễ tính bằng mili-giây.
- Game Online Multiplayer: Các tựa game eSports như Liên Minh Huyền Thoại hay CS:GO cực kỳ chuộng UDP Sockets. Chúng cần cập nhật vị trí nhân vật liên tục và chấp nhận việc thỉnh thoảng rớt vài khung hình (packet loss) để đổi lấy tốc độ phản hồi cực nhanh.
- Internet of Things (IoT): Hàng triệu cảm biến thông minh, camera an ninh hay các thiết bị nhà thông minh sử dụng Socket để liên tục báo cáo dữ liệu môi trường, trạng thái hoạt động về máy chủ trung tâm.
- Thị trường tài chính & Livestream: Bảng giá chứng khoán nhảy số liên tục hay các buổi phát sóng trực tiếp (livestream) mượt mà đều dựa vào luồng dữ liệu khổng lồ được truyền tải qua các Socket.
Các lỗi phổ biến khi học socket
Khi bắt đầu học về socket, nhiều người gặp khó khăn không phải vì khái niệm này quá phức tạp, mà vì hiểu sai ngay từ nền tảng. Những lỗi dưới đây rất phổ biến và là nguyên nhân khiến việc học lập trình mạng trở nên rối rắm, khó áp dụng vào thực tế.
- Nhầm socket = port: Đây là lỗi cơ bản nhất. Nhiều người nghĩ socket chỉ đơn giản là một con số port (như 80, 443). Thực tế, port chỉ là một phần của socket. Một socket đầy đủ phải bao gồm IP + Port + Protocol. Nếu thiếu một trong ba yếu tố này, kết nối sẽ không thể xác định chính xác.
- Nhầm socket = giao thức: Socket không phải là TCP hay UDP. Đây là hai giao thức truyền dữ liệu, còn socket là giao diện (API) để các chương trình sử dụng các giao thức đó. Hiểu sai điểm này sẽ khiến bạn lẫn lộn giữa tầng ứng dụng và tầng mạng.
- Không hiểu TCP vs UDP: Rất nhiều người học socket nhưng không phân biệt rõ khi nào dùng TCP, khi nào dùng UDP. Điều này dẫn đến việc chọn sai giải pháp: dùng TCP cho ứng dụng cần tốc độ hoặc dùng UDP cho hệ thống cần độ chính xác, gây lỗi hoặc giảm hiệu năng.
- Không biết dùng socket khi nào: Một số người hiểu lý thuyết nhưng không biết ứng dụng thực tế. Ví dụ: không rõ khi nào cần WebSocket, khi nào dùng TCP truyền thống hay khi nào nên dùng Unix socket cho nội bộ server. Kết quả là kiến thức bị rời rạc, không triển khai được vào dự án.
Những lỗi trên không khó sửa, nhưng nếu không nhận ra sớm, bạn sẽ mất rất nhiều thời gian học lại từ đầu. Chỉ cần nắm đúng bản chất: socket là công cụ giao tiếp mạng, còn TCP/UDP là cách nó truyền dữ liệu, bạn sẽ dễ dàng kết nối được lý thuyết với thực tế và tiến xa hơn trong lập trình hệ thống.
Socket là nền tảng cốt lõi giúp các ứng dụng giao tiếp với nhau qua mạng, từ website, API đến hệ thống realtime. Khi hiểu rõ socket là gì, bạn sẽ dễ dàng nắm được cách hoạt động của TCP, UDP và lựa chọn đúng giải pháp cho từng tình huống. Điều quan trọng cần nhớ: socket không phải là giao thức, mà là công cụ kết nối giữa client và server. Nắm vững kiến thức này sẽ giúp bạn xây dựng hệ thống ổn định, tối ưu hiệu suất và phát triển kỹ năng lập trình mạng một cách bài bản.




































