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.c
trê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ẽ nc
nhậ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ì.