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.
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
@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
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