내 도메인에 여러 A 레코드를 사용하는 경우-웹 브라우저가 둘 이상의 시도를 해 본 적이 있습니까?


94

도메인에 여러 개의 A 레코드를 추가하면 DNS 서버에 의해 라운드 로빈 순서로 반환됩니다.

예:

192.0.2.1 A example.com
192.0.2.2 A example.com
192.0.2.3 A example.com

그러나 첫 번째 호스트 ( 192.0.2.1)가 다운 (연결 불가) 하면 웹 브라우저는 어떻게 반응 합니까? 두 번째 호스트 ( 192.0.2.2) 를 시도 하거나 사용자에게 오류 메시지를 표시합니까? 가장 많이 사용되는 브라우저간에 차이점이 있습니까?

내 자신의 응용 프로그램을 구현하면 첫 번째가 다운 된 경우 두 번째가 사용되도록 구현할 수 있으므로 가능합니다. 그리고 이것은 내결함성 웹 사이트를 만드는 데 매우 도움이됩니다.

답변:


87

예, 지난 5-10 년 동안 대부분의 브라우저는 응답하지 않으면 다른 A 레코드를 시도합니다. 이를 "브라우저 재시도"또는 "클라이언트 재시도"라고도합니다. 이 기능을 사용하지 않는 사이트에 대해이 기능을 사용하도록 설정하는 다양한 브라우저 익스플로잇과 관련하여 정보를 찾을 수 있습니다 ( DNS 리 바인딩DNS 고정 , 안티 -DN 고정, 안티 -DN 고정, 안티-안티 참조) -anti-dns pinning 등). 평판이 좋지 않지만 존재한다는 것을 증명합니다.

거의 모든 브라우저가 실제로 A 레코드의 전체 목록을 받고, 사용중인 브라우저가 실패하면 다른 브라우저를 실제로 확인합니다. 각 클라이언트는 서버가 다운되었을 때 작업 주소에 연결될 때까지 사이트에 처음 액세스하려고 할 때 30 초 동안 기다릴 것으로 예상 할 수 있습니다. 그런 다음 브라우저는 작동중인 주소를 캐시하고 실패하지 않는 한 이후 요청에 계속 사용하여 목록을 다시 검색해야합니다. 따라서 첫 번째 요청시 30 초가 기다린 다음 괜찮습니다.

그러나 반드시 사용하고 싶은 것은 아니며 브라우저 호환성, OS 호환성, 프록시 호환성, 캐시 제어 헤더에 대해 많은 경고가있을 것입니다. IP가 다운되었거나 기억하기 시작하는 경우에 이상한 영향을 미칩니다. 30 초마다 요청이있을 때마다 사이트에 대한 사용자 정의 클라이언트를 작성하는 사람들 은 getaddrinfo 대신 gethostbyname 을 사용하여 모든 종류의 잠재적 인 장애 조치를 처리 할 수 ​​없게됩니다.

또한 브라우저가 목록에서 어떤 주소를 선택해야하는지 알 수 없기 때문에 "마스터"및 "슬레이브"서버를 허용하기 위해 여러 A 레코드에 의존 할 수 없습니다. 방문자는 실행중인 방문자를 처리 할 수 ​​있어야합니다. 브라우저는 목록에서 세 번째 서버가 가장 매력적이라고 ​​생각할 수도 있고 가장 근접해 보일 수도 있으며, 세 서버가 모두 작동하더라도 해당 서버를 선택합니다.

그러나 제한 사항에 따라 살 수 있고 브라우저 상호 작용을 예측할 수있는 상당히 단순한 HTTP 시스템이 있으면 작동합니다.

오, 당신은 또한 이것이 존재하지 않는다고 말하는 많은 사람들을 다루어야 할 것입니다. 그러나 증명해야 할 경우 여러 A 레코드, 죽은 IP 및 일부 좋은 레코드가있는 도메인 이름으로 텔넷 연결을 시도 할 수 있습니다 (예, 좋은 오래된 텔넷조차도 이제 getaddrinfo를 사용하고 요즘 여러 A 레코드를 정상적으로 처리합니다) -성공할 때까지 시도하고있는 멋진 IP 목록을 인쇄합니다.


12
다음 은 Joff의 답변을 뒷받침하는 국가 경제 연구 국의 보고서입니다.
Marco

3
흥미롭게도 stackexchange.com은 하나의 IP를 가리 키지 만 Google은 여러 IP를 반환합니다. $ dig google.com @ ns1.google.com ;; 답변 섹션 : google.com. google.com에서 74.125.226.6으로 300 개 google.com에서 74.125.226.7의 300 개 74.125.226.0 google.com에서 300 74.125.226.4 google.com에서 300 google.com에서 74.125.226.8에 300 개 74.125.226.2 google.com에서 300 google.com에서 74.125.226.1로 300 개 google.com에서 74.125.226.3으로 300 개 google.com에서 74.125.226.5의 300 개 google.com에서 74.125.226.14의 300 개 A 74.125.226.9에서 300
Louis St-Amour

1
미안하지만 그것이 어떻게 작동하는지는 생각하지 않습니다. 브라우저는 시스템 소프트웨어에서 발생하는 IP 주소 확인과 관련이 없습니다. 여러 개의 A 레코드를 제공하는 경우 주어진 클라이언트가 목록에서 임의의 레코드를 수신한다고 가정해야합니다.
Jan Steinman

19
이것은 이다 는 현대적인 브라우저에서 작동하는 방법. 그들은 모두 시스템에서 단일 IP 주소를 얻는 대신 getaddrinfo ()와 같은 시스템 호출을 사용하여 여러 IP 주소를 가져오고 내부적으로 장애 조치를 처리하도록 선택합니다. 여기에있는 다른 주석가들과 답변자들은 Joff의 마지막 문단에서 "이것이 존재하지 않는다고 말하는 사람들"의 일부입니다.
Robert Tupelo-Schneck

1
"5-10 년 전 브라우저"에 대한 Joff의 진술을 뒷받침하기 위해, 여기에는 이러한 종류의 시스템을 IE 8까지 작동시키는 국가 경제 연구 국의 테스트가 있습니다. :)
Jomar Sevillejo

5

Windows Vista는 RFC3484 의 어리석은 부분 (즉, IPV6에서 IPV4 로의 백 포트)을 구현 하며 임의로 하나를 선택하지 않고 사용자의 IP 주소와 대부분의 접두어 비트를 공유하는 IP 주소를 선호합니다. 대부분의 사용자에게는 192.168로 시작하는 IP 주소가 있으므로 대부분의 Vista 주소를 얻을 수있는 접두사 비트를 공유하는 IP 주소가 무엇이든 의미합니다. Microsoft는 Windows 7 이상에서이 특정 관용구를 고쳤으므로 예전만큼 큰 문제는 아닙니다.


비스타, 그거 좋은거야!
the0ther

3

이것이 기본적인 DNS로드 밸런싱 배포 기술입니다 : DNS Round Robin. 이것은 브라우저와 관련이 없으며 리졸버의 구현 및 DNS 주소의 로컬 / 원격 캐시에 따라 다릅니다. DNS 계층의 캐싱으로 인해 서버에 장애가 발생하면 웹 사이트에 액세스 할 수 없게됩니다.

WikiPedia의 Round Robin DNS 에 대한 기본 설명은 여기를 참조하십시오 .


1
글쎄, 브라우저는 리졸버이기 때문에 브라우저의 구현에 따라 다릅니다.
Jonas

2
아닙니다. 물론 시스템에서 설정 한 DNS 네임 서버를 사용하여 DNS를 확인하는 시스템 라이브러리가 있습니다. 이 기능은 표준 운영 체제 라이브러리의 일부입니다.
keatch

그러나 nslookup cnn.comWindows와 host cnn.comLinux 모두 에서 IP 주소 목록 을 반환 하므로 브라우저 의 구현에 따라 다릅니다 .
Jonas

5
@iivel : 아니요, 사실이 아닙니다. Java 프로그램을 작성하고 InetAddress.getAllByName ( "example.com") 으로 이름을 확인하면 모든 IP 주소가 포함 된 목록이 표시되므로 원하는 경우 모든 IP 주소로 TCP 연결을 시작하도록 선택할 수 있습니다. C에서 getaddrinfo () 를 사용하는 경우에도 마찬가지 입니다. 따라서 운영 체제가 아닌 개발자가 선택하는 것이 분명합니다 .
Jonas

1
@ J.Money이 질문은, 구현에 대해 정확히 요구하고 있지 우리가 어떻게 할 수 그것을 할.
Franklin Yu

0

OS는 브라우저가 아닌 사용할 IP를 결정합니다. Windows는 반환 된 목록 (DNS에서 다시 전달 된 목록)을 로빈 처리하지만 DNS가 플러시되거나 시간 초과 될 때까지 동일한 주소를 계속 사용합니다. * ix 구현은 번들로 제공된 tcp 스택 구현에 부분적으로 의존하지만 일반적으로 라운드 로빈 방법도 따릅니다.


2
아니요, 잘못되었습니다. Java 프로그램을 작성하고 이름을 InetAddress.getAllByName("example.com")확인하면 모든 IP 주소가있는 목록이 표시되므로 원하는 경우 모든 IP 주소로 TCP 연결을 시작하도록 선택할 수 있습니다. getaddrinfo()C에서 사용하는 경우에도 마찬가지 입니다. 따라서 운영 체제가 아닌 개발자가 선택하는 것이 확실합니다. DNS 서버는 IP 주소 목록이 반환되는 순서를 결정합니다.
Jonas

좋아, 스택으로 원하는 것을 수동으로 할 수 있습니다. 자신 만 롤링하고 winsock을 잊어 버릴 수도 있습니다. 그러나 앱을 작성하고 OS가 그 일을하도록한다면 (추상적) 동작은 언급 된대로입니다. 당신은 특히 가능한 응용 프로그램 동작이 아니라 전통적인 응용 프로그램 동작에 대해 질문했습니다. 대부분의 개발자는 해결되지 않은 이름의 사용을 처리하고 동작을 밀접하게 연결하지 않고 OS가 해당 기능을 수행하도록합니다.
iivel

1
답이 왜 다운 보트인지 확실하지 않지만, 브라우저가하는 일에 대한 질문입니다. 현재 모든 브라우저에서 OS가 해결을 할 수 있습니다 (Firefox 및 Chrome의 일부 플러그인이 부족함). 공급 업체가 중단해야하는 가용성을 보장하는 방법에 대한 자세한 내용을 보려면로드 밸런서 또는 클러스터링을 확인하십시오.
iivel

브라우저는 아마도 당신이 말한대로 할 것입니다-OS가 DNS 조회를하게하지만 IP 주소가 있는 목록 을 브라우저에 반환합니다 . 그리고 첫 번째 주소에 접근 할 수없는 경우 가장 인기있는 브라우저는 무엇을 하는가? 그들은 두 번째 시도합니까?
Jonas

2
Pete Tenereillo가 인용 한 기사는 오래된 것으로 알려져 있습니다. Chrome에서 chrome : // net-internals / # dns는 현재 DNS 캐시를 보여줍니다. OS가 항상 사용할 IP를 결정한다고 생각하지 않습니다. 최소한 Chrome에서는 AAAA를 사용하거나 A 만 사용하도록 선택할 수 있습니다. OP는 컴퓨터가 DNS 서버를 찾는 방법이 아니라 DNS가 브라우저를 선택하는 방법에 대해 이야기하고 있습니다 ....
sdaffa23fdsf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.