Socket được coi là một cổng giao tiếp giữa các ứng dụng trên mạng. Nó cho phép các thiết bị trao đổi thông tin với nhau thông qua một kết nối định sẵn. Socket thường được sử dụng trong các ứng dụng như trò chuyện trực tuyến, chia sẻ tệp tin, chia sẻ dữ liệu giữa các máy tính trên mạng. Show
Việc hiểu về socket là một bước quan trọng trong việc xây dựng các ứng dụng mạng đáng tin cậy và hiệu quả. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về socket, phân loại socket, cách sử dụng và ứng dụng của nó nhé. Socket là gì?Socket cho phép giao tiếp giữa hai quy trình khác nhau trên cùng một máy hoặc các máy khác nhau. Nói chính xác hơn, đó là một cách để giao tiếp với các máy tính bằng cách sử dụng các mô tả tệp Unix tiêu chuẩn. Trong Unix, mọi hành động I / O được thực hiện bằng cách viết hoặc đọc một mô tả tệp. Mô tả tệp chỉ là một số nguyên được liên kết với một tệp đang mở và nó có thể là kết nối mạng, tệp văn bản, thiết bị đầu cuối hoặc thứ gì khác. Đối với một lập trình viên, một socket hoạt động giống như một bộ mô tả tệp cấp thấp. Điều này là do các lệnh như read() và write() hoạt động với các socket giống như cách chúng làm với các tập tin và đường dẫn. Socket lần đầu tiên được giới thiệu trong 2.1BSD và sau đó được tinh chỉnh thành dạng hiện tại của chúng với 4.2BSD. Tính năng Socket hiện có sẵn với hầu hết các bản phát hành hệ thống UNIX hiện tại. Socket được sử dụng ở đâu?Unix Socket được sử dụng trong framwork ứng dụng client-server. Mỗi server là một quá trình thực hiện một số chức năng theo yêu cầu từ client. Hầu hết các giao thức cấp ứng dụng như FTP, SMTP và POP3 sử dụng các Socket để thiết lập kết nối giữa client và server và sau đó để trao đổi dữ liệu. Phân loại SocketHiện nay có bốn loại Socket: Stream Sockets và Datagram Sockets được sử dụng phổ biến nhất, trong khi Raw Sockets và Sequenced Packet Sockets hiếm khi được sử dụng. Các quy trình được cho là chỉ giao tiếp giữa các Socket cùng loại nhưng không có hạn chế nào ngăn cản giao tiếp giữa các Socket thuộc các loại khác nhau.
Dòng Socket UNIX z / OSTrong z / OS® UNIX, các dòng Socket sau được hỗ trợ:
Socket AF_UNIX cung cấp giao tiếp giữa các quy trình trên một hệ thống duy nhất. Dòng Socket này hỗ trợ hai loại Socket — Stream Sockets và datagram. Các loại Socket này được mô tả trong phần tiếp theo. Socket AF_INET và AF_INET6 cung cấp phương tiện giao tiếp giữa các chương trình ứng dụng trên các hệ thống khác nhau bằng Giao thức điều khiển truyền tải do sản phẩm TCP/IP cung cấp. Dòng socket này hỗ trợ cả Stream Sockets và datagram. Mỗi loại Socket này được mô tả trong phần tiếp theo. Hướng dẫn sử dụng các loại SocketPhần này mô tả các tiêu chí để giúp bạn chọn loại socket thích hợp cho một chương trình ứng dụng. Nếu bạn đang giao tiếp với một chương trình ứng dụng hiện có, bạn phải sử dụng các giao thức tương tự như chương trình ứng dụng hiện có. Ví dụ: nếu bạn giao tiếp với một ứng dụng sử dụng TCP, bạn phải sử dụng Stream Sockets. Đối với các chương trình ứng dụng khác, bạn nên xem xét các yếu tố sau:
Ứng dụng của SocketSocket được sử dụng rộng rãi trong lập trình mạng và có nhiều ứng dụng khác nhau, bao gồm:
Web Socket là gìWebSocket là một giao thức truyền tải dữ liệu hai chiều (full-duplex) trên mạng, cho phép các ứng dụng web truyền tải dữ liệu và trao đổi thông tin với máy chủ một cách liên tục và hiệu quả hơn. WebSocket giúp cho việc trao đổi dữ liệu giữa các ứng dụng web và máy chủ trở nên đơn giản và hiệu quả hơn, giảm thiểu lưu lượng truyền tải và giảm độ trễ (latency). Trong truyền thống HTTP, mỗi lần ứng dụng web cần cập nhật thông tin từ máy chủ, nó phải gửi một yêu cầu (request) đến máy chủ và đợi máy chủ trả về phản hồi (response). Tuy nhiên, với WebSocket, một kết nối hai chiều được thiết lập giữa ứng dụng web và máy chủ, cho phép ứng dụng web và máy chủ gửi và nhận dữ liệu một cách liên tục mà không cần phải thiết lập lại kết nối. WebSocket được hỗ trợ bởi hầu hết các trình duyệt hiện đại và cũng có sẵn các thư viện WebSocket để sử dụng trong các ngôn ngữ lập trình khác nhau. WebSocket đã trở thành một công nghệ quan trọng trong lập trình web, cho phép xây dựng các ứng dụng web thời gian thực như các trò chơi trực tuyến, truyền thông trực tuyến, các ứng dụng chat và nhiều ứng dụng web khác. Địa chỉ trong SocketAddress familiesCác họ địa chỉ xác định các kiểu xưng hô khác nhau. Tất cả các host trong cùng một dòng địa chỉ đều sử dụng cùng một lược đồ để giải quyết các điểm cuối Socket. z / OS® UNIX hỗ trợ ba họ địa chỉ — AF_INET, AF_INET6 và AF_UNIX. Các họ địa chỉ AF_INET và AF_INET6 xác định địa chỉ trong miền IP. Họ địa chỉ AF_UNIX xác định địa chỉ trong miền UNIX z / OS. Trong UNIX z / OS, không gian địa chỉ có thể sử dụng giao diện socket để giao tiếp với các không gian địa chỉ khác trên cùng một server. Lưu ý: Trong trường hợp này, domain UNIX z / OS được sử dụng theo cách tương tự như domain UNIX trên các hệ thống loại UNIX khác. Socket addressMột địa chỉ socket được định nghĩa bởi cấu trúc sockaddr trong sys/socket.h include file. Cấu trúc có ba trường, như được hiển thị trong ví dụ sau: struct sockaddr { unsigned char sa_len; unsigned char sa_family; char sa_data[14]; /* variable length data */ }; Trường sa_len chứa độ dài của trường sa_data. Trường sa_family chứa họ địa chỉ. Nó là AF_INET hoặc AF_INET6 cho tên miền Internet và AF_UNIX cho tên miền UNIX. Trường sa_data khác nhau đối với mỗi họ địa chỉ. Mỗi họ địa chỉ xác định cấu trúc riêng của nó, có thể được phủ lên trên cấu trúc sockaddr. Xem Địa chỉ trong miền AF_INET và Địa chỉ trong miền AF_INET6 để biết thêm thông tin về miền Internet và Địa chỉ trong miền AF_UNIX để biết thêm thông tin về miền UNIX. Internet addressesĐịa chỉ Internet đại diện cho một giao diện mạng. Mỗi địa chỉ Internet trong một miền AF_INET được quản lý phải là duy nhất. Mặt khác, không nhất thiết mỗi server phải có một địa chỉ Internet duy nhất; trên thực tế, một server lưu trữ có nhiều địa chỉ Internet như nó có giao diện mạng. PortsMột cổng được sử dụng để phân biệt giữa các chương trình ứng dụng khác nhau sử dụng cùng một giao diện mạng. Đây là một vòng loại bổ sung được sử dụng bởi phần mềm hệ thống để lấy dữ liệu vào đúng chương trình ứng dụng. Về mặt vật lý, một cổng là một số nguyên 16 bit. Một số cổng được dành riêng cho các chương trình hoặc giao thức ứng dụng cụ thể và được gọi là các cổng well-known. Network byte orderCác cổng và địa chỉ thường được chỉ định cho các cuộc gọi sử dụng quy ước sắp xếp thứ tự byte mạng. Quy ước này là một phương pháp sắp xếp byte theo kiến trúc máy cụ thể. Có hai phương pháp phổ biến:
Sử dụng sắp xếp thứ tự byte mạng cho dữ liệu được trao đổi giữa các server cho phép các server sử dụng các kiến trúc khác nhau để trao đổi thông tin địa chỉ. Lưu ý: Giao diện socket không xử lý sự khác biệt về thứ tự byte dữ liệu của chương trình ứng dụng. Người viết chương trình ứng dụng phải tự xử lý sự khác biệt thứ tự byte. Địa chỉ trong domain AF_INETĐịa chỉ Socket trong dòng địa chỉ Internet bao gồm các trường sau: họ địa chỉ (AF_INET), địa chỉ Internet, độ dài của địa chỉ Internet đó, cổng và mảng ký tự. Cấu trúc của địa chỉ Socket Internet được xác định bởi cấu trúc sockaddr_in sau, được tìm thấy trong netinet / in.h bao gồm tệp: struct in_addr { ip_addr_t s_addr; struct sockaddr_in { unsigned char sin_len; unsigned char sin_family; unsigned short sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; }; sin_len được đặt theo chiều dài của cấu trúc sockaddr_in sin_family được đặt thành AF_INET T sin_port cổng được sử dụng bởi chương trình ứng dụng, theo thứ tự byte mạng sin_zero trường nên được đặt thành tất cả các số không Địa chỉ trong domain AF_INET6Địa chỉ Socket trong dòng địa chỉ Internet bao gồm các trường sau: họ địa chỉ (AF_INET6), địa chỉ Internet, độ dài của địa chỉ Internet đó, cổng, thông tin luồng và thông tin phạm vi. Cấu trúc của địa chỉ Socket Internet được xác định bởi cấu trúc sockaddr_in6 sau, được tìm thấy trong netinet / in.h bao gồm tệp: struct in6_addr { union { uint8_t _S6_u8[16]; uint32_t _S6_u32[4]; } _S6_un; }; define s6_addr _S6_un._S6_u8struct sockaddr_in6 { uint8_t sin6_len; sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; }; sin6_len Đặt theo chiều dài của cấu trúc sockaddr_in6 sin6_family Đặt thành AF_INET sin6_port Cổng được sử dụng bởi chương trình ứng dụng, theo thứ tự byte mạng sin6_flowinfo Trường 32 bit chứa lớp lưu lượng truy cập và nhãn luồng sin6_addr một cấu trúc in6_addr duy nhất , chứa một địa chỉ IPv6 128-bit được lưu trữ theo thứ tự byte mạng sin6_scope_id Một số nguyên 32 bit xác định một tập hợp các giao diện phù hợp với phạm vi của địa chỉ được thực hiện trong trường sin6_addr. Lưu ý: Cấu trúc IPv6 được hiển thị bằng cách xác định macro kiểm tra tính năng _OPEN_SYS_SOCK_IPV6. Địa chỉ trong domain AF_UNIXĐịa chỉ Socket trong họ địa chỉ AF_UNIX bao gồm ba trường: độ dài của tên đường dẫn sau, họ địa chỉ (AF_UNIX) và chính tên đường dẫn. Cấu trúc của một địa chỉ Socket AF_UNIX được định nghĩa như sau: struct sockaddr_un { unsigned char sun_len; unsigned char sun_family; char sun_path[108]; /* pathname */ }; Cấu trúc này được định nghĩa trong cấu trúc sockaddr_un được tìm thấy trong sys/un.h include file. sun_len chứa độ dài của tên đường dẫn trong sun_path; sun_family trường được đặt thành AF_UNIX; và sun_path chứa tên đường dẫn chấm dứt bằng null. Kết luậnSocket là một khái niệm cơ bản trong lập trình mạng, giúp các thiết bị trên mạng có thể kết nối và truyền dữ liệu với nhau. Sử dụng socket, lập trình viên có thể tạo các ứng dụng truyền thông giữa các thiết bị trên mạng, đảm bảo tính đáng tin cậy và hiệu quả cho các hoạt động trao đổi thông tin giữa các thiết bị trên mạng. Việc hiểu và sử dụng socket là rất quan trọng trong lập trình mạng và đóng góp vào sự phát triển của các ứng dụng trực tuyến hiện nay. |