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
端末に出力を書き込むことができるハンドルを含むシェルからファイル記述子を継承します。 Unixは多くをファイルとして扱います:)
ただし、同じポートをリッスンする2番目のソケットをバインドすることは不可能です(どのプロセスに関係なく)。 (現象:両方のプロセスを使用しない限りSO_REUSEPORT)。