Số lượng kết nối TCP mở tối đa theo lý thuyết mà một hộp Linux hiện đại có thể có là bao nhiêu


236

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

Tôi hiểu rằng số lượng cổng phù du (<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.

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

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

Câu trả lời:


349

Một cổng nghe có thể chấp nhận đồng thời nhiều hơn một 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 trên mỗi cổng máy chủ và cần được làm rõ.

Mỗi gói TCP / IP về cơ bản có bốn trường để đánh địa chỉ; đó 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 các gói với các kết nối (ví dụ: mô tả tệp).

Nếu một máy khách 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_portkhác nhau để phân biệt các kết nối khác nhau. Các cổng là số 16 bit, do đó số lượng kết nối tối đa mà bất kỳ máy khách cụ thể nào có thể có với bất kỳ cổng máy chủ cụ thể nào là 64K.

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

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

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


3
Về mặt lý thuyết, bạn có thể có hơn 64K kết nố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ớ kernel có thể sẽ dừng bạn trước.
Darron

4
Giới hạn sysctl là cho toàn bộ hệ thống, phải không? Ngoài ra còn có một giới hạn cấu hình với ulimit, giới hạn số lượng mô tả tệp tối đa cho một quy trình. Đó là mặc định ít hơn 300K, thường là 1024.
pacoverflow

1
Một kỹ thuật nhỏ: Một máy khách cũng có thể có nhiều địa chỉ IP được gán từ bộ định tuyến. Tất cả đều có thể được gán cho một MAC hoặc máy đó có thể có nhiều giao diện mạng vật lý cho các địa chỉ IP bổ sung. OP đã chỉ định 1 IP, nhưng điều quan trọng đối với những người khác là không loại trừ nhiều địa chỉ IP hơn.
Todd

2
@Will Giải thích rất hay !! Rất hữu ích ... Muốn cung cấp hơn 100 lượt ... cảm ơn bạn :-)
Tom Taylor

1
Xin lưu ý rằng tcp_fin_timeout chặn cùng một ổ cắm (nguồn, đích, kết hợp cổng) trong 60 giây theo mặc định, giúp giảm đáng kể số lượng kết nối tcp thực sự có sẵn giữa hai hệ thống, nếu các kết nối bị ngắt kết nối và kết nối lại thường xuyên. Vấn đề này có thể được giảm thiểu bằng cách cho phép sử dụng lại các ổ cắm (tcp_tw numuse = 1) ở trạng thái TIME_WAIT (không phải lúc nào cũng được hỗ trợ) hoặc bằng cách phá vỡ tiêu chuẩn TCP / IP trong việc giảm thời gian chờ này xuống giá trị thấp hơn (thường hoạt động tốt mọi cách).
fgwaller

17

Nếu bạn đang nghĩ đến việc chạy một máy chủ và cố gắng quyết định có bao nhiêu kết nối có thể được phục vụ từ một máy, bạn có thể muốn đọc về sự cố C10k 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.


14
C10k đã 10 tuổi và không còn vui nữa. [Đọc này] để xem cách C1024K có thể được xử lý.
Chandranshu

@Chandranshu - bạn đã có nghĩa metabrew.com/article/... ?
Mikko Rantalainen

1
@MikkoRantalainen - vâng. Tôi nghĩ rằng có những điểm chuẩn tốt hơn hiện có. Các chàng trai Phoenix đã đẩy nó lên 2 triệu kết nối đồng thời.
Chandranshu

3
@Chandranshu - có bản demo Dell với 12 triệu kết nối: mrotaru.wordpress.com/2013/06/20/ triệt
Mikko Rantalainen

1
Cách đây vài năm: Intel Atom D2700, RAM 2 GB, kết nối đồng thời 1,2M. Các vấn đề duy nhất tôi gặp phải là với các hộp Windows trong công việc kiểm tra; những thứ này thường xuyên bị đau bụng trong khi cố gắng làm DoS hộp Intel Atom ...
Klaws

12

Nếu bạn đã sử dụng một socket thô ( SOCK_RAW) và TCP được triển khai lại trong vùng người dùng, tôi nghĩ rằng câu trả lời bị giới hạn trong trường hợp này chỉ bằng số (local address, source port, destination address, destination port)bộ dữ liệu (~ 2 ^ 64 mỗi địa chỉ cục bộ).

Tất nhiê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ĩ rằng bạn sẽ phải thiết lập một số quy tắc iptables để giữ cho ngăn xếp TCP kernel không bị đảo lộn & / hoặc thay mặt bạn trả lời.

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.