2012-02-20 4 views
2

IP/ICMP/UDP/TCP 패킷과 같은 네트워크 수준의 패킷을 사용해야하는 프로젝트를 시작했습니다.winpcap/libpcap 대 원시 소켓

원시 소켓과 Winpcap/libpcap의 두 가지 주요 접근 방식이 있습니다.

나는 pcap이 OS에 드라이버를 설치하고 프로그래머가 패킷을 포착하여 보낼 수 있음을 알고있다. 반면에 Windows 7 이상의 제한 사항이있는 원시 소켓이 있습니다.

프로젝트는 라우터에 IP/ICMP/UDP/TCP 패킷을 보내고 응답을 분석해야합니다 (예 : IP-Identifier, TTL ...). 또한 나는 그것이 리눅스와 윈도우에서 작동하기를 원한다.

이 두 가지 방법에 대한 비교 목록을 나열 할 수 있습니까?

+0

응답이 충분하지 않지만 원시 소켓은 [XP SP2 이후의 서버가 아닌 서버 버전에서는 사용할 수 없습니다.] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548%28v) = vs.85 % 29.aspx # limitation_on_raw_sockets) (특정 조건 하에서) Windows 7만이 아닙니다. –

+0

실제로 pcap 드라이버가 데이터를 보낼 수 있는지 여부는 알 수 없지만 캡처 할 수 있다고 생각했습니다. Tx 패킷을 사용하려면 Windows 용 서버 OS를 사용해야합니다. 이것은 악성 코드가 오랫동안 남용하여 서버를 사용하지 못하게했기 때문입니다 (최종 사용자가 원시 패킷을 위조 할 필요가 없음). –

답변

1

코드를 이식 가능하게하려면 원시 소켓 API (Linux 및 Windows에서는 다소 다름)를 사용할 수 없습니다. Winpcap은 일반적으로 libpcap과 호환되며 pcap API는 일반적으로 무엇을하는지 고려하여 합리적입니다. 현재 상황에서

0

은 RAW 소켓은 작동하지만 당신은 sock_raw_tcp = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); sock_raw_udp = socket(AF_INET , SOCK_RAW , IPPROTO_UDP); sock_raw_icmp = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP);

당신은 IP_PROTO_IP 같은 옵션을 가지고 있겠지 같은 것을해야한다. 이제 RAW 소켓을 사용하면 IP 헤더와 전송 레벨 헤더 만 얻을 수 있지만 이더넷 헤더는 얻지 못합니다. 따라서 응용 프로그램 계층 데이터에만 관심이 있고 Ipaddress & TTL에 IP 헤더를 사용하고 포트 번호 등에 대한 헤더를 전송하려면 OK를 누릅니다. TCP의 경우 체크섬 및 리 어셈블리를 수행해야 할 수도 있습니다. 일부 체크섬은 UDP에도 필요합니다.

그러나 winpcap은 장치 드라이버를 사용하여 NIC의 데이터 링크 계층 인 OR 계층 2에 연결하기 때문에 많은 관리 문제를 해결합니다. 이더넷 프레임을 가져오고 다른 유형의 RAW 소켓을 열지 않아도됩니다. 네트워크 계층 (계층 3)에서와 같이 패킷을 다루는 응용 프로그램 관련 논리를 적용해야합니다.

+0

JAVA를 사용하는 경우 레이어 2에 대해 JPCAP를 사용하거나 원하는 경우 레이어 3을 사용하려면 savarese의 원시 소켓 라이브러리를 사용하여 데이터 조작을위한 savarese의 가상 서비스 TCP IP와 함께 원시 패킷을 캡처 할 수 있습니다. 그러나 JPCAP을 사용하는 또 다른 이점은 이더넷 헤더에서 소스 및 대상 MAC 주소를 가져올 수 있다는 것입니다. 다른 한편, savarese의 가상 서비스는 JPCAP에서 부족한 TCP 체크섬 계산과 관련하여보다 세련된 API의 장점을 가지고 있습니다. jpcap의 경우 Keita Fuji의 라이브러리를 사용하면 메모리 누수가 발생하지 않습니다. – Ashley

+0

실제로 둘 다 함께 사용할 수 있습니다. – Ashley