Một ổ cắm là gì?


48

Ai đó có thể giải thích cho tôi một ổ cắm là gì? Tôi thấy nó trong nhiều từ viết tắt trong bối cảnh SSL, v.v.

Ngoài ra, tại sao nó được gọi là ổ cắm? Có phải hoàn toàn bởi vì đó là cái tên mà họ đã phát minh ra? Hay đó là cái tên đầu tiên họ nghĩ ra?


9
Theo cách nói của giáo dân: ổ cắm là điện thoại. Đó là thứ bạn cầm trên tay cho phép bạn trò chuyện với một chiếc điện thoại khác. Sự tương tự bị phá vỡ một chút: Hầu hết các cuộc trò chuyện điện thoại là ngang hàng. Kết nối ổ cắm là máy khách đến máy chủ. Máy khách (chẳng hạn như, nhưng không giới hạn ở phần mềm máy trạm như trình duyệt) kết nối với máy chủ (như máy chủ web, máy chủ tệp, máy chủ xác thực hoặc máy chủ khác). Một lỗ hổng khác trong sự tương tự: khi bạn đóng kết nối ổ cắm, ổ cắm bị phá hủy và bạn phải tạo một ổ cắm mới trước khi bạn có thể thiết lập kết nối mới.
G-Man nói 'Tái lập Monica'

Nó không phải là xấu cho một tương tự. Một máy chủ chỉ là một trung tâm cuộc gọi và có thể có hàng trăm cuộc gọi hoạt động cùng một lúc.
MSalters

Câu trả lời:


42

Một ổ cắm chỉ là một điểm cuối hợp lý cho giao tiếp. Chúng tồn tại trên lớp vận chuyển. Bạn có thể gửi và nhận mọi thứ trên một ổ cắm, bạn có thể liên kết và lắng nghe một ổ cắm. Một ổ cắm dành riêng cho một giao thức, máy và cổng và được xử lý như vậy trong tiêu đề của gói.

Các hướng dẫn của Beej về Lập trình mạngTruyền thông giữa các quá trình đều có thông tin tốt về cách sử dụng ổ cắm và thậm chí trả lời chính xác câu hỏi này .


64

Nói một cách đơn giản nhất, socket là một tệp giả đại diện cho kết nối mạng. Khi một ổ cắm đã được tạo (sử dụng các nguyên hàm thích hợp và các tham số thích hợp để xác định máy chủ khác), ghi vào ổ cắm được chuyển thành các gói mạng được gửi đi và dữ liệu nhận được từ mạng có thể được đọc từ ổ cắm.

Về một khía cạnh, các socket rất giống với các đường ống: chúng trông giống như các tệp cho các chương trình sử dụng chúng, nhưng không dẫn đến việc đọc hoặc ghi vào đĩa; thay vào đó, họ cho phép giao tiếp với một chương trình khác (cục bộ trong trường hợp đường ống và có thể từ xa trong trường hợp ổ cắm). Họ cũng cung cấp, như bạn đề cập, giao tiếp hai chiều (giống như một cặp đường ống được kết nối đúng cách có thể).

Cuối cùng, thông thường các chương trình trên một máy sẽ giao tiếp bằng các giao thức mạng tiêu chuẩn, chẳng hạn như TCP; Sẽ rất lãng phí nếu đi tất cả các phần cứng mạng (nếu có!), kiểm tra điện toán, v.v., chỉ để quay lại cùng một máy chủ: đó là nơi mà các ổ cắm tên miền Unix xuất hiện. chúng kết nối các tiến trình trên cùng một máy chủ chứ không phải các tiến trình từ xa và không cố gắng sử dụng bất kỳ tài nguyên mạng nào cả. Theo cách này, chúng là một phương tiện giao tiếp giữa các quá trình.

Như tripleee đã đề cập, trong quá trình lịch sử của BSD, các đường ống được giới thiệu sớm hơn các ổ cắm và được thực hiện lại bằng cách sử dụng các ổ cắm một khi chúng tồn tại. Cùng một tài liệu tham khảo, Thiết kế và triển khai Hệ điều hành FreeBSD , đề cập rằng các đường ống sau đó được hoàn nguyên thành triển khai không có ổ cắm vì lý do hiệu suất: điều này chắc chắn nhấn mạnh thực tế là các đường ống có chung điểm tương đồng.


3
Có thể cũng đề cập đến việc các ống dẫn trước các ổ cắm, nhưng một khi giao diện ổ cắm được thêm vào Unix, sẽ rất có ý nghĩa khi thực hiện lại các đường ống bằng cách sử dụng các ổ cắm cục bộ.
tripleee

@tripleee: Đó là một điểm lịch sử tuyệt vời. Quan tâm để cung cấp một tài liệu tham khảo?
dhag

Googling nhanh chóng xuất hiện trang 40 trong Thiết kế và triển khai Hệ điều hành FreeBSD ; văn bản đề cập đến sự thay đổi này trong 4.2BSD nhưng cũng làm rõ rằng đây không còn là cách nó được thực hiện, vì lý do hiệu suất.
tripleee

Tuyệt vời, tôi sẽ thêm điều này vào câu trả lời của tôi.
dhag

Câu trả lời kỹ thuật tốt nhất trong tất cả
chaosguru

7

Một ổ cắm trừu tượng. Nó cung cấp giao diện cho các ứng dụng sử dụng tài nguyên hệ thống (trong trường hợp này là kết nối mạng) theo cách cho phép hệ điều hành làm trung gian và tổ chức sử dụng tài nguyên giới hạn bởi bất kỳ số lượng ứng dụng nào.

Nếu dữ liệu được gửi qua ổ cắm có thể được coi là phong bì thư, thì ổ cắm sẽ là hộp thư của bạn. Bạn đính kèm một hộp thư (ổ cắm) vào nhà của bạn (chương trình) và đặt thư đi (dữ liệu) của bạn vào đó. Tại một thời điểm theo lịch trình, người đưa thư (hệ điều hành) xuất hiện và nhận thư đi của bạn và bỏ bất kỳ thư đến nào trong cùng một hộp thư. Thư gửi đi của bạn được chuyển thay mặt bạn đến người nhận thông qua xe tải của người đưa thư (kết nối mạng) cùng với tất cả thư của hàng xóm của bạn. Điều này cho phép bạn tương ứng với những người ở xa mà không cần chi phí, thời gian, khó khăn, v.v. để tự mình gửi thư.

Về lý do tại sao họ được gọi là 'ổ cắm' tốt, khái niệm rằng các nhà phát minh có thể gọi nó là bất cứ điều gì họ muốn có thể đóng một vai trò lớn ở đó. Mặc dù, theo tôi thì đó không phải là một cái tên tồi :)


7

Bây giờ, nó là gì?

Một ổ cắm, hoặc "ổ cắm" có thể là một số điều:

Trước hết, đó là một mô hình suy nghĩ và giao diện lập trình ứng dụng (API) . Điều đó có nghĩa là bạn có một bộ quy tắc bạn cần tuân theo và một bộ chức năng mà bạn có thể sử dụng để viết các chương trình làm một việc gì đó, theo một hợp đồng được chỉ định chính xác. Trong trường hợp cụ thể này, một cái gì đó có nghĩa là trao đổi dữ liệu với một chương trình khác.

API socket chỉ tóm tắt rộng rãi các chi tiết về "giao tiếp" nói chung. Nó gói gọn những người bạn nói chuyện và làm thế nào, tất cả thông qua một (gần như) mẫu cắt cookie nhất quán và giống hệt nhau.
Bạn có thể tạo các ổ cắm trong các "miền" khác nhau (chẳng hạn như "ổ cắm unix" hoặc "ổ cắm internet") và các loại giao tiếp khác nhau (ví dụ: ổ cắm "datagram" hoặc ổ cắm "luồng") và nói chuyện với những người nhận khác nhau và mọi thứ hoạt động giống hệt nhau (tốt, 99%, rõ ràng có những khác biệt nhỏ mà bạn sẽ phải tính đến).

Bạn không cần biết (và thậm chí bạn không muốn biết!) Cho dù bạn nói chuyện với một chương trình khác trên cùng một máy tính hoặc trên một máy tính khác, hoặc liệu có mạng IPv4 hoặc IPv6 ở giữa các máy tính đó, hoặc có thể một số khác giao thức mà bạn chưa bao giờ nghe nói đến.

socketcũng là tên của hàm thư viện (hay tòa nhà chọc trời) tạo ra "ổ cắm ", đây là một loại tệp đặc biệt (mọi thứ trong Unix là một tệp).

Làm thế nào để nó so sánh với ...

ổ cắm rơi vào cùng loại với ống và tên ống

Một đường ống là một phương tiện giao tiếp một chiều giữa người đọc và người viết (cả hai đều là chương trình) trên cùng một máy tính. Nó mô phỏng một luồng dữ liệu (giống như TCP).
Đó là, không có "thông điệp" hoặc "khối dữ liệu" riêng lẻ nào tồn tại theo quan điểm của đường ống. Bạn có thể sao chép bất kỳ lượng dữ liệu nào vào "một đầu" và người khác có thể đọc bất kỳ lượng dữ liệu nào (không nhất thiết phải giống nhau và không nhất thiết trong một lần) ở "đầu kia" theo cùng thứ tự byte như bạn đã đẩy nó vào

Một ống có tên là, đơn giản là một ống sở hữu một tên trong hệ thống tập tin . Đó là, nó trông giống và hoạt động giống như một tệp, nó xuất hiện trong danh sách thư mục và bạn có thể mở nó, ghi vào nó, v.v. Lưu ý rằng bạn cũng có thể tạo các tệp đặc biệt của socket (đó sẽ là một socket có tên) .

Mặt khác, ổ cắm là phương tiện giao tiếp hai chiều ("song công"), có nghĩa là bạn có thể ghi và đọc từ cùng một ổ cắm và bạn không cần hai ổ cắm riêng biệt để liên lạc hai chiều.
Ngoài ra, một ổ cắm có thể hoạt động như một luồng (giống hệt với đường ống) hoặc nó có thể gửi các tin nhắn rời rạc, không đáng tin cậy hoặc nó có thể gửi các tin nhắn rời rạc, có trật tự (hai đầu tiên hoạt động trên bất kỳ miền nào, chỉ cuối cùng trên "miền unix" ). Nó có thể gửi tin nhắn (hoặc mô phỏng một luồng) cho ai đó trên một máy tính hoàn toàn khác. Một ổ cắm thậm chí có thể thực hiện một hình thức giao tiếp một-nhiều (multicast) trong một số điều kiện.

Với ý nghĩ đó, rõ ràng là các socket làm một cái gì đó phức tạp hơn nhiều và thường có nhiều chi phí hơn so với đường ống (về cơ bản không quá đơn giản memcpyđến và từ một bộ đệm!), Nhưng nếu bạn tạo các socket cục bộ (tức là trên cùng một máy tính), hệ điều hành thường áp dụng một đường dẫn nhanh được tối ưu hóa mạnh mẽ, vì vậy thực sự không có nhiều sự khác biệt.

giao tiếp giữa các quá trình đôi khi được đề cập liên quan đến các mạng

Có, ổ cắm là một cách có thể của giao tiếp giữa các quá trình (bộ nhớ dùng chung và đường ống là ví dụ về các lựa chọn thay thế). Tất cả cùng một lúc, chúng đang được sử dụng để "kết nối", như đã giải thích ở trên.


1

Đối với udp hoặc tcp qua IP,

Địa chỉ ổ cắm là sự kết hợp của địa chỉ IP và số cổng.

Địa chỉ IP là địa chỉ của máy trên internet, vd unix.stackexchange.com has address 198.252.206.140

Tuy nhiên, mỗi máy phải có khả năng cung cấp nhiều hơn một dịch vụ, vì vậy hầu hết các máy sẽ cung cấp http (trang web) trên cổng 80 và ssh trên cổng 22, v.v.

Vì vậy, unix.stackexchange.com:80cổng 80của unix.stackexchange.com(một ổ cắm) là điểm truy cập của trang web này.

Tuy nhiên, có các loại ổ cắm khác, xem ý kiến ​​dưới đây.


5
tcp / ip chỉ là một loại ổ cắm. Có những cái khác không liên quan gì đến tcp / ip.
psusi

Có bao nhiêu loại ổ cắm khác nhau?
Abdul Al Hazred

1
@AbdulAlHazred, tôi biết bốn loại phổ biến được sử dụng với mạng ip, cùng loại với ip6, hai với unix và hai với IPX. Tôi đã không nhìn vào ax25, atm hoặc appletalk. Có các giao thức khác được hỗ trợ trên linux và có các giao thức linux không hỗ trợ. Trong hầu hết các trường hợp, mỗi giao thức có các ổ cắm luồng (tcp) và datagram (udp). Ổ cắm thô cũng phổ biến và imcp cũng có thể có giao diện ổ cắm.
hildred

Vấn đề là, câu trả lời này không đầy đủ ở chỗ nó chỉ bao gồm một loại ổ cắm và gây hiểu lầm ở chỗ nó đại diện cho các ổ cắm nói chung như thể chúng luôn là ổ cắm mạng và ổ cắm IP ( AF_INET) cụ thể .
tripleee

0

Tôi tin rằng bạn đã hỏi về mạng. Vì vậy, các dịch vụ TCP sử dụng các socket làm điểm để liên lạc và được tạo thành từ địa chỉ IP, giao thức và số cổng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.