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가 두 개의 소켓을 열었음을 알 수 있습니다. 파일 설명자 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 프로세스가 있습니다( 특권 포트이기 때문에 실행 중인 프로세스에 의해 열립니다 ). 이들은 아파치 작업자입니다.

포트와 프로세스 간의 링크를 확인하는 더 쉬운 방법은 다음 명령을 사용하는 것입니다 netstat.

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

관련 정보