2013-09-03 62 views
5

Tôi đang bối rối về các ổ cắm. Theo như tôi biết socket là sự kết hợp của địa chỉ ip và số cổng. Chỉ trừu tượng lập trình của nó để cho phép ghi vào hoặc đọc từ một luồng (trong trường hợp TCP). Bây giờ những gì tôi không hoàn toàn chắc chắn, liệu máy chủ có MỘT hoặc nhiều ổ cắm khi phục vụ khách hàng? Cho phép nói http tại cổng 80.Máy chủ có mở ổ cắm cho mỗi quy trình khách hàng không?

Mọi dữ liệu từ các máy khách khác nhau được gửi đến một socket (máy chủ: 80) và một số quy trình máy chủ UBER phân biệt chúng dựa trên địa chỉ đến hoặc nhiều ổ cắm hơn dựa trên sự kết hợp của địa chỉ và cổng của khách hàng số được tạo bởi lớp TCP ?. Ai đó có thể mô tả kỹ thuật này bằng thuật toán từng bước (đối với nhiều khách hàng được phục vụ cùng một lúc) và không chỉ với Máy chủ gắn cổng vào cổng, Máy chủ lắng nghe ổ cắm, Máy chủ phục vụ dữ liệu.

+0

OS gì (es) khiến bạn quan tâm? – patrickvacek

+0

Ý tôi là nói chung. Tôi không biết điều này khác nhau dựa trên hệ thống. Nhưng nếu tôi phải chuyên hơn tôi muốn biết điều này liên quan đến Linux (Android) và Win. –

Trả lời

0

Thông thường, ở phía máy chủ, sau khi ổ cắm được tạo và được kết hợp với một kết hợp cổng/địa chỉ cụ thể, một hàm gọi là Listen (hoặc tương tự) sẽ được gọi. Điều này làm cho ổ cắm bị ràng buộc này là một ổ cắm nghe - nó chỉ đang chờ các kết nối cố gắng khởi động.

Sau này, sẽ có một cuộc gọi đến một chức năng được gọi là một cái gì đó như Accept trên ổ cắm nghe. Cuộc gọi này sẽ yêu cầu kết nối đang chờ xử lý từ ổ cắm nghe, tạo một ổ cắm mới mới và trả lại.

Mọi liên lạc khác giữa máy khách và máy chủ sẽ được thông qua ổ cắm mới này (ở cuối máy chủ), trong suốt thời gian kết nối.

Các kỹ thuật khác nhau có thể được sử dụng để đạt được khả năng mở rộng nếu máy chủ cần xử lý nhiều kết nối máy khách đồng thời. Một kỹ thuật đơn giản (trong đó không quy mô cho hàng nghìn khách hàng được kết nối) là tạo ra một luồng/quy trình mới (tùy thuộc vào giá trị trên O/S) của bạn để kết nối này và sau đó luồng/quy trình gốc trả về để gọi Accept.

Các kỹ thuật khác có thể liên quan đến việc đặt ổ cắm ở một số dạng bể bơi hoặc có thể tạo ổ cắm tạo sự kiện được xử lý bởi một số chuỗi cố định, và khi cần.

6

Bạn đang nhầm lẫn các kết nối TCP với ổ cắm. Ổ cắm không phải là khái niệm mức mạng. Là một khái niệm hệ điều hành. Kết nối TCP tồn tại trên mạng dưới dạng kết hợp duy nhất (nguồn-ip, cổng nguồn, dest-ip, dest-port). Ổ cắm là tay cầm cho cổng mở hoặc kết nối mở (tuyên bố này hơi đơn giản). Khi tôi bắt đầu, tôi cũng nghĩ rằng điều này là khó hiểu và một lỗi thiết kế hệ điều hành (nhưng nó là những gì nó được và chúng tôi đang mắc kẹt với nó). Lỗi thiết kế là hoạt động cho phép đối với mỗi ổ cắm khác nhau là rất khác nhau. Các trường hợp sử dụng này phải là hai khái niệm độc lập với các tên khác nhau và các API khác nhau.

Như bạn có thể thấy không có mối quan hệ 1: 1 giữa các ổ cắm và kết nối.

Ai đó có thể mô tả này triệt để với từng bước thuật toán

Một máy chủ sẽ mở ra một ổ cắm để cho hệ điều hành biết rằng nó muốn nghe hoặc kết nối. Sau đó, mọi kết nối được chấp nhận sẽ dẫn đến một ổ cắm mới độc lập, độc lập. Mỗi kết nối mới là trên cùng một máy chủ-ip và server-port mặc dù. Chỉ cần client-ip và/hoặc client-port là khác nhau. Máy chủ đọc và ghi trên các ổ cắm trên mỗi kết nối. Ổ cắm cổng mở chỉ để chấp nhận các kết nối mới.

Máy chủ khái niệm đi như thế này:

var openPortSocket = Open(80); //HTTP port 
while(true) { 
var connectionSocket = openPortSocket.Accept(); 
ServeConnectionOnNewThread(connectionSocket); 
} 

Đây là một mô hình hợp lý. Các cuộc gọi API thực tế khác nhau. Hầu hết các máy chủ đều sử dụng IO không đồng bộ. Điều đó không liên quan đến câu hỏi của bạn.

Khách hàng phải sử dụng một cổng ứng dụng khách khác cho mỗi kết nối. Đây chính xác là những gì trình duyệt của bạn làm.

+0

bạn có thể cung cấp một số tài nguyên bạn đã sử dụng khi bạn đã học về ổ cắm và tất cả những thứ này? – shotex

+0

@shotex thật không may, hầu như tất cả nội dung trên web đều bao gồm tài liệu chính thức dạy các mẫu khủng khiếp và lỗi hoàn toàn! Tôi không biết làm thế nào một người mới bắt đầu có thể tìm hiểu về ổ cắm mà không cần đọc rất nhiều và suy nghĩ cho chính mình. – usr

0

Tôi có thể nói chủ yếu với Linux, mặc dù tôi tin rằng hầu hết HĐH/nhân đều hoạt động tương tự. Câu trả lời ngắn gọn là hạt nhân thực hiện hầu hết công việc.

Nhân giao tiếp với một số loại giao diện mạng, về cơ bản là chỉ dịch các tín hiệu từ dây sang nhân và ngược lại. Ổ cắm và địa chỉ chỉ đơn thuần là mô tả của một kết nối nhất định. Các hạt nhân theo dõi những gì các quá trình nội bộ có liên quan đến cặp socket/địa chỉ và nó sẽ trực tiếp dữ liệu cho phù hợp. Nói chung, điều này được thực hiện như một FIFO - đầu tiên trong, đầu tiên ra ngoài. Điều này đúng với dữ liệu đến và đi.

Nếu máy chủ được kết nối với nhiều máy khách, thường là trách nhiệm của ứng dụng để gửi các gói riêng cho từng khách hàng được kết nối, có nghĩa là ứng dụng phải theo dõi số lượng khách hàng đang hoạt động. Một số hạt nhân và/hoặc NIC có thể thực hiện một số việc này cho bạn. Nếu đây là một mạng cục bộ và bạn muốn gửi các gói tin tới mọi máy khách kết nối với mạng, bạn có thể gửi các gói tin phát sóng, mà chỉ phải gửi một lần nhưng mọi kết nối sẽ nhận được.

Nếu bạn muốn có một thông tin nhiều hơn, liên kết này là rất kỹ lưỡng:

What is the difference between a port and a socket?

Các vấn đề liên quan