服务器中的ss -lnp显示以下信息:
# ss -lnp
Recv-Q Send-Q Local Address:Port Peer Address:Port
0 128 :::22 :::* users:(("sshd",3847,4))
0 128 *:22 *:* users:(("sshd",3847,3))
0 10 127.0.0.1:25 *:* users:(("sendmail",1605,4))
0 128 127.0.0.1:199 *:* users:(("snmpd",22765,8))
0 128 :::80 :::* users:(("httpd2-prefork",15058,4),("httpd2-prefork",2235,4),("httpd2-prefork",1209,4))
# 根据ss的输出,人们可能认为Apache只监听所有IPv6地址上的TCP端口80。实际上,Apache还通过IPv4提供请求。为什么是这样?此外,如何使PID 15058、2235和1209都在同一个TCP端口上监听?
发布于 2015-10-22 10:05:36
1)如果您在ipv6端口上侦听连接,这就是Linux的工作方式(默认情况下)。
2)进程共享相同的“套接字”,该套接字被创建并“绑定”到端口80。
在这种情况下,它是共享的,因为进程在打开套接字后分叉(克隆)。这与继承打开的文件的分叉进程完全相同。与运行ls时一样,它从shell继承文件描述符,其中包括一个句柄,允许它将输出写入终端。Unix将许多事情作为文件对待:)。
但是,不可能绑定第二个套接字来侦听同一个端口(不管您是什么进程)。(迂腐:除非两个进程都使用所以_REUSEPORT)。
https://unix.stackexchange.com/questions/237858
复制相似问题