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

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

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

たとえば、tcpdumpを使用すると、多くのApacheリクエストをキャプチャできますが、これらのパケットを特定のプロセスIDに割り当てる方法がわかりません。

ベストアンサー1

サーバープロセスが開始されると、いくつかのシステムコール(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つのソケットを開いたことがわかります。ファイル記述子3と4は、Apacheプロセス内でネットワーク接続を介してデータを読み書きできます。

次のコマンドを使用して、ソケットと受信ポート間のマッピングを見つけることができます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)

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

ポートとプロセス間のリンクを確認するより簡単な方法は、次のコマンドを使用することですnetstat

mtak@frisbee:~$ sudo netstat -tulpn | grep apache
tcp6       0      0 :::80                   :::*                    LISTEN      4269/apache2   

おすすめ記事