저는 패킷 주입 기능과 모니터 모드를 갖춘 WiFi 카드에서 작동하는 맞춤형 무선 시스템/드라이버를 작성했습니다. 내 프로그램은 libpcap을 기반으로 하며 pcap_inject
무선 장치를 통해 패킷을 보내는 데 사용됩니다.
들어오는 트래픽 양에 상관없이 초당 1-2개의 패킷 나가는 패킷(ICMP 핑)과 함께 작동합니다. 그러나 문제는 더 빠르게 전송하려고 시도할 때(초당 25개 이상의 패킷을 처리하는 더 유용한 프로토콜인 TCP) 버퍼가 매우 빨리 부족해지는 것처럼 보이고 프로그램에 오류가 발생한다는 것입니다 Failed to inject packet: send: Resource temporarily unavailable
.
이것은 나에게 아무런 의미가 없습니다. 내 무선 카드가 500Mb/s 이상의 속도로 TCP를 처리할 수 있을 만큼 빠르게 전송된다는 것을 알고 있으므로(따라서 장치의 TX 링 버퍼가 포화되지 않음) 문제는 다른 곳에 있는 것 같습니다. 드라이버/펌웨어에서 패킷 주입이 덜 최적화되어 있습니까? libpcap이 일종의 중요한 버퍼를 회피하고 자기 자신만 전송하려고 합니까?
답변1
이것은 실제로 문제가 아니라 libpcap
무선 엔지니어링 문제입니다. 제가 작업 중인 채널은 이미 꽤 시끄러운데, 이는 감독되지 않는 메시이기 때문에(아무도 RTS/CTS와 조정하지 않음을 의미) 모니터 모드의 Wi-Fi 카드는 "듣고 조용해질 때까지 기다리기"로 돌아가기로 결정했습니다. 이 방법은 확실히 속도가 느리고 오류가 발생하기 쉽습니다. 즉, TX 버퍼가 빨리 채워져 오류가 발생합니다 Resource temporarily unavailable
. 결과적으로 지수 백오프가 발생합니다.
유휴 채널(2초에 1개의 패킷만)로 전환했더니 갑자기 초당 1,000개가 넘는 패킷의 속도로 데이터를 전송할 수 있게 되어 훨씬 좋아졌습니다. 내 전송 속도는 여전히 매우 좋지 않지만(최대 약 600KB/s), 적어도 나에게는 충분히 빠릅니다. 이 블로그 게시물은일부 카드는 그렇게 빨리 충전할 수 없습니다.
불행히도 내 무선 카드와 해당 드라이버로는 매우 소심한 전송 동작을 비활성화하는 쉬운 방법이 없습니다. 일부 드라이버에서는 백오프 매개변수를 조작할 수 있습니다.다른 사람들은 Atheros 카드가 있는 경우 CCA를 실제로 비활성화할 수 있습니다.
답변2
고속으로 TCP 패킷을 보내는 것은 pcap_inject
이길 가능성이 있는 성능 싸움처럼 들리지 않습니다. 고성능 TCP 메커니즘을 남용하여 필요에 맞게 페이로드를 조정하고 패킷을 네트워크 인터페이스 밖으로 전달하는 사용자 정의 커널 모듈에 이러한 패킷을 보내는 것을 고려하십시오.