Có thể kết nối với cổng TCP 0 không?


59

Nghe cổng TCP 0 cấp cho tôi số cổng miễn phí trên hệ thống.

Nhưng điều gì xảy ra khi tôi cố gắng kết nối với cổng TCP 0? Câu trả lời rõ ràng là: "Nó không hoạt động":

$ nc localhost 0                 
nc: port number too small: 0

Trường hợp này được xử lý ở đâu trong hệ thống? Trong ngăn xếp TCP của nhân hệ điều hành? Có Unix nào mà kết nối với cổng TCP 0 sẽ hoạt động không?


2
Về lý thuyết, bạn có thể xây dựng một ngăn xếp TCP tùy chỉnh trong đó lắng nghe hoặc kết nối từ cổng 0 hoạt động, điều đó có nghĩa là hai triển khai như vậy có thể nói chuyện với nhau trên cổng 0.
Joshua

Câu trả lời:


60

Chỉ để đảm bảo rằng chúng tôi ở trên cùng một trang (câu hỏi của bạn không rõ ràng theo cách này), yêu cầu liên kết TCP trên cổng 0 cho biết yêu cầu tự động tạo số cổng không sử dụng. Nói cách khác, số cổng bạn thực sự nghe sau yêu cầu đó không phải là số không. Có một nhận xét về trong này [linux kernel source]/net/ipv4/inet_connection_sock.ctrên inet_csk_get_port():

/* Obtain a reference to a local port for the given sock,
 * if snum is zero it means select any available local port.
 */

Đó là một quy ước unix tiêu chuẩn. Có thể có các hệ thống thực sự sẽ cho phép sử dụng cổng 0, nhưng đó sẽ được coi là một thực tiễn tồi. Tuy nhiên, hành vi này không được chỉ định chính thức bởi POSIX, IANA hoặc giao thức TCP. 1 Bạn có thể thấy điều này thú vị .

Đó là lý do tại sao bạn không thể thực hiện kết nối TCP đến cổng số 0. Có lẽ ncnhận thức được điều này và thông báo cho bạn rằng bạn đang thực hiện một yêu cầu không nhạy cảm. Nếu bạn thử điều này trong mã gốc:

int fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
inet_aton("127.0.0.1", &addr.sin_addr);
if (connect(fd, (const struct sockaddr*)&addr, sizeof(addr)) == -1) {
    fprintf(stderr,"%s", strerror(errno));
}    

Bạn nhận được cùng một lỗi mà bạn sẽ cố gắng kết nối với bất kỳ cổng không khả dụng nào khác : ECONNREFUSED, "Kết nối bị từ chối". Vì vậy, trong trả lời:

Trường hợp này được xử lý ở đâu trong hệ thống? Trong ngăn xếp TCP của nhân hệ điều hành?

Chắc là không; nó không yêu cầu xử lý đặc biệt. Tức là, nếu bạn có thể tìm thấy một hệ thống cho phép liên kết và nghe trên cổng 0, có lẽ bạn có thể kết nối với nó.


1. Nhưng IANA không đề cập đến nó như là "thuộc về" ( xem tại đây ). Có nghĩa, cổng này không nên được sử dụng trực tuyến. Điều đó làm cho nó ổn đối với quy ước chuyển nhượng động (vì nó thực sự sẽ không được sử dụng). Việc quy định cụ thể như một mục đích có lẽ sẽ vượt ra ngoài phạm vi của IANA; về bản chất, các hệ điều hành có thể tự do làm những gì họ muốn với nó, kể cả không có gì.


Có vẻ như ý tưởng tương tự như địa chỉ 0.0.0.0 trong ipv4. Một giá trị dành riêng, và được sử dụng bởi HĐH và các chương trình cho một mục đích đặc biệt. Tương tự như vậy, trong radio có các tần số dành riêng mà không ai sử dụng để truyền, nhưng được sử dụng nội bộ trong thiết bị.
ctrl-alt-delor

1
@richard no, 0.0.0.0 có nghĩa khác;) nó được sử dụng để chỉ định mục tiêu không hợp lệ, không xác định hoặc không áp dụng hoặc là "phát sóng"
AndreaCi

2
@AndreaCi không được phát 255.255.255.255?
ratchet freak

4
@ratchetfreak 255.255.255.255 được phát sóng. 0.0.0.0 có hai ý nghĩa tùy thuộc vào ngữ cảnh. Trong lập trình, nó đồng nghĩa với w / INADDR_ANY, đó là những gì người giàu đang đề cập đến (hệ thống sẽ thay thế nó bằng một mặc định). Nhưng thực tế việc sử dụng địa chỉ trên mạng dường như có ý nghĩa Andrea đề cập (ngoại trừ không rõ ràng đến mức nó được tính là "phát sóng"): en.wikipedia.org/wiki/0.0.0.0
goldilocks


5

Sử dụng Cổng 0 kích hoạt hệ điều hành để tìm kiếm và phân bổ cổng có sẵn tiếp theo. Điều này tránh cho bạn phải mã cứng một cổng cụ thể hoặc phải tìm kiếm một cổng có sẵn. Hệ thống Mint Linux của tôi trở lại

nc: port range not valid

đến

nc localhost 0 

2

nc -l 0sẽ yêu cầu HĐH lắng nghe trên cổng 0. Nhưng như đã được nhận xét ở trên, hầu hết các hệ điều hành sẽ nhìn thấy 0 và gọi hải quan cụ thể của họ để chọn một cổng có số dương cho ứng dụng của bạn, vì vậy hãy nclắng nghe một số cổng như 56514.


Hầu hết các hệ điều hành sẽ, ok, cái nào không?
barlop
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.