web-dev-qa-db-ja.com

Linuxのメモリにネットワークパケットはどのように転送されますか?

ネットワークパケットを監視し、それらのパケットがメモリによってどのように処理され、LinuxプラットフォームのCPUに送られるかを監視するためのコマンドまたはツールはありますか?

たとえば、tcpdumpを使用すると、多くのApacheリクエストをキャプチャできますが、それらのパッケージがどのようにプロセスIDに割り当てられているのかわかりません。

6
ibedelovski

サーバープロセスが起動すると、いくつかのシステムコール(socket()およびlisten())が発行されます。次に、システムはポートを開き、プロセスが対話するためのソケットファイル記述子を作成します。あなたはこれを見ることができます:

ApacheマスタープロセスIDを見つけます。

root@frisbee:~# ps -ef | grep Apache | grep root
root     27440     1  0 16:06 ?        00:00:00 /usr/sbin/Apache2 -k start

/proc/$pid/fdに移動し、ソケットを表示します。

root@frisbee:~# ls -l /proc/27440/fd | grep socket
lrwx------ 1 root root 64 apr 16 16:12 3 -> socket:[518486]
lrwx------ 1 root root 64 apr 16 16:12 4 -> socket:[518487]

ここでは、Apacheによって開かれた2つのソケットがあることがわかります。 Apacheプロセスは、内部的にファイル記述子3および4を使用して、ネットワーク接続を介してデータを読み取り/書き込みできます。

ソケットとリスニングポート間のマッピングは、lsofで見つけることができます。

root@frisbee:~# lsof | egrep 'IPv6.*(518486|518487)'
Apache2   27440                  root    4u     IPv6             518487       0t0        TCP *:http (LISTEN)
Apache2   27445              www-data    4u     IPv6             518487       0t0        TCP *:http (LISTEN)
Apache2   27446              www-data    4u     IPv6             518487       0t0        TCP *:http (LISTEN)
Apache2   27447              www-data    4u     IPv6             518487       0t0        TCP *:http (LISTEN)
Apache2   27448              www-data    4u     IPv6             518487       0t0        TCP *:http (LISTEN)
Apache2   27449              www-data    4u     IPv6             518487       0t0        TCP *:http (LISTEN)

同じファイル記述子を使用する複数のApacheプロセスがあります(特権ポートであるため、rootとして実行されているプロセスによって開かれます)。これらはApacheワーカーです。

ポートとプロセス間のリンクを表示する簡単な方法は、netstatコマンドを使用することです。

mtak@frisbee:~$ Sudo netstat -tulpn | grep Apache
tcp6       0      0 :::80                   :::*                    LISTEN      4269/Apache2   
5
mtak