两个进程使用相同的端口?

时间:2013-07-22 21:44:42

标签: sockets http tcp

所以我正在研究Dropbox在我的计算机上使用的端口,并试图看看如果我在该端口上创建了一个新的http服务器会发生什么。令人惊讶的是它有效。所以dropbox和我的http服务器都运行在同一个端口上,但是传入的请求被路由到不同的应用程序,具体取决于源地址。

lsof -i tcp:51311

COMMAND  PID           USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME

Dropbox 3811 user   18u  IPv4 0xdedc291239eb197f      0t0  TCP 172.20.10.2:51311->108.160.163.34:http (ESTABLISHED)

node    3984 user   11u  IPv4 0xdedc29123b1494cf      0t0  TCP *:51311 (LISTEN)

我想知道这是如何运作的。我认为操作系统会拒绝绑定我的http服务器,因为端口已经分配给了dropbox,但令我惊讶的是它有效。有人想过吗?

2 个答案:

答案 0 :(得分:4)

TCP套接字与4元组匹配(source-ip,source-port,destination-ip,destination-port)。只要它们中的所有四个都没有冲突,就可以重新使用端口。

只要您的守护程序没有从108.160.163.34:80收到连接,您的堆栈就可以处理它。如果服务器108.160.163.34表现良好,它将不允许应用程序使用80作为源端口启动与套接字(172.20.10.2:51311)的连接。 (bind()} Address already in use会失败。

如果表现不佳,现有的保管箱连接将收到意外的数据包(错误的序列号空间),您的堆栈将RST

答案 1 :(得分:1)

Dropbox使用的HTTP端口是108.160.263.34,而不是本地主机。

端口51311用作一个出站端口和一个侦听端口。不是'两个服务在同一个端口上运行'。否则会有两条LISTENING线。