Ephemeral Port

Hỏi:
Giả sử bạn có một hệ thống đơn giản sau chạy trên cùng một hệ thống:
1 web process <> 1 HA proxy <> internet
Trong đó web process sẽ chạy trên cổng 8080 và HA proxy sẽ chạy trên cổng 80. Bỏ qua các yếu tố về tài nguyên, cấu hình tường lửa, DDOS, với một hệ thống đơn giản như vậy thì sẽ có tối đa bao nhiêu kết nối TCP/UDP có thể tạo đến cho server?

Trả lời:

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/

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s