MTU คืออะไร
เมื่อไม่กี่วันก่อนผมได้มีโอกาสไปตั้งค่า Router ให้กับลูกค้ารายหนึ่ง โดยลูกค้ารายนี้ได้ทำการเชื่อมต่อ HQ เข้ากับ Dataenter ด้วย Private Link ของ ISP จากนั้น และทำให้ HQ ออก Internet ผ่าน Private Link นี้ จาก Design ดูเหมือนจะไม่มีอะไร แต่พอตื่นเช้าขึ้นมากลับพบปัญหาว่า การเข้าใช้งาน Internet ของ Users ไม่สามารถเข้าใช้งาน HTTP บาง Web site ได้ ซึ่งปัญหาทั้งหมดทั้งมวลเกิดจากการตั้งค่า MTU ของ Router ฉะนั้นในบทความนี้ผมจึงอยากค้นหาความรู้เกี่ยวกับความสัมพันธ์ระหว่าง MTU เพื่อประกอบความเข้าใจและเก็บไว้ในส่วนลึกของหัวใจให้ยาวนานครับ
ว่าด้วยเรื่อง MTU คืออะไร ( Maximum Transmission Unit )
- ก่อนอื่นต้องทำความเข้าใจก่อนนะครับว่าเรากำลังพูดถึงการส่งข้อมูลผ่านเครือข่าย Internet ขนาดใหญ่ โดยเมื่อเรากำลังจะส่งข้อมูลจาก Application Layer ลงไปจะต้องมีการห่อหุ้มข้อมูล (Encapsulated) ก่อนที่จะส่งไปยัง Layer ที่อยู่ล่างๆถัดไป หากสมมติว่า Application ที่เราใช้งานมีขนาดข้อมูลเล็กๆที่ 500Bytes ไปยังปลายทาง ก็จะทำการส่งไปในแพ็คเก็ตเดียวได้โดยไม่ติดปัญหาอะไร แต่หากว่า Application เรามีการส่งข้อมูลที่มีขนาดใหญ่มากๆ ก็จำเป็นต้องทำการหั่นข้อมูลออกเป็นชิ้นย่อยๆหลายๆแพ็คเก็ต เพื่อทยอยส่งไปตามเส้นทางนั่นเอง โดยค่าของ MTU จะเป็นค่าสูงสุดสำหรับส่งแพ็คเก็ตออกไปได้ โดยปกติแล้ว MTU จะมีค่าอยู่ที่ 1500 Bytes ( แต่อย่างไรก็ตามค่านี้สามารถเปลี่ยนแปลงได้โดยขึ้นอยู่กับเครือข่ายที่เราเชื่อมต่อด้วย )
ก่อนที่จะลงรายละเอียดของ MTU เราควรเข้าใจกระบวนการห่อหุ้มข้อมูลบน Ethernet Frame และ Packet ของ TCP/IP Protocol ก่อน โดยจากรูปภาพข้างล่างแสดงถึงการส่งข้อมูล TCP/IP Packet ขนาด 1500Bytes ไปยังเครือข่าง Ethernet โดยจะสังเกตได้ว่า ใน Layer 2 จะมีขนาด Frame เพิ่มขึ้นเป็น 1518Bytes
งั้นมาดูถึงปัญหากัน ลองนึกภาพการส่งข้อมูลไปยังปลายทาง หากต้นทางมีการกำหนด MTU เท่ากับ 1500Bytes แต่ระหว่างทางมีขนาด MTU น้อยกว่า 1500Bytes จะเกิดอะไรขึ้น ?
คำตอบ :
Packet ที่ถูกส่งไปจะถูกดรอปโดยอัตโนมัติ เนื่องจาก MTU ต้นทางมีขนาดที่เกินกว่าจะสามารถส่งไประหว่างทางได้ และ Router จะทำการ Set DF bit หรือ Don't flagment เป็น 0 เพื่อให้สามารถแบ่ง Packet ได้ จากนั้นจะทำการ Retransmit TCP ลงเหลือครึ่งนึงจนกว่าจะต่ำกว่าค่า MTU ของต้นทาง แต่เนื่องจากว่า Application บางตัวมีการ Set DF bit = 1 จึงทำให้ Router ไม่สามารถที่จะแบ่ง Segment และเปลี่ยนแปลงค่าของ MTU ได้จึงทำให้ไม่สามารถส่งข้อมูลต่อไปได้นั่นเอง โดยเมื่อ Router ทราบว่า DF bit = 1 จะไม่สามารถส่งข้อมูลไปต่อได้และก็จะส่ง ICMP Type 3 Code 4 ไปให้กับต้นทาง

โดยปกติแล้วจะเจอปัญหานี้กับการใช้งาน IPSec VPN , PPPoE , GRE ซึ่งหากเรามีการตั้งค่า MTU ที่ไม่เหมาะสมอาจทำให้ไม่สามารถส่งข้อมูลต่อไปได้ ยกตัวอย่างเช่น การใช้งาน GRE จะมีการเพิ่ม IP Header เข้าไปทำให้ค่าของ MTU ที่เคยใช้อาจจะไม่พอ จึงจำเป็นต้องมีการปรับค่า MTU ของ IP Packet ให้น้อยลง

ขอขอบคุณบทความดีๆๆจาก :
คุณ Ice Suntisuk IceSuntisukt;Store my Knowledge
https://icesuntisuk.blogspot.com/2016/07/mtu.html
เมื่อไม่กี่วันก่อนผมได้มีโอกาสไปตั้งค่า Router ให้กับลูกค้ารายหนึ่ง โดยลูกค้ารายนี้ได้ทำการเชื่อมต่อ HQ เข้ากับ Dataenter ด้วย Private Link ของ ISP จากนั้น และทำให้ HQ ออก Internet ผ่าน Private Link นี้ จาก Design ดูเหมือนจะไม่มีอะไร แต่พอตื่นเช้าขึ้นมากลับพบปัญหาว่า การเข้าใช้งาน Internet ของ Users ไม่สามารถเข้าใช้งาน HTTP บาง Web site ได้ ซึ่งปัญหาทั้งหมดทั้งมวลเกิดจากการตั้งค่า MTU ของ Router ฉะนั้นในบทความนี้ผมจึงอยากค้นหาความรู้เกี่ยวกับความสัมพันธ์ระหว่าง MTU เพื่อประกอบความเข้าใจและเก็บไว้ในส่วนลึกของหัวใจให้ยาวนานครับ
ว่าด้วยเรื่อง MTU คืออะไร ( Maximum Transmission Unit )
- ก่อนอื่นต้องทำความเข้าใจก่อนนะครับว่าเรากำลังพูดถึงการส่งข้อมูลผ่านเครือข่าย Internet ขนาดใหญ่ โดยเมื่อเรากำลังจะส่งข้อมูลจาก Application Layer ลงไปจะต้องมีการห่อหุ้มข้อมูล (Encapsulated) ก่อนที่จะส่งไปยัง Layer ที่อยู่ล่างๆถัดไป หากสมมติว่า Application ที่เราใช้งานมีขนาดข้อมูลเล็กๆที่ 500Bytes ไปยังปลายทาง ก็จะทำการส่งไปในแพ็คเก็ตเดียวได้โดยไม่ติดปัญหาอะไร แต่หากว่า Application เรามีการส่งข้อมูลที่มีขนาดใหญ่มากๆ ก็จำเป็นต้องทำการหั่นข้อมูลออกเป็นชิ้นย่อยๆหลายๆแพ็คเก็ต เพื่อทยอยส่งไปตามเส้นทางนั่นเอง โดยค่าของ MTU จะเป็นค่าสูงสุดสำหรับส่งแพ็คเก็ตออกไปได้ โดยปกติแล้ว MTU จะมีค่าอยู่ที่ 1500 Bytes ( แต่อย่างไรก็ตามค่านี้สามารถเปลี่ยนแปลงได้โดยขึ้นอยู่กับเครือข่ายที่เราเชื่อมต่อด้วย )
ก่อนที่จะลงรายละเอียดของ MTU เราควรเข้าใจกระบวนการห่อหุ้มข้อมูลบน Ethernet Frame และ Packet ของ TCP/IP Protocol ก่อน โดยจากรูปภาพข้างล่างแสดงถึงการส่งข้อมูล TCP/IP Packet ขนาด 1500Bytes ไปยังเครือข่าง Ethernet โดยจะสังเกตได้ว่า ใน Layer 2 จะมีขนาด Frame เพิ่มขึ้นเป็น 1518Bytes

โดย MSS (Maximum segment size) คือค่า parameter ระบุขนาดข้อมูลสูงสุดที่ server ทั้งสองฝ่ายรับรู้ เพื่อป้องกันไม่ให้ packet มีขนาดมากเกินว่าค่า MTU ใน Layer 2 ซึ่งถ้าเกินจะทำให้ packet โดน drop หายไปกลางทาง traceroute ก็ไม่เห็นว่า loss (เพราะตอน traceroute ไม่ได้ใช้ packet ขนาดเท่ากับที่ loss) ขนาดสูงสุดของ IP Packet จะอยู่ที่ 65535 Bytes
งั้นมาดูถึงปัญหากัน ลองนึกภาพการส่งข้อมูลไปยังปลายทาง หากต้นทางมีการกำหนด MTU เท่ากับ 1500Bytes แต่ระหว่างทางมีขนาด MTU น้อยกว่า 1500Bytes จะเกิดอะไรขึ้น ?
Server <-----MTU9000-----> Router <-----MTU1500-----> Client
คำตอบ :
Packet ที่ถูกส่งไปจะถูกดรอปโดยอัตโนมัติ เนื่องจาก MTU ต้นทางมีขนาดที่เกินกว่าจะสามารถส่งไประหว่างทางได้ และ Router จะทำการ Set DF bit หรือ Don't flagment เป็น 0 เพื่อให้สามารถแบ่ง Packet ได้ จากนั้นจะทำการ Retransmit TCP ลงเหลือครึ่งนึงจนกว่าจะต่ำกว่าค่า MTU ของต้นทาง แต่เนื่องจากว่า Application บางตัวมีการ Set DF bit = 1 จึงทำให้ Router ไม่สามารถที่จะแบ่ง Segment และเปลี่ยนแปลงค่าของ MTU ได้จึงทำให้ไม่สามารถส่งข้อมูลต่อไปได้นั่นเอง โดยเมื่อ Router ทราบว่า DF bit = 1 จะไม่สามารถส่งข้อมูลไปต่อได้และก็จะส่ง ICMP Type 3 Code 4 ไปให้กับต้นทาง

โดยปกติแล้วจะเจอปัญหานี้กับการใช้งาน IPSec VPN , PPPoE , GRE ซึ่งหากเรามีการตั้งค่า MTU ที่ไม่เหมาะสมอาจทำให้ไม่สามารถส่งข้อมูลต่อไปได้ ยกตัวอย่างเช่น การใช้งาน GRE จะมีการเพิ่ม IP Header เข้าไปทำให้ค่าของ MTU ที่เคยใช้อาจจะไม่พอ จึงจำเป็นต้องมีการปรับค่า MTU ของ IP Packet ให้น้อยลง

Reference :
ขอขอบคุณบทความดีๆๆจาก :
คุณ Ice Suntisuk IceSuntisukt;Store my Knowledge
https://icesuntisuk.blogspot.com/2016/07/mtu.html
ความคิดเห็น
แสดงความคิดเห็น