การทำชื่อโดเมนให้อยู่ในรูปแบบมาตราฐาน (Normalization of Domain Name Strings or Labels):
การทำชื่อโดเมนให้อยู่ในรูปแบบมาตราฐาน หมายถึงกระบวนการแปลงและปรับชื่อโดเมนให้อยู่ในรูปแบบที่สอดคล้องกัน เพื่อให้การแสดงผลที่แตกต่างกันของชื่อโดเมนเดียวกันถูกมองว่าเทียบเท่ากัน ช่วยส่งเสริมการทำงานร่วมกัน (interoperability) และหลีกเลี่ยงความสับสนในโปรโตคอลและแอปพลิเคชันต่าง ๆ บนอินเทอร์เน็ต
ต่อไปนี้คือประเด็นสำคัญบางประการที่เกี่ยวข้องกับการทำให้อยู่ในรูปแบบมาตรฐานของสตริงหรือป้ายกำกับชื่อโดเมน:
- Unicode Normalization:
ชื่อโดเมนอาจประกอบด้วยอักขระยูนิโค้ด และอักขระเดียวกันอาจมีรูปแบบการแทนค่าในยูนิโค้ดได้หลายแบบ ดังนั้นจึงมีการใช้การทำให้อยู่ในรูปแบบมาตรฐานของยูนิโค้ด โดยเฉพาะ Unicode Normalization Form C (NFC) หรือ Normalization Form D (NFD) เพื่อแปลงชื่อโดเมนให้อยู่ในรูปแบบยูนิโค้ดที่เป็นมาตรฐาน กระบวนการนี้ช่วยให้ชื่อโดเมนที่มีการประกอบอักขระยูนิโค้ดแตกต่างกัน แต่มีความหมายเทียบเท่ากัน ถูกมองและประมวลผลว่าเป็นชื่อเดียวกัน
- Case Normalization:
ชื่อโดเมนไม่แยกแยะตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ซึ่งหมายความว่าการใช้ตัวอักษรพิมพ์เล็กหรือพิมพ์ใหญ่ในชื่อโดเมนจะไม่ส่งผลต่อการแก้ไขชื่อโดเมน (resolution) อย่างไรก็ตาม เพื่อความสม่ำเสมอ ชื่อโดเมนมักจะถูกปรับให้อยู่ในรูปแบบตัวพิมพ์เล็กทั้งหมดในกระบวนการทำให้อยู่ในรูปแบบมาตรฐาน การดำเนินการนี้ช่วยให้เกิดความเป็นเอกภาพ และลดความผิดพลาดที่อาจเกิดจากการใช้ตัวอักษรต่างรูปแบบกัน
- IDN Normalization:
ชื่อโดเมนภาษาท้องถิ่น (Internationalized Domain Names: IDNs) ช่วยให้ชื่อโดเมนสามารถประกอบด้วยอักขระที่ไม่ใช่ ASCII ได้ เพื่อให้ระบบต่าง ๆ สามารถทำงานร่วมกันได้อย่างสอดคล้อง IDNs จึงต้องผ่านกระบวนการทำให้อยู่ในรูปแบบมาตรฐาน โดยอ้างอิงตาม Unicode Normalization Form C (NFC) หรือ Normalization Form D (NFD) ที่กล่าวถึงก่อนหน้านี้ กระบวนการทำให้อยู่ในรูปแบบมาตรฐานนี้ช่วยให้ IDNs ที่มีความหมายเทียบเท่ากัน ถูกปฏิบัติและประมวลผลอย่างสม่ำเสมอในระบบและแอปพลิเคชันที่แตกต่างกัน
- Punycode Encoding:
ในบางกรณี ชื่อโดเมนแบบภาษาท้องถิ่น (IDNs) จะถูกเข้ารหัสด้วย Punycode ซึ่งเป็นกลไกที่ใช้แปลงอักขระยูนิโค้ดให้เป็นรูปแบบ ASCII เพื่อให้สามารถทำงานร่วมกับระบบที่รองรับเฉพาะ ASCII ได้ ก่อนกระบวนการทำให้อยู่ในรูปแบบมาตรฐาน IDNs ที่ถูกเข้ารหัสด้วย Punycode จะถูกถอดรหัสก่อน เพื่อให้ได้รูปแบบยูนิโค้ดดั้งเดิมของชื่อโดเมน จากนั้นจึงนำรูปแบบยูนิโค้ดของชื่อโดเมนไปผ่านกระบวนการทำให้อยู่ในรูปแบบมาตรฐาน
การทำชื่อโดเมนให้อยู่ในรูปแบบมาตรฐาน มักรวมถึงการใช้รูปแบบการทำให้อยู่ในรูปแบบมาตรฐานแบบ NFKC (Normalization Form KC) เพื่อให้เกิดความเข้ากันได้และความสม่ำเสมอ การทำ NFKC normalization จะครอบคลุมทั้งการปรับให้อยู่ในรูปแบบมาตรฐานเชิงโครงสร้าง (canonical composition) และการปรับให้เข้ากันได้ (compatibility normalization) โดยจะรวมอักขระให้อยู่ในรูปแบบที่ประกอบสมบูรณ์เมื่อเป็นไปได้ และแทนที่ลำดับของอักขระด้วยอักขระที่มีค่าเทียบเท่าทางมาตรฐาน วิธีการนี้ช่วยทำให้รูปแบบการแทนค่าอักขระที่แตกต่างกันแต่มีความหมายเทียบเท่ากันถูกทำให้เป็นหนึ่งเดียว และส่งเสริมความเข้ากันได้ของระบบ
ในการทำให้ชื่อโดเมนอยู่ในรูปแบบมาตรฐาน การใช้ NFKC normalization ช่วยแก้ไขปัญหาความเข้ากันได้ที่อาจเกิดจากการแทนค่าอักขระที่แตกต่างกัน ทำให้ชื่อโดเมนที่มีลำดับอักขระแตกต่างกันในเชิงโครงสร้าง แต่มีความหมายเทียบเท่ากัน ถูกแสดงและประมวลผลในรูปแบบที่สอดคล้องกัน
การนำ NFKC normalization มาใช้เป็นส่วนหนึ่งของกระบวนการทำให้อยู่ในรูปแบบมาตรฐานของสตริงหรือป้ายกำกับชื่อโดเมน ช่วยให้มั่นใจได้ว่าชื่อโดเมนจะอยู่ในรูปแบบที่เป็นมาตรฐานและสามารถทำงานร่วมกับระบบได้อย่างถูกต้อง ซึ่งมีความสำคัญต่อการแก้ไขชื่อโดเมน การเปรียบเทียบ และการจัดการชื่อโดเมนภายในโครงสร้างพื้นฐานของระบบ DNS (Domain Name System)
- ข้อกำหนดในการทำชื่อโดเมนให้อยู่ในรูปแบบมาตรฐาน (Normalization Requirements of Domain Name Strings or Labels):
การทำให้ชื่อโดเมนอยู่ในรูปแบบมาตรฐานแตกต่างจากการทำให้สตริงทั่วไปอยู่ในรูปแบบมาตรฐาน เนื่องจากชื่อโดเมนมีข้อกำหนดและเงื่อนไขเฉพาะที่เกี่ยวข้องกับการใช้งานภายในระบบชื่อโดเมน (DNS) และโครงสร้างพื้นฐานของอินเทอร์เน็ต
ปัจจัยต่อไปนี้คือบางประการที่ทำให้การทำให้ชื่อโดเมนอยู่ในรูปแบบมาตรฐานมีลักษณะเฉพาะแตกต่างจากกรณีอื่น ๆ:
- Case Insensitivity: ชื่อโดเมนไม่แยกแยะตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ซึ่งหมายความว่าตัวอักษรพิมพ์ใหญ่และพิมพ์เล็กถือว่าเทียบเท่ากัน การทำให้ชื่อโดเมนอยู่ในรูปแบบมาตรฐานจึงรวมถึงการแปลงชื่อโดเมนให้อยู่ในรูปแบบตัวพิมพ์เล็กทั้งหมด เพื่อให้เกิดความสม่ำเสมอและหลีกเลี่ยงความสับสน
- ASCII Compatibility: โดยทั่วไป ชื่อโดเมนจะแสดงผลโดยใช้อักขระ ASCII อย่างไรก็ตาม ชื่อโดเมนอาจประกอบด้วยอักขระที่ไม่ใช่ ASCII ได้ในรูปแบบของชื่อโดเมนภาษาท้องถิ่น (Internationalized Domain Names: IDNs) การทำให้ชื่อโดเมนอยู่ในรูปแบบมาตรฐานจึงรวมถึงการแปลง IDNs ให้อยู่ในรูปแบบที่รองรับ ASCII โดยใช้กลไกอย่าง Punycode เพื่อให้สามารถทำงานร่วมกับโครงสร้างพื้นฐานของ DNS ที่มีอยู่เดิม และระบบต่าง ๆ ที่ไม่รองรับอักขระที่ไม่ใช่ ASCII ได้อย่างถูกต้อง
- Label Separators: ชื่อโดเมนประกอบด้วย หลายส่วนที่คั่นด้วยจุด การทำให้อยู่ในรูปแบบมาตรฐานอาจรวมถึงการจัดการตัวคั่นของชื่อ เช่น การลบจุดที่อยู่ด้านหน้าและด้านท้ายชื่อโดเมน และการตรวจสอบให้แน่ใจว่าขอบเขตของแต่ละชื่อโดเมนถูกต้อง ซึ่งช่วยรักษาโครงสร้างของชื่อโดเมนให้ถูกต้อง
- Unicode Normalization: หากชื่อโดเมนมีอักขระยูนิโค้ด ควรดำเนินการทำให้อยู่ในรูปแบบมาตรฐานของยูนิโค้ด เช่น NFC (Normalization Form C) หรือ NFKC (Normalization Form KC) การทำให้อยู่ในรูปแบบมาตรฐานของยูนิโค้ดช่วยให้การแทนค่าอักขระมีความสม่ำเสมอ และหลีกเลี่ยงความแตกต่างของลำดับอักขระที่มีความหมายเทียบเท่ากัน ซึ่งมีความสำคัญอย่างยิ่งเมื่อเกี่ยวข้องกับชื่อโดเมนแบบนานาชาติ (IDNs)
- IDN Mapping: ชื่อโดเมนแบบภาษาท้องถิ่น (Internationalized Domain Names: IDNs) เป็นการแทนชื่อโดเมนด้วยอักขระที่ไม่ใช่ ASCII ทำให้สามารถเขียนชื่อโดเมนด้วยระบบอักษรหรือภาษาที่หลากหลายได้ การทำให้อยู่ในรูปแบบมาตรฐานของ IDNs อาจรวมถึงการใช้การแมปหรือการแปลงรูปแบบเฉพาะ เพื่อจัดการกับรูปแบบหรือการแทนค่าที่แตกต่างกันของชื่อโดเมนเดียวกัน กระบวนการนี้ช่วยให้การใช้งาน IDNs มีความเข้ากันได้และมีความสม่ำเสมอ
- DNS Considerations: การทำให้ชื่อโดเมนอยู่ในรูปแบบมาตรฐานจำเป็นต้องปฏิบัติตามข้อกำหนดและข้อจำกัดของระบบ DNS ตัวอย่างเช่น ความยาวของแต่ละป้ายกำกับ (label) และความยาวรวมของชื่อโดเมนต้องอยู่ภายในขอบเขตที่ DNS กำหนด การทำให้อยู่ในรูปแบบมาตรฐานอาจรวมถึงการตัดทอน การเข้ารหัส หรือการปรับแก้ชื่อโดเมน เพื่อให้เป็นไปตามข้อกำหนดเหล่านี้
- Label Length: ป้ายกำกับ (label) หมายถึงแต่ละส่วนย่อยของชื่อโดเมนที่ถูกคั่นด้วยจุด โดยป้ายกำกับหนึ่ง ๆ จะมีความยาวได้ไม่เกิน 63 อักขระ ข้อจำกัดนี้ครอบคลุมอักขระตัวอักษรและตัวเลข (ตัวอักษร A–Z ตัวเลข 0–9) รวมถึงเครื่องหมายขีดกลาง (-) และไม่สามารถขึ้นต้นหรือสิ้นสุดด้วยเครื่องหมายขีดกลางได้
- Domain Name Length: ความยาวรวมของชื่อโดเมนทั้งหมด ซึ่งรวมทุกป้ายกำกับและจุดที่ใช้คั่นระหว่างกัน ถูกจำกัดไว้ไม่เกิน 253 อักขระ ข้อจำกัดนี้ใช้กับชื่อโดเมนแบบสมบูรณ์ (Fully Qualified Domain Name: FQDN) ซึ่งรวมถึงโดเมนระดับบนสุด (Top-Level Domain: TLD) โดเมนระดับที่สอง (Second-Level Domain: SLD) และโดเมนย่อย (subdomains) ทั้งหมด
- Path Length: นอกเหนือจากชื่อโดเมนแล้ว ระบบ DNS ยังรองรับเส้นทางแบบลำดับชั้น (hierarchical paths) เช่น ที่ใช้ในการค้นหาบริการผ่าน DNS (DNS-based service discovery) อย่างเช่นระเบียน SRV โดยความยาวสูงสุดของเส้นทางชื่อโดเมนแบบสมบูรณ์ ซึ่งรวมทั้งชื่อโดเมนและส่วนย่อยของเส้นทางทั้งหมด จะถูกจำกัดไว้ไม่เกิน 255 อักขระ
ข้อพิจารณาเหล่านี้ช่วยให้มั่นใจได้ว่าชื่อโดเมนถูกแทนค่าอย่างถูกต้อง สามารถทำงานร่วมกับโครงสร้างพื้นฐานของ DNS ได้ และมีความสม่ำเสมอในการใช้งานข้ามระบบและโปรโตคอลที่แตกต่างกัน
อัลกอริทึม Punycode ซึ่งอ้างอิงตามมาตรฐาน RFC 3492 ใช้กระบวนการอย่างเป็นระบบในการแปลงสตริงยูนิโค้ดให้เป็นรูปแบบที่รองรับ ASCII โดยขั้นตอนต่อไปนี้จะแสดงลำดับวิธีการที่ใช้ในการดำเนินการแปลงดังกล่าว
- ข้อมูลนำเข้า (Input): อัลกอริทึมเริ่มต้นโดยรับสตริงอินพุตในรูปแบบยูนิโค้ดเป็นข้อมูลตั้งต้น
- เตรียมข้อมูลนำเข้า (Prepare the Input): สตริงอินพุตจะถูกทำให้เป็นรูปแบบมาตรฐานก่อน โดยใช้ Unicode Normalization Form KC (NFKC) เพื่อให้เกิดความสม่ำเสมอและความเข้ากันได้
- การเข้ารหัส (Encoding): อัลกอริทึมจะแยกสตริงอินพุตที่ผ่านการทำให้เป็นรูปแบบมาตรฐานแล้วออกเป็นลำดับของโค้ดพอยต์ โดยแต่ละโค้ดพอยต์แทนตัวอักขระยูนิโค้ดหนึ่งตัว
- การแปลงเป็น ASCII (ASCII Conversion): โค้ดพอยต์แต่ละตัวจะถูกตรวจสอบว่าอยู่ในช่วง ASCII (0–127) หรือไม่ หากอยู่ในช่วงดังกล่าว โค้ดพอยต์นั้นจะถูกแมปโดยตรงไปเป็นอักขระ ASCII ที่สอดคล้องกัน
- การเข้ารหัสพื้นฐาน (Basic Encoding): สำหรับโค้ดพอยต์ที่อยู่นอกช่วง ASCII อัลกอริทึมจะดำเนินการเข้ารหัสพื้นฐาน โดยกำหนดค่าไบแอสเริ่มต้นและเตรียมค่าเริ่มต้นให้กับสตริงผลลัพธ์
- การจัดการอักขระที่ไม่ใช่อักขระพื้นฐาน (Non-Basic Code Points): โค้ดพอยต์ที่ไม่ใช่แบบพื้นฐาน (โค้ดพอยต์ที่มีค่ามากกว่า 0x7F) จะถูกประมวลผลทีละตัว โดยอัลกอริทึมจะทำการแปลงเชิงคณิตศาสตร์กับโค้ดพอยต์แต่ละตัว เพื่อเข้ารหัสให้อยู่ในรูปของชุดอักขระ ASCII
- การจัดการค่า Bias (Handling Bias): ค่าไบแอสจะถูกปรับเปลี่ยนแบบไดนามิกตามตำแหน่งของโค้ดพอยต์ในสตริงอินพุต เพื่อให้การแทนค่าที่เข้ารหัสแล้วมีความกระชับและยังคงความสามารถในการอ่านได้อย่างเหมาะสม
- ผลลัพธ์ (Output): รูปแบบการแทนค่าแบบ Punycode ที่เข้ารหัสแล้วจะถูกสร้างขึ้นโดยการนำอักขระ ASCII ที่ได้จากกระบวนการเข้ารหัสมาเชื่อมต่อกัน
- การแปลงเสร็จสมบูรณ์ (Conversion Complete): ขณะนี้รูปแบบการแทนค่าแบบ Punycode พร้อมสำหรับการใช้งานเป็นชื่อโดเมนที่เข้ากันได้กับ ASCII
มาลองอธิบายขั้นตอนของอัลกอริทึม Punycode โดยใช้ตัวอย่างชื่อโดเมนในอักษรไทยคือ คน.ไทย (คำว่า “คน.ไทย” ในอักษรไทย)
- ข้อมูลนำเข้า (Input): สตริงยูนิโค้ดที่ป้อนเข้ามาคือ คน.ไทย
- เตรียมข้อมูลนำเข้า (Prepare the Input): สตริงอินพุตจะถูกทำให้เป็นรูปแบบมาตรฐานโดยใช้ Unicode Normalization Form KC (NFKC) เพื่อให้เกิดความสม่ำเสมอและความเข้ากันได้
- การเข้ารหัส (Encoding): สตริงอินพุตที่ผ่านการทำให้เป็นรูปแบบมาตรฐานแล้วจะถูกแยกออกเป็นลำดับของโค้ดพอยต์ ซึ่งแทนค่าอักขระยูนิโค้ดแต่ละตัว โดยในกรณีนี้ โค้ดพอยต์จะสอดคล้องกับอักษรภาษาไทย
- การแปลงเป็น ASCII (ASCII Conversion):เนื่องจากอักษรภาษาไทยอยู่นอกช่วง ASCII ดังนั้นโค้ดพอยต์ที่ไม่ใช่ ASCII แต่ละตัวจึงไม่สามารถแมปไปเป็นอักขระ ASCII ได้โดยตรง
- การเข้ารหัสพื้นฐาน (Basic Encoding):อัลกอริทึมจะดำเนินการเข้ารหัสพื้นฐานสำหรับโค้ดพอยต์ที่ไม่ใช่ ASCII โดยกำหนดค่าไบแอสเริ่มต้นและตั้งค่าเริ่มต้นให้กับสตริงผลลัพธ์
- การจัดการอักขระที่ไม่ใช่อักขระพื้นฐาน (Non-Basic Code Points): โค้ดพอยต์ที่ไม่ใช่แบบพื้นฐานซึ่งแทนอักษรภาษาไทยจะถูกประมวลผลทีละตัว โดยโค้ดพอยต์แต่ละตัวจะผ่านกระบวนการแปลงทางคณิตศาสตร์เพื่อเข้ารหัสให้อยู่ในรูปของชุดอักขระ ASCII
- การจัดการค่า Bias (Handling Bias): ค่าไบแอสจะถูกปรับเปลี่ยนแบบไดนามิกตามตำแหน่งของโค้ดพอยต์ในสตริงอินพุต เพื่อให้การแทนค่าที่เข้ารหัสแล้วมีความสมดุลระหว่างความกระชับและความสามารถในการอ่านได้
- ผลลัพธ์ (Output):รูปแบบการแทนค่าแบบ Punycode ที่เข้ารหัสแล้วจะถูกสร้างขึ้นโดยการนำอักขระ ASCII ที่ได้จากกระบวนการเข้ารหัสมาเชื่อมต่อกัน ตัวอย่างเช่น รูปแบบ Punycode ของ คน.ไทย คือ “xn–42c6b.xn–o3cw4h”
- การแปลงเสร็จสมบูรณ์ (Conversion Complete): รูปแบบ Punycode ที่ได้คือ “xn–42c6b.xn–o3cw4h” ซึ่งขณะนี้เป็นชื่อโดเมนที่เข้ากันได้กับ ASCII และสามารถนำไปใช้งานได้ภายในโครงสร้างพื้นฐานของระบบ DNS ที่มีอยู่ในปัจจุบัน
จากการดำเนินการตามขั้นตอนดังกล่าว อัลกอริทึม Punycode จะทำการแปลงชื่อโดเมนในรูปแบบ Unicode คือ “คน.ไทย” ให้เป็นรูปแบบที่สอดคล้องกับมาตรฐาน ASCII เช่น “xn–42c6b.xn–o3cw4h” เพื่อให้สามารถนำไปใช้งานและประมวลผลได้ภายในระบบ Domain Name System (DNS)
