是否可以连接到TCP端口0?


59

侦听TCP端口0将为我分配系统上的空闲端口号。

但是,当我尝试连接到TCP端口0 时会发生什么?显而易见的答案是:“它不起作用”:

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

这在系统中的何处处理?在OS内核的TCP堆栈中?是否有Unix在哪里可以连接到TCP端口0?


2
从理论上讲,你可以建立在监听或端口0作品连接一个自定义的TCP协议栈,这意味着两个这样的实现方式可以跟对方端口0
约书亚

Answers:


60

只是为了确保我们在同一页上(您的问题是这样的,所以模棱两可),要求在端口0上绑定TCP表示请求动态生成未使用的端口号。换句话说,在该请求之后您实际上正在监听的端口号不为零。有关于这个在评论[linux kernel source]/net/ipv4/inet_connection_sock.cinet_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的范围;从本质上讲,操作系统可以自由地做自己想要做的事情,什么都不做。


看起来与ipv4中的地址0.0.0.0相同。保留值,由OS和程序用于特殊目的。打个比方,在无线电中,有保留的频率没有人用于传输,而是在设备内部使用。
ctrl-alt-delor

1
@richard no,0.0.0.0的含义不同;)它用于指定无效,未知或不适用的目标或用作“广播”
AndreaCi 2015年

2
@AndreaCi没有广播255.255.255.255吗?
棘轮怪胎

4
@ratchetfreak 255.255.255.255被广播。根据上下文,0.0.0.0有两个含义。在编程中,它是w /的同义词INADDR_ANY,这是richard所指的(系统将用默认值替换它)。但实际上在网络上使用地址似乎会引起安德里亚(Andrea)提到的含义(除非不太清楚,它算作“广播”):en.wikipedia.org/wiki/0.0.0.0
goldilocks 2015年


5

使用端口0触发操作系统搜索并分配下一个可用端口。这样可以避免您必须对特定端口进行硬编码或搜索可用端口。我的Mint Linux系统返回

nc: port range not valid

nc localhost 0 

2

nc -l 0会要求操作系统侦听端口0。但是,如上所述,大多数操作系统都会看到0,并调用其特殊习惯为应用程序选择一个正数端口,因此nc结束侦听某个端口(如56514)。


大多数操作系统都可以,哪个不可以?
barlop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.