2011-02-24 3 views
3

컴퓨터에서 실행되는 두 개의 프로그램 (단순화를 위해 리눅스에서 실행되는 유일한 사용자 프로그램) 중 하나는 recv()를 호출하고 그 중 하나는 들어오는 패킷을 탐지하기 위해 pcap을 사용한다고 가정 해보십시오. 패킷이 도착하면 pcap을 사용하는 프로그램과 recv를 사용하는 프로그램 모두에서 패킷이 감지됩니다. 하지만, 어떤 경우 (예를 들어 recv()가 pcap_next()에 대한 호출 사이에서 돌아 오는 경우)이 둘 중 하나가 패킷을 가져 오지 않을 수 있습니까?recv가 pcaps 버퍼에서 패킷을 제거합니까?

여기 버퍼링 시스템이 어떻게 작동하는지 이해할 수 없으므로 더 자세한 설명이 더 나을 것입니다.이 프로그램 중 하나가 다른 하나의 패킷을 볼 수있는 경우가 있습니까? 그렇다면 무엇이며 어떻게 예방할 수 있습니까?

답변

2

AFAIK, 하나는 데이터를 수신하고 다른 하나는 수신하지 않는 경우가 있습니다 (양방향). 세부 사항 중 일부가 잘못되었을 수도 있지만 누군가가 나를 고칠 것이라고 확신합니다.

PCAP는 인터페이스를 도청하기 위해 다른 메커니즘을 사용하지만, 여기에 일반적인 경우가 작동하는 방법은 다음과 같습니다

  • 네트워크 카드가 패킷을 (드라이버가 인터럽트를 통해 통지) 그 패킷
  • 커널 장소 수신 적절한 청취 대기열에 넣습니다. 예 :
    • TCP 스택.
    • 인터페이스가 브리징되는 경우 브리지 드라이버입니다.
    • PCAP에서 사용하는 인터페이스 (원시 소켓 연결).
  • 그 버퍼는 서로 독립적으로 플러시 : TCP 스트림 조립 데이터가 프로세스에 전달되는
    • 한다.
    • 브리지가 적절한 연결된 인터페이스로 패킷을 보냅니다.
    • PCAP는 수신 된 패킷을 읽습니다.

나는 두 프로그램 모두 패킷을 수신 보장 할 하드 방법이 없다고 생각합니다. 버퍼가 가득 찼을 때 차단해야합니다 (기아, 교착 상태, 모든 종류의 문제가 발생할 수 있음). 이더넷 이외의 인터커넥트를 사용하는 것이 가능할 수도 있지만 일반적인 철학은 최선의 노력입니다.

그러나 시스템에 과부하가 걸리지 않는 한, 손실률은 매우 낮을 것이고 대부분의 패킷은 모두 수신 될 것입니다. 버퍼 크기를 늘리면 손실 위험을 줄일 수 있습니다. 빠른 google 검색은 this을 조정했지만 100 만 가지 방법이 있습니다.

어려운 보증이 필요한 경우 더 강력한 네트워크 모델이 필요하다고 생각합니다. 이러한 종류의 작업에 대해 Netgraph에 대한 좋은 소식을 들었습니다. 패킷을 검사하는 물리적 상자를 설치할 수도 있습니다 (얻을 수있는 가장 확실한 보장).

관련 문제