Cổng nguồn TCP có phải là duy nhất cho mỗi máy chủ không?


10

Tôi đã học được rằng một kết nối TCP được xác định bởi bộ dữ liệu (IP nguồn, cổng nguồn, ip đích, cổng đích). Về mặt lý thuyết, do đó, có thể có một máy khách từ host1: port1 kết nối với server1: port1 và đồng thời một máy khách khác (chạy trên host1) từ host1: port1 đến server2: port1.

Tôi đã thử nghiệm một chút trong Java và cho đến nay dường như là có thể.

Tuy nhiên, tôi đã đọc nhiều lần rằng cổng nguồn phải là duy nhất cho địa chỉ máy chủ, điều đó về cơ bản có nghĩa là có giới hạn cứng của tối đa 65536 kết nối TCP gửi đi đồng thời. Điều đó có đúng không?

Cập nhật: Đây là mã Java của tôi. Điều này dường như hoạt động và netstat -t hiển thị rõ ràng hai kết nối đang hoạt động, đi từ cổng 9990 (một đến 9997, một đến 9998). Ít nhất là trên một Linux hiện đại, dường như là có thể?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

Và đầu ra netstat -t (cắt ngắn):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 

"Nếu bạn hỏi về giới hạn trên của các hệ thống được thiết kế tốt, bạn gần như chắc chắn làm điều đó sai "
Chris S

Câu trả lời:


16

Đây không phải là một yêu cầu TCP. Theo như TCP có liên quan, chỉ có sự kết hợp của IP nguồn, cổng nguồn, IP đích và cổng đích là duy nhất. Tuy nhiên, trong thực tế, hầu hết các API TCP không cung cấp bất kỳ cách nào để tạo nhiều hơn một kết nối với cùng một cổng nguồn, trừ khi chúng có các địa chỉ IP nguồn khác nhau.


2
Cảm ơn, đó là câu trả lời hoàn toàn phần lý thuyết của câu hỏi của tôi! Tôi sẽ chỉ phải cố gắng cho mỗi lần thực hiện TCP, tôi đoán vậy.
lxgr

5

Đó là mức tối đa trong thực tế, nó thường thấp hơn. Ví dụ: Linux sử dụng net.ipv4.ip_local_porttham số kernel để xác định các cổng được sử dụng cho các kết nối ngoài. Đây thường là một cái gì đó như

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Bạn có thể tăng số lượng có sẵn với sysctl, vd

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

hoặc bạn có thể chỉnh sửa /etc/sysctl.conf với cùng thông tin

net.ipv4.ip_local_port_range = 10000 65535

Tất cả các ví dụ tôi tìm thấy cũng cho thấy giá trị tối thiểu là 1024.


1

Ngoài câu trả lời của Iain (ở trên), có thể chỉ có 10.000 cổng được phép cho các kết nối đi bằng hạt nhân của bạn, theo lý thuyết, ít nhất bạn chỉ giới hạn ở một bộ cổng XX, XXX trên mỗi địa chỉ IP trên bộ điều hợp. Vì 127.1 không có sẵn cho thế giới bên ngoài, nằm trên mạng cục bộ, sau đó đối với mỗi địa chỉ IP khác ( bên ngoài ), bạn có một bộ cổng đi trong phạm vi cổng 65K của mình.

Vì vậy, giới hạn đi là thực sự:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Để làm cho công việc này, bạn sẽ cần phải đọc câu trả lời cho chủ đề này .


0

Đúng. Đây là sự thật.

Các cổng là để liên kết và các ứng dụng với mạng.

Bạn không thể có nhiều hơn 65553 ứng dụng được kết nối bởi TCP và 65535 kết nối bằng UDP trên cùng một máy chủ. Hệ điều hành thực sự quản lý các cổng một cách gán cho mỗi ứng dụng kết nối với mạng.

Nếu bạn có hai ứng dụng liệt kê trên cùng một cổng khi gói mạng đến thì máy tính không thể biết ứng dụng nào sẽ phân phối dữ liệu. Ví dụ: nếu bạn có Messenger và Skype trên cùng một liên kết với cùng một cổng thì tin nhắn nhắn tin của bạn sẽ xuất hiện trong skype và ngược lại :)


Tôi nghĩ rằng câu hỏi không phải là về giới hạn trên về số lượng ứng dụng nghe - mà như bạn chỉ ra, bị giới hạn bởi số lượng cổng duy nhất - mà là về số lượng ổ cắm hoạt động tại một thời điểm. Các máy chủ web thường có hàng tá ổ cắm được gửi đến cổng 80 hoặc 443 duy nhất của họ. Nếu nhiều máy chủ trên máy chủ đã làm điều đó, thì không có lý do gì mà số lượng ổ cắm mở không thể vượt quá 2 ^ 32.
Brandon Rhodes

0

Mặc dù một hệ thống có thể có giới hạn về số lượng kết nối TCP mở, nhưng thông thường nó không có giới hạn về số cổng được sử dụng. Tuy nhiên, việc triển khai TCP tốt phải ngăn không cho sử dụng cùng một cặp ổ cắm hai lần. (ổ cắm = địa chỉ IP + cổng). Tuy nhiên, một cổng được gán cho một quy trình để ngăn chặn việc đánh cắp các kết nối và phương pháp thông thường là yêu cầu một cổng miễn phí cho một cổng nghe hoặc cho một cổng đi. Điều này ngăn chặn các ổ cắm đi trùng lặp và do đó kết nối trùng lặp. Không sử dụng phương thức đó, bản thân ứng dụng phải ngăn tạo các kết nối trùng lặp.


3
Làm thế nào để thêm bất cứ điều gì mới vào các Câu trả lời đã được đăng trên Câu hỏi cũ này ??
Chris S
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.