Linux

網路數據包如何傳輸到linux上的記憶體?

  • April 16, 2014

是否有一些命令或工具用於監視網路數據包以及這些數據包如何由記憶體處理,然後在 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

轉到/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,因為它是一個特權埠)。這些是 Apache 工人。

查看埠和程序之間連結的更簡單方法是使用以下netstat命令:

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

引用自:https://unix.stackexchange.com/questions/125082