Socket() là gì
Trên máy tính hay các bo mạch nhúng, khi ta viết một ứng dụng nào đó trên hệ điều hành. Ứng dụng đó sẽ tạo một hoặc nhiều process để có thể chạy ứng dụng đó. Và để trao đổi giữ liệu giữa 2 process với nhau thì dùng
🖥️ Trên 1 máy (Single host)
- Pipe, FIFO → trao đổi dữ liệu tuyến tính giữa process cha-con.
- Message Queue → gửi/nhận thông điệp không đồng bộ.
- Shared Memory + Semaphore/Mutex → tốc độ cao, cần đồng bộ hóa.
- Signal → gửi thông báo sự kiện nhỏ.
Tất cả mấy cái này đều chỉ hoạt động trong nội bộ kernel của cùng một máy.
Nhưng một câu hỏi đặt ra là: "Làm thế nào mà ta có thể trao điểm dữ liệu giữa hai process trên 2 máy 🖥️ khác nhau ?"
Socket() ra đời để giải quyết vấn đề này.
I. Tổng quan
1. Khái niệm
Trong hệ thống mạng máy tính tồn tại những mô hình tham chiếu có kiến trúc phần tầng (OSI, TCP/IP…) nhằm hỗ trợ chức năng trao đôi thông tin giữa các ứng dụng ở nhiều máy tính khác nhau.
Dữ liệu sẽ được đóng gói từ application -> physcal
, và sau đó được chuyển qua cho máy khác. Máy khác nhận được sẽ truyền từ physical -> application
.
Nếu bạn quan tậm có thể đọc kỹ hơn ở đây: mô hình OSI
Ở đây socket chính là cửa giao tiếp giữa application
và transport
, mà còn là những API để ứng dụng có thể làm việc với TCP/UDP.
Một socket thường được định danh bởi cặp (IP address, Port number).
"Thế IP là gì ? PORT là gì?"
Ví dụ:
- Trong một thành phố, để có thể gửi hàng tới một tòa nhà nào đó thì
ta cần phải biết địa chỉ của tòa nhà đó -> IP.
- Khi tòa nhà đó đã nhận được hàng thì cần phải gửi gói hàng đó đến
phòng của cư dân. Số phòng -> Port
Trong môi trường mạng cũng thế, IP dùng để xác định máy tính nào nhận dữ liệu, và Port sẽ xác định được chính xác ứng dụng nào đang cần dữ liệu này.
Có thể thấy ở hình ảnh trên, tầng transport có 2 phương thức là TCP (Ttransmission Control Protocol) và UDP (User Datagram Protocol), như vậy socket cơ bản là có 2 loại:
- Stream Socket sử dụng TCP truyền dòng bytes
- Datagram Socket dử dụng UDP truyền gói tin.
2. Mô hình client-server
- Server sẽ lắng nghe các yêu cầu kết nối từ client.
- Sau khi kết nối, client bắt đầu yêu cầu dữ liệu. Server đọc yêu cầu đó, tiến hành xử lí.
- Data sau khi xử lí xong, sẽ được trả về cho client.
- Nếu client không muốn giao tiếp nữa, thì gọi
close()
điều này sẽ giúp server nhận ra và ngắt kết nối.
Tham khảo
All rights reserved