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 포트에서 수신 대기하는 것이 어떻게 가능합니까?
답변1
1) ipv6 포트에서 연결을 수신하면 Linux는 다음과 같이 작동합니다(기본값).
- https://utcc.utoronto.ca/~cks/space/blog/linux/Ipv6DualBinding
- https://utcc.utoronto.ca/~cks/space/blog/programming/ModernIPv6Handling
2) 프로세스는 생성되어 포트 80에 "바인딩"되는 동일한 "소켓"을 공유합니다.
이 경우에는 소켓을 연 후 프로세스가 분기(복제)되었기 때문에 공유됩니다. 이는 열린 파일을 상속하는 분기된 프로세스와 정확히 동일합니다. 실행할 때와 마찬가지로 ls
터미널에 출력을 쓸 수 있는 핸들을 포함하는 셸에서 파일 설명자를 상속합니다. 유닉스는 많은 것을 파일로 취급합니다 :).
그러나 동일한 포트를 수신하는 두 번째 소켓을 바인딩하는 것은 불가능합니다(어떤 프로세스인지에 관계 없음). (현학적: 두 프로세스 모두를 사용하지 않는 한SO_REUSEPORT).