나는 (원시 소켓을 사용하여) 호스트에 TCP SYN 패킷 세트를 보내고 응답을 얻기 위해 libpcap
(필터 포함)을 사용하는 프로그램이있다. 이 비동기 I/O를 프레임 워크에서 구현하려면 노력하고있어하지만 그것은 libpcap
응답의 일부 (즉, TCP SYN 및 응답 사이에 미만 100 microseconds
소요될 때 일련의 첫 번째 패킷) 누락 된 것으로 보인다.비동기식 libpcap : 패킷 손실?
pcap_t* pcap = pcap_open_live(NULL, -1, false, -1, errorBuffer);
pcap_setnonblock(pcap, true, errorBuffer);
가 그럼 난합니다 (filterExpression 문자열에 포함) 필터를 추가 :
struct bpf_program filter;
pcap_compile(pcap, &filter, filterExpression.c_str(), false, 0);
pcap_setfilter(pcap, &filter);
pcap_freecode(&filter);
그리고 루프에
, 각각의 패킷을 전송 한 후, 내가 알고 사용을 선택 PCAP 핸들이 같은 설정이다 나는 libpcap의에서 읽을 수있는 경우 :int pcapFd = pcap_get_selectable_fd(pcap);
fd_set fdRead;
FD_ZERO(&fdRead);
FD_SET(pcapFd, &fdRead);
select(pcapFd + 1, &fdRead, NULL, NULL, &selectTimeout);
을 그리고 그것을 읽고 :
if (FD_ISSET(pcapFd, &fdRead)) {
struct pcap_pkthdr* pktHeader;
const u_char* pktData;
if (pcap_next_ex(pcap, &pktHeader, &pktData) > 0) {
// Process received response.
}
else {
// Nothing to receive (or error).
}
}
앞에서 말했듯이 일부 패킷은 누락되었습니다 ("수신 할 수 없음"). 동기식으로 (또는 pcap_loop
을 실행하는 스레드를 사용하여) 캡처 할 수 있기 때문에이 패킷이 있다는 것을 알고 있습니다. 여기에 세부 사항이 빠졌습니까? 아니면 libpcap
의 문제입니까?
너무 많은 요청을 너무 빨리 보내고 서버가 응답을 더 빨리 보내면 처리 할 수 있으므로 OS의 네트워크 버퍼 오버로드와 패킷 삭제가 발생할 수 있습니다. 또는 수신기 소켓이 초기 응답을 처리 할 시간 내에 설정되어 있지 않을 수도 있습니다. 귀하가받는 것으로 가정 한 모든 응답이 실제로 도착하고 있는지 확인할 수 있습니까? Todo는 애플리케이션과 동일한 인터페이스에서 동시에 tcpdump를 실행합니다.tcpdump에서 여러분이 기대하는 모든 패킷을 보았을 때, 여러분의 응용 프로그램에 없다면 위의 문제 중 하나가있을 수 있습니다. – ryanbwork
나는 이미 그것을 해왔다. (측면에는 tcpdump뿐 아니라 다른 스레드로도 pcap_loop한다.) 모든 패킷이 거기에 있었다. 따라서 나는 응답을 너무 빨리 보내고 있다고 생각하지 않는다. 수신기 소켓 (즉, libpcap)이 아직 설정되지 않았는지 어떻게 알 수 있습니까? 잃어버린 응답은 항상 첫 번째 또는 두 번째이므로 의미가 있습니다. –
tcpdump에서 패킷을 볼 수 있더라도 응용 프로그램이받은 속도를 처리 할 수없는 경우 OS에서 패킷을 삭제할 수 있습니다. 응답이 이미 전송 된 후에 응용 프로그램이 시작되는 경우 서버에서 초기 응답을 보내기 전에 상당한 지연을 추가하십시오. 모든 응답을 성공적으로 받으면 문제점을 발견했습니다. – ryanbwork