Một kết nối TCP được tạo ra thường sẽ được định danh duy nhất bởi 4 thông số: (local ip, local port, peer ip, peer port). Nói cách khác, bỏ qua yếu tố tài nguyên, bộ nhớ, … thì số lượng tối đa kết nối được chấp nhận sẽ bằng với số lượng tối đa các bộ 4 thông số trên được tạo ra một cách không trùng lặp.
Vậy thì trong thực tế, con số này là bao nhiêu?
Thử xét ví dụ của chúng ta, một kết nối từ trình duyệt đến web process sẽ được chia thành 2 kết nối riêng:
- Kết nối 1: trình duyệt <> HA proxy
- Kết nối 2: HA proxy <> web process
Một kết nối từ HA proxy đến web process sẽ được biểu diễn như sau:
(127.0.0.1, local port, 127.0.0.1, 8080)
Trong khi đó, một kết nối từ trình duyệt đến HA proxy sẽ là:
(127.0.0.1, local port, peer ip, 80)
Nói cách khác, nếu gọi X và Y lần lượt là tập các mã định danh cho nhóm các kết nối #1 và nhóm các kết nối #2. Vậy thì kích thước của Y sẽ lớn hơn kích thước của X. Như vậy chỉ cần tìm ra kích thước của X thì sẽ trả lời được câu hỏi đầu bài.
Trên các hệ thống Linux thì khoảng local port thường được dùng là từ 32768 đến 61000. Thông số này sẽ được định nghĩa trong file /proc/sys/net/ipv4/ip_local_port_range.
Nói cách khác, trên Linux thì kích thước của tập X sẽ là 61000 – 32768 = 28232 kết nối. Và câu trả lời cho câu hỏi ở đầu bài sẽ là 28232. Đây là con số ước chừng, vì trong thực tế hệ thống của bạn sẽ có nhiều process khác cùng chạy song song với web process của bạn, nên con số thực tế sẽ nhỏ hơn.
Một bài viết mô tả một tình huống thực tế khi một hệ thống chạm tới ngưỡng kết nối này dành cho các bạn nào muốn tham khảo thêm: https://making.pusher.com/ephemeral-port-exhaustion-and-how-to-avoid-it/