커널이 패킷을 잃는 이유는 무엇입니까?

커널이 패킷을 잃는 이유는 무엇입니까?

나는 +를 tcpdump사용 하지 않고 다음과 같은 전체 요약을 얻었습니다.CtrlC

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

"커널 삭제 패킷"이란 무엇입니까? 왜 이런 일이 발생합니까?

답변1

~에서tcpdump(1)(tcpdump 매뉴얼 페이지):

"커널에 의해 삭제된" 패킷( tcpdump운영 체제가 이 정보를 애플리케이션에 보고하는 경우 버퍼 공간 부족으로 인해 실행 중인 운영 체제에서 패킷 캡처 메커니즘에 의해 삭제된 패킷 수이고 그렇지 않은 경우 0으로 보고됩니다. ).

약간의 설명:

tcpdump 프로그램은 네트워크 인터페이스를 통과하는 원시 패킷을 캡처합니다. 명령줄에 지정한 규칙에 따라 패킷을 구문 분석하고 필터링해야 하며, 이 작업에는 시간이 걸리므로 수신 패킷을 처리하기 위해 버퍼링(대기열)해야 합니다. 때로는 패킷이 너무 많아 버퍼에 저장되는 경우도 있습니다. 그러나 처리할 수 있는 것보다 빠르게 저장되므로 결국 버퍼 공간이 부족해지며 커널은 버퍼에 여유 공간이 생길 때까지 다른 모든 패킷을 삭제합니다.

-B--buffer-size다음과 같이 ( ) 옵션을 사용하여 버퍼 크기를 늘릴 수 있습니다 .

tcpdump -B 4096 ....

또는

tcpdump --buffer-size=4096 ...

크기는 키비바이트 단위로 지정되므로 위 줄에서는 버퍼 크기를 4MiB로 설정합니다.

답변2

고려해야 할 또 다른 사항은 tcpdumpIP를 도메인 이름으로 확인하기 위해 DNS 쿼리를 수행하는 데 많은 시간이 걸릴 수 있다는 것입니다. 이것이 필요하지 않으면 -n(조회 없음) 플래그를 추가해 보십시오. 예를 들어:

tcpdump -n port 80

답변3

에 따르면 man tcpdump:

데이터 팩커널에 의해 삭제됨(운영 체제가 이 정보를 애플리케이션에 보고하는 경우 이는 버퍼 공간 부족으로 인해 tcpdump를 실행하는 운영 체제에서 패킷 캡처 메커니즘에 의해 삭제된 패킷 수입니다. 그렇지 않은 경우 0으로 보고됩니다.)

커널은 캡처된 패킷을 고정된 크기로 넣습니다.캡처 버퍼. 이 버퍼가 충분히 빨리 비워지지 않으면 tcpdump커널은 버퍼의 오래된 패킷을 덮어쓰기 시작하고떨어지다카운터. 이 카운터의 값은 "커널에 의해 제거됨"으로 표시되는 값입니다.

그건 그렇고, 당신은 할 수 있습니다캡처 버퍼의 크기 조정: KiB 크기의 옵션을 전달합니다 tcpdump.-B

답변4

이 옵션을 사용하는 것이 유용하다고 생각합니다 tcpdump -c. 이렇게 하면 패킷 수를 설정한 다음 중지하고 버퍼를 채우지 않을 수 있습니다.

예를 들어, 이것은 localhost에서 tcp 요청을 캡처합니다.

tcpdump -ni lo tcp -c 20

관련 정보