tcpdump는 패킷을 표시하기 전에 1초를 기다립니다.

tcpdump는 패킷을 표시하기 전에 1초를 기다립니다.

Linux Mint(17 또는 17.1)에서는 tcpdump를 사용하여 다음 명령으로 일부 패킷을 캡처했습니다.

tcpdump -UnvXSs 4096 -B 1024 -i eth0

-U 옵션에도 불구하고 실제로 패킷을 즉시 출력하지는 않습니다. 대신, 네트워크 활동이 많이 발생할 경우 더 자주 출력된다는 점을 제외하면 거의 매초마다 저장되고 출력됩니다. -l 옵션도 시도했지만 아무런 차이가 없었습니다. 더 작은 버퍼(-B 매개변수)를 사용하면 더 적은 트래픽으로 인해 더 빈번한 출력이 가능하지만 가능한 가장 작은 값은 128로 여전히 트래픽이 초당 한 번만 출력되는 것을 보고 싶을 만큼 큽니다.

tcpdump에서 strace를 실행 중입니다. 다음 줄에서 반복적으로 일시 중지됩니다.

poll([{fd=3, events=POLLIN}], 1, 1000)  = 1 ([{fd=3, revents=POLLIN}])

1초 동안 머물렀다가 재개되어 더 많은 패킷을 출력한 다음 poll() 호출로 돌아갑니다.

이러한 poll() 호출이 발생하기 전에 3을 반환한 마지막 시스템 호출은 다음과 같습니다.

socket(PF_PACKET, SOCK_RAW, 768)        = 3

이러한 poll() 호출 사이에는 write() 호출 외에는 아무것도 없으므로 DNS 조회나 다른 것으로 인한 지연이 없습니다.

그래서 tcpdump가 초당 한 번만 패킷을 표시하는 이유는 커널이 동일한 빈도로 패킷을 전달하기 때문이라고 결론지었습니다.

커널이 패킷을 수신하자마자 패킷을 출력하도록 하려면 어떻게 해야 합니까?

Linux version 3.13.0-24-generic (buildd@batsu) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014

답변1

그래서 tcpdump가 초당 한 번만 패킷을 표시하는 이유는 커널이 동일한 빈도로 패킷을 전달하기 때문이라고 결론지었습니다.

pcap_open_live()예 - tcpdump를 사용하거나 를 사용하여 pcap_create()캡처 장치를 열 때 pcap_activate()1초의 시간 초과를 지정합니다 . 이는 많은 운영 체제(최신 버전의 커널 및 libpcap이 포함된 Linux 배포판은 물론 *BSD, OS . 효율성을 높이기 위해 전체 패킷 버퍼를 전달했으며 앞으로 전달될 예정입니다.

최신 버전의 tcpdump는 패킷을 바이너리 형식으로 파일에 저장하는 대신 패킷을 인쇄할 때 이 버퍼링을 비활성화합니다.

커널이 패킷을 수신하자마자 패킷을 출력하도록 하려면 어떻게 해야 합니까?

최신 버전의 tcpdump를 실행하거나 tcpdump를 수정하여 더 짧은 시간 초과를 지정하거나 시간 초과를 완전히 비활성화하세요.

관련 정보