소켓 통계에 따르면 Apache는 IPv6만 수신하지만 실제로는 IPv4 서비스도 제공합니다.

소켓 통계에 따르면 Apache는 IPv6만 수신하지만 실제로는 IPv4 서비스도 제공합니다.

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))
# 

출력에 따르면 ssApache는 모든 IPv6 주소의 TCP 포트 80만 수신한다고 생각할 수 있습니다. Apache는 실제로 IPv4를 통한 요청도 처리합니다. 왜 이런 일이 발생합니까? 또한 PID 15058, 2235 및 1209가 모두 동일한 TCP 포트에서 수신 대기하는 것이 어떻게 가능합니까?

답변1

1) ipv6 포트에서 연결을 수신하면 Linux는 다음과 같이 작동합니다(기본값).

2) 프로세스는 생성되어 포트 80에 "바인딩"되는 동일한 "소켓"을 공유합니다.

이 경우에는 소켓을 연 후 프로세스가 분기(복제)되었기 때문에 공유됩니다. 이는 열린 파일을 상속하는 분기된 프로세스와 정확히 동일합니다. 실행할 때와 마찬가지로 ls터미널에 출력을 쓸 수 있는 핸들을 포함하는 셸에서 파일 설명자를 상속합니다. 유닉스는 많은 것을 파일로 취급합니다 :).

그러나 동일한 포트를 수신하는 두 번째 소켓을 바인딩하는 것은 불가능합니다(어떤 프로세스인지에 관계 없음). (현학적: 두 프로세스 모두를 사용하지 않는 한SO_REUSEPORT).

관련 정보