2010-09-07 71 views
12

Ổ đĩa máy chủ hoạt động như thế nào? Khi tôi tạo một ổ cắm máy chủ java và chấp nhận kết nối tại cổng 1234. Máy chủ có thực sự sử dụng cổng 1234 cho tất cả các máy khách không? Tôi đã đọc rằng khi bạn viết một máy chủ mạng, ổ cắm thực sự mở một cổng khác khi kết nối được chấp nhận.Ổ đĩa máy chủ hoạt động như thế nào?

Điều này có đúng không? Nếu vậy, tại sao tôi không nhìn thấy nó trong netstat? Tôi thấy rất nhiều kết nối như thế này

tcp  0  0 ::ffff:MY_IP:1234 ::ffff:97.37.134.95:39236 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:89.204.153.101:26117 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:195.240.16.70:26193 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:80.187.98.116:15012 ESTABLISHED 
tcp  0  0 ::ffff:MY_IP:1234 ::ffff:218.78.248.190:30794 ESTABLISHED 

Vậy chúng có thực sự kết nối với máy chủ của tôi ở 1234 không? Nếu vậy, điều đó không có nghĩa là bạn máy chủ sẽ có thể chấp nhận vô số các kết nối?

Trả lời

1

có, máy chủ có thể chấp nhận bất kỳ số lượng kết nối nào trên một cổng. Đó là sự khác biệt giữa máy chủ và ổ cắm máy khách, ổ cắm máy khách chỉ có thể có một kết nối cho mỗi cổng.

+0

Vì vậy, theo logic, máy chủ sẽ không bao giờ cạn hết cổng phục vụ khách hàng? – erotsppa

+0

@erotsppa không có gì là vô hạn trong công việc của máy móc. tôi không chắc chắn tôi có thể nói chính xác số nhưng nó là rất lớn. (số nguyên (~ 2e9) có lẽ) – Andrey

+0

2e9 là khoảng 512, chúng ta hãy lên đến 2^16 (65536) ít hơn một số giá trị dành riêng, và bạn sẽ nhận được sự thật gần hơn. – kriss

3

Vì vậy, chúng có thực sự được kết nối với máy chủ của tôi ở 1234 không?

Nếu vậy, không có nghĩa là bạn server sẽ có thể chấp nhận vô hạn số lượng kết nối?

Bạn có thể có 2^32-2-1 (IP4) địa chỉ (để miễn phí một máy chủ khác trên cùng một mạng) và 2^16 cổng ổ cắm từ xa. Đó là rất nhiều, nhưng không vô hạn. Dù sao bạn sẽ hết bộ nhớ trước đây.

2

Có, bạn về cơ bản là đúng.

Máy chủ đang nghe trên một số cổng (cổng bạn đã đặt) nhưng khi bạn chấp nhận kết nối, máy chủ sẽ gán một số ổ cắm được kết nối mới.

Nếu bạn không thấy ổ cắm được kết nối bằng netstat, có thể là do bạn không gọi nó bằng đúng tùy chọn. Bạn nên có một kết nối LISTEN trên cổng máy chủ, và một kết nối được thiết lập với một cổng cục bộ được cấp phát cho từng kết nối từ xa đang hoạt động. Bạn cũng có thể có một số phần còn lại của kết nối chấm dứt (kết thúc kém) với trạng thái TIME WAIT.

Dưới đây là một số chiết xuất từ ​​tình trạng của tôi hệ thống hiện tại (có với netstat -anlp trên Linux)

tcp  0  0 0.0.0.0:3389   0.0.0.0:*    LISTEN  27002/rdpproxy 
tcp  0  0 10.10.4.185:3389  10.10.4.13:36725  ESTABLISHED 27233/rdpproxy 

Máy chủ là 10.10.4.185, và đang lắng nghe trên cổng 3389. Bất kỳ IP từ xa và cổng từ xa được phép kết nối.

Dòng thứ hai hiển thị phiên được kết nối. Địa chỉ từ xa là 10.10.4.13 và đặt cổng 36725 cho địa chỉ này. Do đó bạn có thể mở nhiều kết nối từ 10.10.4.185 (mười phần nghìn) và vẫn còn nhiều hơn từ các hệ thống khác. Và, không, điều đó không có nghĩa là máy chủ của bạn có thể chấp nhận số lượng kết nối vô hạn, hệ thống của bạn có thể hết nguồn và sẽ không mở được kết nối mới trước giới hạn đó.

+0

Vâng đó là những gì người khác ở đây đang nói, khi bạn chấp nhận một kết nối mới, bạn không tiêu thụ bất kỳ cổng địa phương bổ sung nào. – erotsppa

+0

@erotspaa: bạn * làm * tiêu thụ thêm cổng địa phương từ phạm vi cao. Cổng máy chủ thường từ tầm thấp (các cổng nổi tiếng) và được bảo lưu. – kriss

+0

@erotspaa: nhưng đó không phải là một giới hạn lớn, vì các cổng này có sẵn cho mỗi IP. Vấn đề với các cổng máy chủ là chúng bị ràng buộc với bất kỳ IP nào hoặc một số IP bị giới hạn. Do đó bạn sẽ chết đói nhanh hơn nhiều. – kriss

3

Ổ cắm TCP/IP được nhận dạng duy nhất bởi bộ tuple (địa chỉ cục bộ, cổng cục bộ, địa chỉ từ xa, cổng từ xa).

Điều này sẽ cung cấp cho một số lượng rất lớn các ổ cắm, nhưng không phải là vô hạn.

+0

Điều đó có nghĩa là máy chủ sẽ không phải lo lắng về việc hết cổng? Tôi luôn luôn ấn tượng rằng một máy chủ sẽ hết cổng nếu bạn có hơn 65535 kết nối. – erotsppa

+1

Điều này phức tạp. Về mặt kỹ thuật giới hạn chỉ là 65535 kết nối với cùng địa chỉ ngang hàng, nhưng nhiều ngăn xếp TCP/IP bi quan ngăn chặn xung đột bằng cách giữ các cổng cục bộ duy nhất tại thời điểm ràng buộc socket. Bạn có thể tắt tùy chọn này bằng tùy chọn ổ cắm REUSEADDR, với một lượng nhỏ rủi ro. – Darron

0

Nó không phải là vô hạn. Có giới hạn. Trên các hệ điều hành dựa trên Unix, lệnh ulimit sẽ cho bạn biết số lượng "tệp mở" tối đa mà quy trình có thể có và cũng sẽ cho phép bạn thay đổi nó. Nếu bạn vượt quá giới hạn này, bạn sẽ bắt đầu thấy IOExceptions liên quan đến "Quá nhiều tệp đang mở".

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