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 打开了两个套接字。 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,因为它是特权端口)。这些是阿帕奇工人。

查看端口和进程之间的链接的更简单方法是使用以下命令netstat

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

相关内容