2013-06-03 1 views
0

주어진 도메인 이름에 대한 패킷을 캡처하는 테스트 프로그램을 작성했습니다. gethostbyname()을 사용하여 IP 주소를 검색하고 pcap을 사용하여 해당 IP 주소로 향하는 패킷을 캡처했습니다. pcap_loop() 수는 -1로 설정되어 캡처를 유지해야합니다.gethostbyname()에 의해 검색된 IP 주소는 연결된 브라우저와 다릅니다

이론적으로, 내 PC에서 해당 IP 주소로 보내는 모든 패킷은 해당 도메인 이름이 웹 브라우저에서 방문했는지 또는 ping을 수행했는지에 관계없이 캡처됩니다.

많은 웹 사이트에서 테스트되었지만 google이나 ebay와 같은 트래픽이 많은 사이트에는 적용 할 수 없습니다. 의미는 내가 gethostbyname()에서 검색된 IP 주소를 Ping 패킷이 프로그램에 의해 캡처되지만, 내가 파이어 폭스에서 google.com을 방문하면 패킷이 캡처되지 않는다는 의미입니다. 이는 google.com과 같은 도메인 이름에 대해 다른 IP 주소가 있음을 보여줍니다.

그렇다면 DNS 서버가 google.com에 다른 ips를 반환하는 이유는 무엇입니까? 그리고 gethostbyname()과 웹 브라우저의 요청 사이에는 어떤 차이가 있습니까?

미리 감사드립니다.

+0

'gethostbyname()'에 의해 반환 된 IP 주소 중 ** 모든 ** 주소에 대한 트래픽을 캡처합니까, 아니면 첫 번째 주소로만 트래픽을 캡처합니까? – Celada

+0

gethostbyname()은 struct hostent에서 하나의 IP 주소 만 반환합니까? – AuA

+0

아니요, 배열을 반환합니다. 그런데'gethosybyname()'대신'getaddrinfo()'를 사용하는 것을 고려해야한다. 'gethostbyname()'은 더 이상 사용되지 않으며 더 이상 사용되지 않습니다. – Celada

답변

1

주어진 도메인 이름이 둘 이상의 IP 주소로 확인되는 경우 웹 브라우저에서 어느 것을 선택할지 모르기 때문에 캡처 필터가 모든 필터를 캡처하도록 설정해야합니다. 반환 된 첫 번째 필터 만 필터링하면 (예를 들어) 웹 브라우저와 동일한 필터를 선택할 확률이 1입니다 (n은 주소 수).

그런데 gethosybyname() 대신 getaddrinfo()을 사용해야합니다. gethostbyname()은 더 이상 사용되지 않으며 더 이상 사용되지 않습니다. 가장 중요한 점은 IPv6 주소를 반환 할 수 없다는 것입니다.

gethostbyname()은 해결 된 IP 주소 목록을 배열로 반환하지만 IPv4는 하나만 반환합니다.

getddrinfo()은 연결된 IP 주소 목록을 연결 목록으로 반환합니다.

+0

고마워, 잘 설명해. – AuA

+0

gethostbyname은 IPv4와 IPv6 모두를 반환한다고 생각합니다. showip.c는 http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html#getaddrinfo 저에게 맞습니다. – JohnMudd

+1

@ JohnMudd : 아니요, 인용 한 예제는 실제로'getaddrinfo()'를 사용합니다. 이 페이지는 "특히 ** gethostbyname() **은 IPv6에서 잘 작동하지 않습니다."라고 말합니다. 'getaddrinfo()'는 확실히 사용할 것이다. – Celada