DNS 프로토콜은 UDP에서 TCP로 어떻게 전환됩니까?


31

다른 사람이 묻기 전에 : DNS 쿼리에서 UDP 대신 TCP를 사용하는 경우는 언제입니까? 내 질문에 대답하지 않습니다.

내가 계속 듣는 것은 " 응답이 너무 길면 DNS는 TCP를 사용할 것 "입니다. 이것은 어떻게 발생하는지 설명하지 않습니다.

상황은 다음과 같습니다. DNS 클라이언트는 UDP를 사용하여 레코드의 해결을 요청합니다. UDP에 대한 레코드가 너무 깁니다.

  1. 클라이언트가 TCP로 전환하도록 서버에서 특정 opcode로 응답
  2. 서버가 전혀 응답하지 않고 클라이언트가 TCP를 통해 다시 시도합니다
  3. 서버는 클라이언트에 대한 TCP 연결을 엽니 다 (NAT를 셀 수 있지만 누가 알겠습니까?)
  4. 클라이언트는 어떻게 든 주어진 쿼리가 TCP를 통해 실행되어야한다는 것을 '알고'처음에는 UDP를 방해하지 않습니다.
  5. DNS pixies는 필요할 때 마술로 UDP를 TCP로 바꿉니다.

인터넷을 통해 답을 찾고 있었지만 소음이 많으며 (위 참조) 적절한 Google 쿼리를 작성할 수 없습니다 (RFC에서 정보를 찾을 수는 없습니다) .


1
내가 찾을 수있는 것은 RFC5966에서였다. "해결 프로그램은 먼저 UDP 쿼리를 보내야하지만, UDP를 통해 (EDNS0이 있거나없는 상태에서) 응답이 UDP를 통해 전송 된 경우 응답이 잘릴 것으로 예상되는 경우 TCP 쿼리를 대신 보내도록 선택할 수 있습니다. ) 또는 다른 운영상의 이유로, 특히 서버에 이미 TCP 연결이되어있는 경우 " 리졸버는 언제 응답이 잘릴 것으로 예상해야합니까?
StanTastic

6
동일한 레코드에 대한 이전 요청이 너무 길어서 UDP 데이터 그램에 맞지 않는 경우를 예로들 수 있습니다.
David Schwartz

1
'절사'라는 opcode가 있습니다. 그리고 그것은 기본적으로 내가 생각한 것, 가장 분명한 해결책입니다.
StanTastic

1
쿼리에 여러 개의 "질문"(해결할 주소)이 포함 된 경우 사례 (d)가 현명한 선택 일 수 있습니다. 100 개의 주소를 해결해야하는 경우 단일 UDP 패킷에 응답을 맞출 수 없습니다.
MSalters

1
1.그리고 4.둘 다 대략 정확합니다 (둘 중 상황에 따라 다름).
kasperd

답변:


45

클라이언트는 응답이 너무 클 것이라는 것을 미리 알지 못하므로 UDP를 통해 서버를 쿼리합니다.
서버는 UDP를 통해 응답하며 가능한 많이 포함하고 잘린 헤더 비트 ( "TC" http://www.networksorcery.com/enp/protocol/dns.htm )를 설정합니다.
그러면 클라이언트는 TCP를 통해 요청을 다시 보내고 전체 응답을 얻을 수 있습니다.

참조 : https://tools.ietf.org/html/rfc5966

EDNS0 (DNS 0의 확장 메커니즘)이없는 경우 (아래 참조) 512 바이트 제한을 초과하는 UDP 응답을 보내야하는 모든 DNS 서버의 정상적인 동작은 서버가 응답을 자르도록 응답하는 것입니다. 한도 내에서 응답 헤더에 TC 플래그를 설정하십시오. 클라이언트가 그러한 응답을 받으면 TCP 대신 다시 시도해야한다는 표시로 TC 플래그를 사용합니다.

그리고 : https://www.ietf.org/rfc/rfc2181.txt

의견에서 언급했듯이 물론 DNS 영역 전송은 항상 TCP를 사용합니다.


2
RFC 5966은 또한 TCP가 항상 영역 전송에 사용 된다고 지적합니다 .
Matt Nordhoff

@MattNordhoff 맞아요, 그건 사실이며 언급하기 좋습니다. 이것은 'UDP에서 TCP 로의 전환은 어떻게 작동합니까?' 각도. 그러나 나는 그것을 대답에 추가 할 것입니다.
faker

그러나 이미 TCP 연결이 있다면 TCP 만 사용합니다
Jim B

아, 흥미 롭습니다. 그렇다면 언제 UDP로 넘어 갑니까?
StanTastic 2016 년

@JimB 확실합니까? 지속적인 TCP 연결을 유지한다고 생각하지 않습니다.
Barmar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.