커널이 패킷을 삭제하는 이유는 무엇입니까?


49

나는 중단 tcpdumpCtrl+ C이 전체 요약을 가지고 :

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

"커널에 의해 삭제 된 패킷"은 무엇입니까? 왜 그런 일이 발생합니까?


내 경우에는 -s0 옵션을 사용하고 -s1600 (MTU 바로 위)으로 변경하면 해결되었습니다.
LatinSuD

답변:


48

tcpdump 매뉴얼에서 :

``커널에 의해 삭제 된 ''패킷 (OS에서 해당 정보를 응용 프로그램에보고하는 경우 tcpdump가 실행중인 OS의 패킷 캡처 메커니즘에 의해 버퍼 공간 부족으로 인해 삭제 된 패킷 수) 그렇지 않으면 0으로보고됩니다.

약간의 설명 :

tcpdump네트워크 인터페이스를 통과하는 원시 패킷을 캡처한다. 명령 줄에서 지정한 규칙에 따라 패킷을 구문 분석하고 필터링해야하며 시간이 걸리므로 수신 패킷은 처리를 위해 버퍼링 (큐)되어야합니다. 때때로 패킷이 너무 많으면 버퍼에 저장되지만 처리 된 것보다 빠르게 저장되므로 결국 버퍼 공간이 부족하므로 커널은 버퍼에 여유 공간이 생길 때까지 모든 추가 패킷을 삭제합니다.

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

tcpdump -B 4096 ....

크기는 킬로바이트로 지정되므로 위의 행은 버퍼 크기를 4MB로 설정합니다.


1
또한 사람들을 혼동하지 않기 위해 의도적으로 kibi // mebi-를 kilo // mega-로 바꾸고 libpcap에 대한 단어를 생략했습니다.
Dmitry Vasilyanov

4
tcpdump에서 "긴 옵션"에 대한 지원은 비교적 새로운 것입니다. 이전 버전 (버퍼 크기 설정을 지원하지 않는 훨씬 이전 버전 제외)에서 할 수 있습니다 tcpdump -B 4096.

또 다른 메모는 큰 버퍼를 설정하는 데 시간이 걸립니다. 버퍼를 미친 것으로 설정하면 해당 초기화 시간 동안 패킷이 누락 될 수 있습니다 (tcpdump가 "커널에 의해 삭제 된 패킷"으로보고 함).
dgreene

26

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

tcpdump -n port 80

1
이것은 구세주였습니다. tcpdump가 파일로 덤프 할 때 해상도가 역전한다는 것을 알지 못했습니다! 를 사용 -nn -B 4096하여 얻을 수 있음0 packets dropped by kernel
Blanka

11

에 따르면 man tcpdump:

커널에 의해 삭제 된 패킷 (버퍼 공간 부족으로 인해 tcpdump가 실행중인 OS의 패킷 캡처 메커니즘에 의해 삭제 된 패킷 수) 0으로보고됩니다.

커널은 캡처 된 패킷을 고정 크기 캡처 버퍼 에 넣습니다 . tcpdump해당 버퍼를 충분히 빨리 비우지 않으면 커널은 버퍼에서 오래된 패킷을 덮어 쓰기 시작하고 이에 따라 삭제 된 카운터가 증가합니다 . 해당 카운터의 값은 "커널에 의해 삭제됨"으로 표시됩니다.

그건 그렇고, 당신은 할 수 있습니다 캡처 버퍼 크기를 조정 : 패스 킬로바이트 크기 옵션을 선택합니다.tcpdump-B


2

매뉴얼 페이지에 언급 된 것 외에도 커널이 패킷을 삭제하는 몇 가지 이유가 있습니다. tcpdump네트워크의 유일한 트래픽이 초당 하나의 512B PRBS 패킷 인 경우 100 % 패킷이 손실되었습니다 . 분명히 버퍼 공간 설명은 이해가되지 않습니다-커널이 0.5kiB / s를 처리 할 수 ​​있다고 생각합니다.

내 배포판 (Ubuntu 14.04)과 함께 제공된 것이 테스트 패킷을 좋아하지 않는 링크 계층에서 일종의 스마트 필터링을 수행했을 수 있습니다. 해결 방법은 다음과 같이 새 네트워크 네임 스페이스를 만드는 것입니다.

sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up

내부 netns셸에서 이전에 문제를 일으킨 OS 프로세스는 그림에서 벗어 났으며 tcpdump볼 것으로 예상되는 모든 패킷을 보여줍니다.


1

tcpdump -c옵션을 사용하여 유용하다고 생각합니다 . 이렇게하면 패킷 수를 설정 한 다음 중지 할 수 있으며 버퍼를 채울 수 없습니다.

예를 들어 이것은 로컬 호스트에서 TCP 요청을 캡처합니다.

tcpdump -ni lo tcp -c 20
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.