2010-07-27 3 views
2

libpcap의 C API를 사용하여 패킷을 캡처한다고 가정합니다. 회선 속도 (예 : Mbps/Gbps)에서 문자열 검색 strstr()을 사용하여 일부 페이로드 문자열을 구문 분석하는 것이 효율적입니까? 예를 들어 strstr (payload, "User-Agent");패킷의 문자열 검색

정규식 패턴 일치 라이브러리 (예 : libpcre)를 사용하여보다 효율적으로 수행 할 수 있습니까?

HTTP 헤더 인수에만 사용하려면 C API가 있습니까? libcurl이 그렇게 할 수 있는지는 분명하지 않습니다. 미리 감사드립니다.

+0

페이로드 문자열이 NUL 종료되었는지 확인하십시오! – bstpierre

+0

여보세요, 고마워요! –

답변

1

짧은 문자열 하나만 검색하는 경우 strstr()에서 사용한 선형 비교보다 훨씬 빠른 것은 없습니다. 즉, strstr()의 특별한 처치 인 NUL 바이트는 네트워크 트래픽을 검사하기 위해 원하는 것이 아니며 모든 바이트를 동일하게 처리하고 길이 매개 변수를 받아 들인 자체 구현을 작성하는 것이 좋습니다.

여러 문자열을 검색하는 경우 Aho-Corasick과 같은 빠른 문자열 일치 알고리즘을 사용하거나 원하는 컨텍스트에서 원하는 문자열 (예 : 파서)과 일치하는 상태 시스템을 만드는 것이 좋습니다. . C에서 HTTP와 같이 대부분 규칙적인 문법을 파싱하려면 ragel state machine compiler이 최선의 선택 도구입니다.

+0

여러 문자열을 검색 중입니다 ... 1) 상태 머신이이 경우 더 나은 이유를 실제로 이해할 수 없습니다 (예 : strstr (페이로드, "GET")! = NULL은 GET을 정확히 가리키고 따라서 구문 분석 할 수 있음). 그 다음에 문자열) 그리고 2) strncmp를 사용하는 것보다 ragel 상태 머신이 더 좋은 이유는 무엇입니까? 고맙습니다! –

+0

n 바이트 패킷과 m 문자열을 찾고 싶다면 각 문자열에 대한 선형 검색은 적어도 O (m * n)입니다. 상태 머신 접근법 (Aho-Corasick 등 또는 파서)을 사용하면 데이터에 대해 단일 선형 패스 만 수행합니다. HTTP 동사 다음에 올바른 형식의 호스트 상대 URI가오고 그 다음에 "HTTP /"다음에 버전이있는 구조화 된 정보를 찾으려는 경우 파서 생성기를 사용하면 상당한 고통을 줄일 수 있습니다. 예상 입력 내용을 정확하게 설명합니다. – llasram

0

strstr이 일반 표현식보다 속도가 느릴 것이라고는 상상할 수 없습니다. 그러나 다양한 HTTP 헤더 값을 추출해야한다면 패킷을 구문 분석하여 더 좋은 옵션이 될 것입니다. libpcap에 내장 된 파서가 포함되어 있지 않습니까?

+0

libpcap C API는 페이로드가 아닌 TCP/IP 헤더에서 정보를 가져올 수 있습니다. HTTP 헤더는 페이로드의 일부이므로 다른 방식으로 구문 분석해야합니다. –

+0

libpcap에는 파서가있는 tcpdump, Wireshark, snort 등의 프로그램에서 사용하기위한 것이므로 내장 된 파서가 포함되어 있지 않습니다. 링크 계층, IP 또는 TCP 헤더를 구문 분석하지 않습니다. –

1

에는 strstr이 현저하게 실행되는 것을 보여주는 몇 가지 메트릭이 있습니다. 짧은 문자열 일치 들어, 정규식 라이브러리 좋은 최적화 된 어셈블리를 이길 수 있습니다.

+0

대답 해 주셔서 감사합니다. strstr이 가장 ​​빠른 선택 인 것처럼 보입니다. –