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 09/11/2022 1861 Lượt xem Chia sẻ bài viết
Trong thời đại công nghệ thông tin phát triển mạnh mẽ như hiện nay, chúng ta phải thường xuyên tiếp nhận thông tin và cập nhật liên tục. Rất nhiều các khái niệm mới ra đời, khái niệm cũ được bổ sung, đổi mới để bắt kịp xu hướng thời đại. Nằm trong những kiến thức chuyên ngành, socket là khái niệm quan trọng thuộc lĩnh vực máy tính. Cùng đọc bài viết sau để hiểu socket là gì, các khái niệm cần biết về giao thức TCP/IP và UDP.
Tóm Tắt Bài Viết
Socket là gì?
Định nghĩa Socket: là điểm cuối (end-point) trong liên kết truyền thông hai chiều (two-way communication) biểu diễn kết nối giữa máy khách – máy chủ (Client – Server).
Các lớp Socket được ràng buộc với một cổng port (thể hiện qua con số cụ thể) để các tầng TCP (TCP Layer) định danh ứng dụng mà dữ liệu sẽ được gửi tới.
Socket là giao diện lập trình ứng dụng mạng được dùng để truyền và nhận dữ liệu trên internet. Giữa hai chương trình chạy trên mạng cần có một liên kết giao tiếp hai chiều, hay còn gọi là two-way communication nhằm kết nối 2 process trò chuyện với nhau. Điểm cuối (endpoint) của liên kết giữa 2 process này được gọi là Socket.
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”);
}
}
}
Tổng kết
Ngoài giao diện đẹp, tốc độ tải trang web cũng là một yếu tố cần lưu tâm khi phát triển web. Một trang web tải nhanh và mượt sẽ là một điểm cộng khi khách hàng lướt web.
Socket và ứng dụng của nó liên quan đến trang web cũng là một lưu ý cho các nhà lập trình và phát triển web. Bạn nên lưu ý và cân nhắc khi lựa chọn sử dụng.
Trên đây là những kiến thức về Socket, Socket là gì, ưu nhược điểm của socket và một số code ví dụ cho các giao thức. Hy vọng những kiến thức này sẽ hữu ích cho bạn trong quá trình phát triển web.
Thường xuyên ghé thăm và cập nhật các kiến thức mới trên website BKNS thường xuyên bạn nhé.
[mautic type=”form” id=”6″]Theo dõi tài khoản mạng xã hội của BKNS để cập nhật tin tức mới nhất:
+ Fanpage: https://www.facebook.com/bkns.vn
+ Youtube: https://www.youtube.com/c/BknsVn1
+ Pinterest: https://www.pinterest.com/bknsvn/
+ LinkedIn: https://www.linkedin.com/company/bkns-vn/