무선 장치의 전송 버퍼/패킷 주입 속도를 높이시겠습니까?

무선 장치의 전송 버퍼/패킷 주입 속도를 높이시겠습니까?

저는 패킷 주입 기능과 모니터 모드를 갖춘 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 메커니즘을 남용하여 필요에 맞게 페이로드를 조정하고 패킷을 네트워크 인터페이스 밖으로 전달하는 사용자 정의 커널 모듈에 이러한 패킷을 보내는 것을 고려하십시오.

관련 정보