Answers:
只是为了确保我们在同一页上(您的问题是这样的,所以模棱两可),要求在端口0上绑定TCP表示请求动态生成未使用的端口号。换句话说,在该请求之后您实际上正在监听的端口号不为零。有关于这个在评论[linux kernel source]/net/ipv4/inet_connection_sock.c
上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.
*/
这是标准的UNIX约定。可能有一些系统实际上允许使用端口0,但是这将被认为是不好的做法。但是,POSIX,IANA或TCP协议并未正式指定此行为。1 您可能会发现这很有趣。
这就是为什么您无法明智地建立与端口0的TCP连接。大概nc
知道了这一点,并通知您您提出了一个荒谬的请求。如果您在本机代码中尝试此操作:
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));
}
您将收到与尝试连接到任何其他不可用端口相同的错误:ECONNREFUSED
“连接被拒绝”。所以在回复:
这在系统中的何处处理?在OS内核的TCP堆栈中?
可能不是; 它不需要特殊处理。即,如果您找到一个允许在端口0上进行绑定和侦听的系统,则可以连接到该端口。
1.但IANA 确实将其称为“保留”(请参阅此处)。这意味着该端口不应在线使用。这样就可以实现动态分配约定(因为实际上不会使用它)。专门规定将其作为目标可能超出IANA的范围;从本质上讲,操作系统可以自由地做自己想要做的事情,什么都不做。
INADDR_ANY
,这是richard所指的(系统将用默认值替换它)。但实际上在网络上使用地址似乎会引起安德里亚(Andrea)提到的含义(除非不太清楚,它算作“广播”):en.wikipedia.org/wiki/0.0.0.0