是否有一些命令或工具来监控网络数据包,以及这些数据包如何由内存处理,然后在 linux 平台上处理到 CPU?
例如,使用 tcpdump 我可以捕获许多 apache 请求,但我不知道这些包是如何分配给某个进程 ID 的。
当服务器进程启动时,它会发出一些系统调用(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
Run Code Online (Sandbox Code Playgroud)
转到/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]
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到 Apache 打开了两个套接字。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)
Run Code Online (Sandbox Code Playgroud)
有多个 Apache 进程使用相同的文件描述符(由作为 运行的进程打开root,因为它是一个特权端口)。这些是 Apache 工作人员。
查看端口和进程之间的链接的一种更简单的方法是使用以下netstat命令:
mtak@frisbee:~$ sudo netstat -tulpn | grep apache
tcp6 0 0 :::80 :::* LISTEN 4269/apache2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |