2010-02-25 25 views
185

Giả sử hiệu suất vô hạn từ phần cứng, có thể hỗ trợ hộp Linux> 65536 kết nối TCP mở không?Số lượng tối đa lý thuyết của các kết nối TCP mở là một hộp Linux hiện đại có thể có

Tôi hiểu rằng số lượng cổng tạm thời (< 65536) giới hạn số lượng kết nối từ một IP cục bộ đến một cổng trên một IP từ xa.

Bộ tuple (IP cục bộ, cổng cục bộ, ip từ xa, cổng từ xa) là định nghĩa duy nhất kết nối TCP; điều này có nghĩa là hơn 65K kết nối có thể được hỗ trợ nếu nhiều hơn một trong các tham số này là miễn phí. ví dụ. kết nối tới một số cổng trên nhiều máy chủ từ xa từ nhiều IP cục bộ.

Có giới hạn 16 bit khác trong hệ thống không? Số lượng mô tả tập tin có lẽ?

Trả lời

267

Một cổng nghe duy nhất có thể chấp nhận đồng thời nhiều kết nối.

Có giới hạn '64K' thường được trích dẫn, nhưng đó là trên mỗi máy khách cho mỗi cổng máy chủ và cần làm rõ.

Mỗi gói TCP/IP về cơ bản có bốn trường để xử lý; đây là:

source_ip source_port destination_ip destination_port 
< client   > < server      > 

Bên trong ngăn xếp TCP, bốn trường này được sử dụng làm khóa ghép để khớp gói với kết nối (ví dụ: bộ mô tả tệp).

Nếu khách hàng có nhiều kết nối đến cùng một cổng trên cùng một đích, thì ba trong số các trường đó sẽ giống nhau - chỉ source_port khác nhau để phân biệt các kết nối khác nhau. Các cổng là các số 16 bit, do đó số lượng kết nối tối đa mà bất kỳ máy khách nào đã cho có thể có với bất kỳ cổng máy chủ nào là 64K.

Tuy nhiên, nhiều khách hàng có thể có tối đa 64K kết nối với một số cổng của máy chủ và nếu máy chủ có nhiều cổng hoặc đa cổng thì bạn có thể nhân rộng thêm.

Vì vậy, giới hạn thực là các bộ mô tả tệp. Mỗi kết nối socket riêng lẻ được đưa ra một bộ mô tả tập tin, vì vậy giới hạn thực sự là số lượng các bộ mô tả tập tin mà hệ thống đã được cấu hình để cho phép và các tài nguyên để xử lý. Giới hạn tối đa thường lên trên 300K nhưng có thể định cấu hình, ví dụ: với sysctl.

Giới hạn thực tế được khoe khoang về các hộp thông thường là khoảng 80K ví dụ như máy chủ nhắn tin Jabber đơn luồng.

+1

Về mặt lý thuyết, bạn có thể có nhiều hơn 64K kết nối gửi đi nếu bạn (a) sử dụng SO_REUSEADDR và ​​(b) nhắm mục tiêu các địa chỉ IP đích khác nhau. Nhưng giới hạn bộ nhớ hạt nhân có thể sẽ dừng bạn trước. – Darron

+0

@Darron Tôi nghĩ SO_REUSEADDR là dành cho các máy chủ bị ràng buộc khi được khởi động lại? – Will

+0

Vâng, cũng vậy. Về cơ bản, nó giải quyết các kiểm tra ban đầu về xung đột địa chỉ cho các ổ cắm mới. – Darron

13

Nếu bạn đang nghĩ đến việc chạy một máy chủ và cố gắng quyết định số lượng kết nối có thể được phục vụ từ một máy, bạn có thể muốn đọc về the C10k problem và các vấn đề tiềm ẩn liên quan đến việc phục vụ nhiều khách hàng cùng một lúc.

+10

C10k 10 tuổi và không còn vui nữa. [Đọc này] để xem làm thế nào C1024K có thể được giải quyết. – Chandranshu

+5

@Chandranshu - đọc gì? Tôi giả sử bạn có nghĩa là để đặt một liên kết trong các ý kiến ​​... – Krease

+0

bump 11 nhiều hơn để đi ... –

7

Nếu bạn đã sử dụng ổ cắm thô (SOCK_RAW) và triển khai lại TCP trong vùng người dùng, tôi nghĩ câu trả lời bị giới hạn trong trường hợp này chỉ bằng số lượng (local address, source port, destination address, destination port) tuples (~ 2^64 cho mỗi địa chỉ cục bộ). Tất nhiên, nó sẽ mất rất nhiều bộ nhớ để giữ trạng thái của tất cả các kết nối đó, và tôi nghĩ bạn sẽ phải thiết lập một số quy tắc iptables để giữ cho ngăn xếp TCP hạt nhân không bị khó chịu &/hoặc trả lời thay cho bạn .

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