所以我正在研究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,但令我惊讶的是它有效。有人想过吗?
答案 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线。