WebsiteJuly 25, 2023

Socket là gì và tại sao bạn cần biết về nó?

Share:
Socket là gì và tại sao bạn cần biết về nó?

Socket là một khái niệm quan trọng trong lập trình mạng, nhưng không phải ai cũng hiểu rõ nó. Bạn có biết socket là gì, socket hoạt động như thế nào và socket có những loại nào không? Nếu bạn chưa biết, hãy cùng tôi tìm hiểu trong bài viết này nhé!

Socket là gì?

Socket là một giao diện lập trình ứng dụng (API) cho phép các ứng dụng trên các máy tính khác nhau giao tiếp với nhau thông qua mạng. Socket cung cấp một cách trừu tượng hóa cho việc truyền và nhận dữ liệu giữa các tiến trình (process) hoặc luồng (thread) khác nhau.

Socket được ràng buộc với một địa chỉ IP và một số cổng (port) để xác định địa điểm của ứng dụng gửi và nhận dữ liệu. Socket cũng sử dụng một giao thức (protocol) để quy định cách thức truyền dữ liệu, ví dụ như TCP (Transmission Control Protocol) hoặc UDP (User Datagram Protocol).

Socket được coi là một điểm cuối (endpoint) của liên kết giao tiếp hai chiều (two-way communication) giữa hai ứng dụng. Một liên kết giao tiếp có thể có nhiều socket, tùy thuộc vào số lượng ứng dụng tham gia. Ví dụ, khi bạn truy cập một trang web, trình duyệt của bạn sẽ tạo ra một socket để kết nối với máy chủ web, và máy chủ web cũng sẽ tạo ra một socket để phản hồi lại cho bạn.

Socket hoạt động như thế nào?

Socket hoạt động theo mô hình client-server, trong đó client là ứng dụng yêu cầu dịch vụ, và server là ứng dụng cung cấp dịch vụ. Mỗi socket có hai phần: một phần là socket descriptor, là một số nguyên được hệ điều hành cấp phát để đại diện cho socket; và một phần là socket address, là một cấu trúc dữ liệu chứa địa chỉ IP và số cổng của ứng dụng.

Để thiết lập kết nối giữa client và server, client phải biết địa chỉ IP và số cổng của server. Client sẽ tạo ra một socket descriptor và gán cho nó một socket address bất kỳ (thường là địa chỉ IP của máy client và số cổng ngẫu nhiên). Sau đó, client sẽ gửi yêu cầu kết nối đến server thông qua hàm connect(), bao gồm socket descriptor và socket address của server.

Server sẽ tạo ra một socket descriptor và gán cho nó một socket address xác định (thường là địa chỉ IP của máy server và số cổng được thiết lập sẵn). Server sẽ lắng nghe các yêu cầu kết nối từ client thông qua hàm listen(), và chấp nhận các yêu cầu kết nối thông qua hàm accept(). Khi server chấp nhận một yêu cầu kết nối, nó sẽ tạo ra một socket descriptor mới và gán cho nó socket address của client. Sau đó, server sẽ gửi phản hồi lại cho client thông qua socket này.

Sau khi kết nối được thiết lập, client và server có thể trao đổi dữ liệu với nhau thông qua các hàm send() và receive(), sử dụng socket descriptor của mình. Khi không cần truyền dữ liệu nữa, client và server có thể đóng kết nối thông qua hàm close(), giải phóng socket descriptor và socket address của mình.

Socket có những loại nào?

Socket có thể được phân loại theo nhiều tiêu chí khác nhau, nhưng hai tiêu chí quan trọng nhất là giao thức và miền. Theo giao thức, socket có hai loại chính là stream socket và datagram socket. Theo miền, socket có ba loại chính là Internet socket, Unix socket và Bluetooth socket.

Stream socket

Stream socket là loại socket sử dụng giao thức TCP để truyền dữ liệu. Stream socket đảm bảo tính tin cậy, tuần tự và không mất mát của dữ liệu. Stream socket cần thiết lập kết nối trước khi truyền dữ liệu, và chỉ có thể giao tiếp với một socket khác tại một thời điểm. Stream socket thường được dùng cho các ứng dụng yêu cầu độ chính xác cao, ví dụ như truyền tải file, email, web…

Datagram socket

Datagram socket là loại socket sử dụng giao thức UDP để truyền dữ liệu. Datagram socket không đảm bảo tính tin cậy, tuần tự và không mất mát của dữ liệu. Datagram socket không cần thiết lập kết nối trước khi truyền dữ liệu, và có thể giao tiếp với nhiều socket khác tại cùng một thời điểm. Datagram socket thường được dùng cho các ứng dụng yêu cầu tốc độ cao, ví dụ như trò chuyện, game, video…

Internet socket

Internet socket là loại socket sử dụng địa chỉ IP để xác định vị trí của ứng dụng trên mạng Internet. Internet socket có hai loại là IPv4 socket và IPv6 socket, tương ứng với hai phiên bản của địa chỉ IP. Internet socket có thể là stream socket hoặc datagram socket, tùy thuộc vào giao thức được sử dụng.

Unix socket

Unix socket là loại socket sử dụng tên file để xác định vị trí của ứng dụng trên hệ điều hành Unix hoặc các hệ điều hành tương tự. Unix socket chỉ có thể giao tiếp với các ứng dụng cùng chạy trên một máy tính. Unix socket có thể là stream socket hoặc datagram socket, tùy thuộc vào chế độ được sử dụng.

Bluetooth socket

Bluetooth socket là loại socket sử dụng địa chỉ MAC để xác định vị trí của ứng dụng trên các thiết bị có hỗ trợ Bluetooth. Bluetooth socket có thể giao tiếp với các ứng dụng trong phạm vi ngắn (khoảng 10 mét). Bluetooth socket có thể là stream socket hoặc datagram socket, tùy thuộc vào hồ sơ (profile) được sử dụng.

Socket là một khái niệm quan trọng trong lập trình mạng, giúp các ứng dụng giao tiếp với nhau thông qua mạng. Socket có nhiều loại khác nhau, vì vậy mong rằng bài viết đã giúp bạn có thể đưa ra những sự lựa chọn phù hợp cho mình.