이것이 첫 번째 질문입니다. @stackoverflow.libpcap setfilter() 함수와 패킷 손실
일부 VoIP 프로덕션 서버, 특히 Perl에서 pcap 라이브러리를 사용하여 주어진 패턴과 일치하는 모든 트래픽 (VoIP 호출)을 캡처 할 수있는 스 니프 도구에 대한 모니터링 도구를 작성하고 있습니다.
나는 예를 들어 다음과 같은 열악한 선택 필터를 사용할 수 없습니다. "udp"를 실행 한 다음 내 앱 코드에서 모든 필터링을 수행합니다. 트래픽이 너무 많아서 커널이 패킷 손실을보고하지 않기 때문입니다.
내가 수행하는 작업은 캡처하는 동안 가능한 한 더 선택적 필터를 반복적으로 작성하는 것입니다. 처음에는 (모든) SIP 시그널링 트래픽과 IP 조각 (패턴 일치는 어떤 경우에도 애플리케이션 레벨에서 수행되어야 함)을 캡처 한 다음 SIP 패킷으로 RTP에 대한 정보를 찾으면 '또는'절을 특정 IP 및 PORT가있는 실제 필터 문자열을 찾아서 setfilter()를 사용하여 필터를 다시 설정하십시오.
이 같은그래서 기본적으로 뭔가 :
가초기 필터 : "(UDP 포트 5060) 또는 (UDP 및 IP [6 : 2]! & 0x1fff = 0)"-> 모든 SIP 트래픽을 캡처 및 IP는
업데이트 필터 프래그먼트 ->가 또한 RTP 캡처 "(UDP 포트 5060) 또는 OR (호스트 IP 및 포트 PORT) (UDP 및 IP [6 2 & 0x1fff를 = 0!)" 특정 IP, 포트
업데이트 된 필터 : "(udp (호스트 IP 및 포트 PORT) 또는 (호스트 IP2 및 포트 PORT2) "-> 두 번째 RTP 스트림도 캡처합니다.
등등.
내 도구의 선택 필터 버전이 좋지 않은데 비해 RTP 패킷 손실 백분율이 신뢰할 수없는 반면 모니터링 목적으로 RTP 스트림의 '실제'패킷 손실을 얻을 수 있기 때문에 상당히 효과적입니다. 커널에 의한 패킷 드롭으로 인해 패킷이 누락되었습니다.
하지만이 방법의 단점을 보도록하겠습니다.
캡쳐 중에 setfilter()를 호출하면 setpkap() 함수의 코드 주석에서 pcap-linux.c (check libpcap version 0.9 및 1.1)로 설명한 것처럼 libpcap이 "필터를 변경하는 중"수신 된 패킷을 삭제합니다.
그래서 setfilter()를 호출하고 IP 조각화 된 일부 패킷이 도착하면 일부 조각이 풀리고 결국 libpcap 통계에 의해보고되지 않습니다. 추적으로 파고 들었습니다.
이 작업이 libpcap에 의해 수행되는 이유를 알았지 만, 제 경우에는 패킷 손실이 전혀 필요하지 않습니다. (관련없는 트래픽이 생기는 것은 신경 쓰지 않습니다.)
libpcap의 코드를 수정하지 않는이 문제를 해결하는 방법을 알고 싶습니까?
안녕하세요, 답변 해 주셔서 감사합니다. 나는 "새로운 필터"가 필요할 때마다 프로세스를 생성하는 것에 대해 생각했지만, 결국 프로세스의 상당 부분이 끝나고 결국 캡처를 병합하는 작업도 끝날 것입니다. 솔직히 말해서 내가 피해야 할 것이 었습니다. : P – Guido