태그 보관물: kernel

kernel

커널이 패킷을 삭제하는 이유는 무엇입니까? 중단 tcpdump과 Ctrl+ C이 전체

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

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

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



답변

tcpdump 매뉴얼에서 :

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

약간의 설명 :

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

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

tcpdump -B 4096 ....

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


답변

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

tcpdump -n port 80

답변

에 따르면 man tcpdump:

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

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

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


답변

매뉴얼 페이지에 언급 된 것 외에도 커널이 패킷을 삭제하는 몇 가지 이유가 있습니다. 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볼 것으로 예상되는 모든 패킷을 보여줍니다.


답변

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

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

tcpdump -ni lo tcp -c 20

답변