โปรโตคอล DNS เปลี่ยนจาก UDP เป็น TCP อย่างไร


31

ก่อนใครถาม: ฉันเคยเห็นDNS การสืบค้นใช้ TCP แทนที่จะเป็น UDP เมื่อใด และมันไม่ตอบคำถามของฉัน

สิ่งที่ฉันได้ยินคือ " ถ้าคำตอบยาวเกินไป DNS จะใช้ TCP " สิ่งนี้ไม่ได้อธิบายว่ามันเกิดขึ้นได้อย่างไร

ดังนั้นนี่คือสถานการณ์: ไคลเอนต์ DNS ขอให้มีการแก้ไขเรคคอร์ดโดยใช้ UDP บันทึกยาวเกินไปสำหรับ UDP:

  1. คำตอบของเซิร์ฟเวอร์ที่มี opcode เฉพาะเพื่อให้ไคลเอนต์สลับเป็น TCP
  2. เซิร์ฟเวอร์ไม่ตอบรับเลยและไคลเอนต์ลองใหม่ผ่าน TCP
  3. เซิร์ฟเวอร์เปิดการเชื่อมต่อ TCP ไปยังไคลเอนต์ (โง่ถ้าคุณนับ NAT แต่ใครจะรู้?)
  4. อย่างใดลูกค้า (?) 'รู้' ว่าแบบสอบถามที่กำหนดควรจะเรียกใช้ผ่าน TCP จึงไม่รบกวน UDP ในสถานที่แรก
  5. DNS พิกซี่เปลี่ยน UDP ให้เป็น TCP อย่างน่าอัศจรรย์

ฉันได้รับคำตอบจากทั่วอินเทอร์เน็ต แต่ก็มีเสียงดังมาก (ดูด้านบน) และฉันไม่สามารถเขียนข้อความค้นหา Google ที่เหมาะสมสำหรับเรื่องนั้นได้ (ฉันไม่สามารถหาข้อมูลใน RFC ได้) .


1
ทั้งหมดที่ฉันสามารถหาได้ใน RFC5966: "ตัวแก้ไขควรส่งแบบสอบถาม UDP ก่อน แต่อาจเลือกที่จะส่งแบบสอบถาม TCP แทนหากมีเหตุผลที่ดีที่คาดว่าการตอบสนองจะถูกตัดถ้ามันถูกส่งผ่าน UDP (มีหรือไม่มี EDNS0 โดยเฉพาะอย่างยิ่งหากมีการเชื่อมต่อ TCP แบบเปิดกับเซิร์ฟเวอร์อยู่แล้ว ". เมื่อใดที่ผู้แก้ไขควร "คาดหวัง" ว่าคำตอบจะถูกปัดเศษ?
StanTastic

6
ตัวอย่างที่ชัดเจนคือถ้าคำขอก่อนหน้าสำหรับระเบียนเดียวกันยาวเกินไปที่จะใส่ในดาตาแกรม UDP
David Schwartz

1
ดังนั้นจึงมีรหัสที่ระบุว่า "ถูกตัดทอน" ใช่ไหม และมันก็เปลี่ยน - โดยทั่วไปสิ่งที่ฉันคิดว่ามันเป็นทางออกที่ชัดเจนที่สุด
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) (ดูด้านล่าง), พฤติกรรมปกติของเซิร์ฟเวอร์ DNS ใด ๆ ที่ต้องการส่งการตอบสนอง UDP ที่เกินขีด จำกัด 512- ไบต์คือเซิร์ฟเวอร์จะตัดการตอบสนองเพื่อให้เหมาะสม ภายในขีด จำกัด นั้นจากนั้นตั้งค่าสถานะ TC ในส่วนหัวการตอบสนอง เมื่อไคลเอนต์ได้รับการตอบสนองเช่นนั้นจะใช้แฟล็ก TC เป็นตัวบ่งชี้ว่าควรลองผ่าน TCP แทน

และ: https://www.ietf.org/rfc/rfc2181.txt

แน่นอนว่าการถ่ายโอนโซน DNS นั้นมักจะใช้ TCP อยู่เสมอ


2
RFC 5966 ยังตั้งข้อสังเกตว่า TCP จะใช้สำหรับการถ่ายโอนโซนเสมอ
Matt Nordhoff

@MattNordhoff ใช่แล้วมันเป็นเรื่องจริงและดีที่พูดถึง สิ่งนี้มีจุดประสงค์เพิ่มเติมที่ 'วิธีการเปลี่ยนจาก UDP เป็น TCP ทำงานอย่างไร' มุม. แต่ฉันจะเพิ่มเข้าไปในคำตอบ
ขนม

อย่างไรก็ตามหากมีการเชื่อมต่อ TCP อยู่แล้วจะใช้ TCP
Jim B

โอ้นั่นน่าสนใจ ดังนั้นเมื่อไหร่จะกลับไปที่ UDP
StanTastic

@JimB คุณแน่ใจหรือไม่ ฉันไม่คิดว่าจะเปิดการเชื่อมต่อ TCP แบบต่อเนื่อง
Barmar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.