65536 +1 Kết nối trên hệ thống


35

65536 cổng cho mọi hệ thống trong mạng và mọi kết nối hoặc Gửi / Nhận sẽ sử dụng một trong các cổng đó.

Câu hỏi của tôi là: điều gì xảy ra nếu chúng ta có kết nối 65536 + 1 ?!

Tôi biết rằng điều đó không xảy ra theo cách thông thường, nhưng tôi tò mò muốn biết Hệ điều hành xử lý nó như thế nào.


12
Kết nối sẽ bị từ chối. Nhưng thực tế bạn sẽ gặp vấn đề rất lâu, rất lâu trước 65535 kết nối mở.
ChrisInEd hôm

1
@ChrisInEd hôm nay. Nếu là kết nối ngoài, nó sẽ gặp lỗi liên kết vì không thể phân bổ một cổng cục bộ. Nếu đó là kết nối gửi đến, giới hạn cổng không được áp dụng.
dùng207421

nếu kết nối bị ngắt, bạn sẽ nhận được kết nối bị từ chối, nếu kết nối ra, cuộc gọi ổ cắm của bạn sẽ bị lỗi. Tôi sẽ không đặt điều này như một câu trả lời vì tôi không chắc chắn.
Jorge Aldo

Câu trả lời:


61

Xin lưu ý rằng một hệ thống có thể xử lý hơn 65536 kết nối đồng thời, vì mỗi hệ thống không nhất thiết phải sử dụng một cổng riêng.

Kết nối TCP hoặc luồng UDP được xác định bởi 4-tuple:

(source IP address, source port, destination IP address, destination port)

Vì vậy, ngay cả khi bạn có một máy chủ web chỉ có một địa chỉ IP duy nhất và gói phần mềm máy chủ HTTP duy nhất chỉ nghe trên cổng 80, về mặt lý thuyết, nó có thể xử lý 65536 kết nối cho mỗi địa chỉ IP của máy khách kết nối với nó . Vì vậy, 64Ki kết nối từ địa chỉ IP của khách hàng 1, cộng với 64Ki kết nối từ địa chỉ IP của khách hàng 2, v.v.

Vì vậy, các giao thức hỗ trợ, với xấp xỉ đầu tiên, 2 48 kết nối / luồng đến một cổng TCP hoặc UDP duy nhất trên một địa chỉ IPv4 duy nhất. Hãy xem xét cả TCP và UDP cùng nhau, và cả không gian địa chỉ của IPv4 và không gian địa chỉ lớn về mặt vũ trụ / hài hước của IPv6 và bạn có thể thấy rằng các giao thức không có khả năng là nguồn giới hạn cho số lượng kết nối đồng thời mà máy chủ lưu trữ có thể xử lý.

Tương tự, không có gì trong các giao thức TCP hoặc UDP ngăn máy khách sử dụng một cổng nguồn duy nhất trên một địa chỉ IP duy nhất để thực hiện nhiều kết nối gửi đến các địa chỉ máy chủ và cổng khác nhau. Đôi khi, các API mạng của một hệ điều hành nhất định có thể không dễ dàng như vậy, nhưng điều quan trọng cần nhớ là, API "Ổ cắm [BSD]" cũ đáng kính chỉ là một API cho TCP và UDP. TCP và UDP có thể có các khả năng không được API Sockets truyền thống thể hiện.

Vì vậy, số lượng kết nối TCP hoặc luồng UDP đồng thời mà một máy chủ nhất định có thể xử lý không bị giới hạn bởi số lượng cổng, mà bởi các tài nguyên hệ thống như không gian RAM và thời gian CPU cần để theo dõi tất cả các kết nối đó và phục vụ tất cả các kết nối đó. Ngoài ra, các chi tiết cụ thể về triển khai của HĐH có thể áp đặt các giới hạn nhân tạo. Ví dụ, trong triết lý "mọi thứ là một tệp" của Unix, có thể có một bộ mô tả tệp cho mỗi kết nối TCP hoặc luồng UDP. Nếu hạt nhân Unix của bạn có giới hạn số lượng bộ mô tả tệp mà nó có thể theo dõi, thì giới hạn mô tả tệp đó là giới hạn nhân tạo đối với số lượng kết nối TCP đồng thời hoặc luồng UDP mà hạt nhân của bạn có thể xử lý.


2
Có thể có giá trị liên kết đến en.wikipedia.org/wiki/C10k_propet trong câu trả lời tuyệt vời này.
ChrisInEd hôm

1
Tôi đã triển khai một máy chủ TCP có thể chứa 65.534 kết nối từ mọi địa chỉ IP có thể cùng một lúc. Nó không làm được gì nhiều - nó chỉ đơn giản lặp lại văn bản đến với một vài ký tự thay thế - nhưng nó chạy trên một nền tảng phần cứng rất nhỏ. Tôi không nghĩ nó khá tuân thủ RFC, nhưng có vẻ như nó hoạt động khá tốt, mặc dù không biết và không quan tâm có bao nhiêu kết nối TCP được mở trên hầu hết các cổng của nó.
supercat

2
Nếu bạn thực sự cần kết nối hơn 65536 kết nối giữa hai máy, thì bạn có thể thiết lập các máy để sử dụng nhiều địa chỉ IP. Mỗi địa chỉ IP bạn thêm vào hai máy sẽ tăng số lượng kết nối tối đa theo phương trình bậc hai (ít nhất là về lý thuyết, nhiều khả năng bạn sẽ gặp các vấn đề khác trước).
Nói dối Ryan
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.