Làm thế nào để giao thức DNS chuyển từ UDP sang TCP?


31

Trước khi có ai hỏi: Tôi đã thấy Khi nào các truy vấn DNS sử dụng TCP thay vì UDP? và nó không trả lời câu hỏi của tôi.

Tất cả những gì tôi nghe được là " nếu câu trả lời quá dài, DNS sẽ sử dụng TCP ". Điều này không giải thích làm thế nào nó xảy ra mặc dù.

Vì vậy, đây là tình huống: Máy khách DNS yêu cầu giải quyết bản ghi bằng UDP. Bản ghi quá dài cho UDP:

  1. máy chủ trả lời với opcode cụ thể, để chuyển máy khách sang TCP
  2. máy chủ hoàn toàn không trả lời và khách hàng thử lại qua TCP
  3. Máy chủ mở kết nối TCP tới máy khách (ngu ngốc, nếu bạn đếm NAT, nhưng ai biết?)
  4. khách hàng bằng cách nào đó (?) 'biết' rằng truy vấn đã cho nên được chạy qua TCP để nó không bận tâm với UDP ngay từ đầu
  5. DNS pixies biến UDP thành TCP khi cần thiết

Tôi đã tìm kiếm trên internet để tìm câu trả lời, nhưng có rất nhiều tiếng ồn (xem ở trên) và dường như tôi không thể viết truy vấn Google thích hợp cho điều đó (tôi cũng không thể tìm thấy thông tin trong RFC) .


1
Tất cả những gì tôi có thể tìm thấy là trong RFC5966: "Bộ giải quyết NÊN gửi truy vấn UDP trước, nhưng CÓ THỂ chọn gửi truy vấn TCP thay vì nếu có lý do chính đáng để mong đợi phản hồi sẽ bị cắt nếu nó được gửi qua UDP (có hoặc không có EDNS0 ) hoặc vì các lý do hoạt động khác, đặc biệt, nếu nó đã có kết nối TCP mở tới máy chủ. ". Khi nào thì trình giải quyết "mong đợi" rằng phản hồi sẽ bị cắt ngắn?
StanTastic

6
Một ví dụ rõ ràng sẽ là nếu một yêu cầu trước đó cho cùng một bản ghi quá dài để phù hợp với một datagram UDP.
David Schwartz

1
Vì vậy, có một opcode nói rằng "cắt ngắn", phải không? Và nó chuyển sang sau đó - về cơ bản những gì tôi nghĩ, đó là giải pháp rõ ràng nhất.
StanTastic

1
Trường hợp (d) có thể là một lựa chọn khôn ngoan nếu truy vấn có nhiều "câu hỏi" (địa chỉ cần giải quyết). Nếu bạn cần giải quyết 100 địa chỉ, bạn sẽ không thể điều chỉnh phản hồi trong một gói UDP.
MSalters

1
1.4.cả hai đều gần đúng (cái nào trong hai cái này phụ thuộc vào hoàn cảnh).
kasperd

Câu trả lời:


45

Máy khách không biết trước rằng phản hồi sẽ quá lớn, vì vậy nó sẽ truy vấn máy chủ thông qua UDP.
Máy chủ sẽ phản hồi thông qua UDP và sẽ bao gồm càng nhiều càng tốt và đặt bit tiêu đề bị cắt ngắn ("TC" http://www.networksorcery.com/enp/protatio/dns.htmlm ).
Sau đó, khách hàng có thể gửi lại yêu cầu qua TCP và nhận được phản hồi đầy đủ.

Xem thêm: https://tools.ietf.org/html/rfc5966

Trong trường hợp không có EDNS0 (Cơ chế mở rộng cho DNS 0) (xem bên dưới), hành vi bình thường của bất kỳ máy chủ DNS nào cần gửi phản hồi UDP vượt quá giới hạn 512 byte là để máy chủ cắt bớt phản hồi sao cho phù hợp trong giới hạn đó và sau đó đặt cờ TC trong tiêu đề phản hồi. Khi máy khách nhận được phản hồi như vậy, nó sẽ lấy cờ TC làm dấu hiệu cho thấy nó sẽ thử lại trên TCP thay thế.

Và: https://www.ietf.org/rfc/rfc2181.txt

Và như đã đề cập trong các bình luận, tất nhiên việc chuyển vùng DNS luôn sử dụng TCP.


2
RFC 5966 cũng lưu ý rằng TCP luôn được sử dụng để chuyển vùng.
Matt Nordhoff

@MattNordhoff Phải, đó là sự thật và tốt để đề cập. Điều này nhằm mục đích nhiều hơn là 'cách chuyển đổi từ UDP sang TCP hoạt động như thế nào?' góc. Nhưng tôi sẽ thêm nó vào câu trả lời.
mạo

Tuy nhiên, nếu đã có kết nối TCP, nó sẽ chỉ sử dụng TCP
Jim B

Ah điều đó thật thú vị. Vậy khi nào nó rơi trở lại UDP?
StanTastic

@JimB Bạn có chắc về điều đó? Tôi không nghĩ rằng nó giữ cho một kết nối TCP liên tục mở.
Barmar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.