sockets - 两个进程使用同一个端口?

标签 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)

我想知道这是如何工作的。我认为操作系统会拒绝绑定(bind)我的 http 服务器,因为端口已经分配给保管箱,但令我惊讶的是它起作用了。有人有想法吗?

最佳答案

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它。

关于sockets - 两个进程使用同一个端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797995/

相关文章:

c - Linux:是否有超时的套接字读取或接收?

.Net 服务器集群技术

c++ - DisableAddressSharing注册表不起作用

javascript - Angular:Http 与 fetch api

http - 获取 API : Can't add Authorization on Request Header with Chrome

c - 阻塞接受

performance - Perl方式快速创建套接字(1000+)

windows - 在多宿主 Windows PC 上接收多播消息

http - 使用 swift 获取 HTTP 状态

python - 是否有必要传达(或预期)Python Socket TCP Buff 大小