0

所以我正在研究我的计算机上使用的端口保管箱,并试图看看如果我在该端口上创建一个新的 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,但令我惊讶的是它起作用了。任何人的想法?

4

2 回答 2

4

TCP 套接字与 4 元组(源 IP、源端口、目标 IP、目标端口)匹配。只要它们四个不冲突,您就可以重用端口。

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

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

于 2013-07-22T22:21:51.393 回答
1

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

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

于 2013-07-22T22:09:37.890 回答