ขนาดแพ็คเก็ต UDP ที่ปลอดภัยที่ใหญ่ที่สุดบนอินเทอร์เน็ตคืออะไร


201

ฉันได้อ่านบทความเกี่ยวกับขนาดแพ็คเก็ต UDP แล้ว แต่ไม่สามารถสรุปได้ว่าอะไรถูกต้อง

จำนวนบริการ จำกัด แพ็คเก็ต UDP ที่ใหญ่ที่สุดที่ 512 ไบต์ (เช่น dns)

รับMTUขั้นต่ำบนอินเทอร์เน็ตคือ 576 และขนาดของส่วนหัว IPv4 คือ 20 ไบต์และ UDP ส่วนหัว 8 ไบต์ ทำให้มีข้อมูล 548 ไบต์สำหรับข้อมูลผู้ใช้

ฉันจะสามารถใช้แพ็คเก็ตได้ถึงขนาด 548 โดยไม่มีการกระจายตัวของแพ็กเก็ตหรือไม่ หรือมีบางสิ่งที่ผู้สร้าง DNS รู้และทำไมพวกเขาจึง จำกัด ไว้ที่ 512 ไบต์

ฉันสามารถสูงกว่า 548 ไบต์ได้อย่างปลอดภัยหรือไม่



10
มันเป็นคำถามที่แตกต่างกันเล็กน้อย ฉันถามว่าแพ็คเก็ตที่ใหญ่ที่สุดที่ฉันสามารถส่งผ่านทางอินเทอร์เน็ตคืออะไร (โดยไม่มีความรู้เกี่ยวกับเครือข่ายอื่นหรือการตรวจสอบ) ซึ่งจะไม่มีการแยกส่วน ขนาดความปลอดภัยสูงสุดเป็นสิ่งสำคัญที่จะทำงานในทุกสิ่งโดยไม่ต้องกังวลเกี่ยวกับการตรวจสอบการเชื่อมต่อ
— KM

2
คุณไม่สามารถกำจัดความเป็นไปได้ของการแตกแฟรกเมนต์ แต่สิ่งนี้ไม่ได้ทำให้สิ่งที่ปลอดภัยน้อยลง หากมีการแตกแฟรกเมนต์มันจะเหมือนกับว่าแพ็กเก็ตทั้งหมดถูกทิ้งซึ่งเกิดขึ้นกับ UDP ต่อไป จะไม่ปลอดภัยหากแพ็กเก็ตมีขนาดเกินขนาดขั้นต่ำที่เราเตอร์จำเป็นต้องให้การสนับสนุนและไม่รับประกันว่าจะสามารถส่งมอบได้ (เทียบกับที่รับประกันว่าจะส่งมอบ) นี่คือที่มาของตัวเลข 512 ไบต์
— Beejor

คำตอบ:


129

เป็นความจริงที่ส่วนหัว IPv4 ทั่วไปคือ 20 ไบต์และส่วนหัว UDP คือ 8 ไบต์ อย่างไรก็ตามมีความเป็นไปได้ที่จะรวมตัวเลือก IP ซึ่งสามารถเพิ่มขนาดของส่วนหัว IP ได้มากถึง 60 ไบต์ นอกจากนี้บางครั้งก็เป็นสิ่งจำเป็นสำหรับโหนดระดับกลางในการห่อหุ้มดาต้าแกรมในโปรโตคอลอื่นเช่นIPsec (ใช้สำหรับ VPN และสิ่งที่คล้ายกัน) เพื่อกำหนดเส้นทางแพ็กเก็ตไปยังปลายทาง ดังนั้นหากคุณไม่รู้จักMTUในเส้นทางเครือข่ายของคุณโดยเฉพาะคุณควรเว้นระยะห่างพอสมควรสำหรับข้อมูลส่วนหัวอื่น ๆ ที่คุณอาจไม่คาดคิด โดยทั่วไปแล้วน้ำหนักบรรทุก UDP ขนาด 512 ไบต์จะถูกพิจารณาว่าทำได้แม้ว่าจะไม่ได้มีที่ว่างเพียงพอสำหรับส่วนหัว IP ที่มีขนาดสูงสุด


36
เพื่อให้ชัดเจน: การที่มีขนาดเล็กเพื่อหลีกเลี่ยงการแตกแฟรกเมนต์ไม่ได้ทำให้การส่งแพ็คเก็ต "ปลอดภัย" ยังคงมีความเป็นไปได้ไม่ จำกัด ที่ทำให้การส่งไม่น่าเชื่อถือเช่นสุนัขกินสายเคเบิลเครือข่ายของฉัน ที่กล่าวว่า; การที่มีแฟรกเมนต์น้อยลงจะทำให้การส่ง "ปลอดภัย" เพราะถ้ามีมากกว่าหนึ่งรายการและรายการใดรายการหนึ่งไม่เคยทำ - แพ็กเก็ตทั้งหมด (ดาตาแกรม) จะถูกส่งโดย UDP
— markmnl

3
สำหรับจุดประสงค์ของคำถามหนึ่งจะเข้าใจว่าใช้คำจำกัดความโปสเตอร์ของ 'ปลอดภัย' ไม่ใช่คำจำกัดความบางอย่างในหนังสือมาตรฐานบางเล่มที่พวกเขาไม่เคยเห็น
— Astara

เป็นที่ทราบกันหรือไม่ว่าเราเตอร์ในโลกแห่งความจริงแล้วปล่อยแพ็กเก็ต UDP แทนการแยกส่วนพวกมัน
— user253751

60

ขีด จำกัด ทางทฤษฎี (บน Windows) สำหรับขนาดสูงสุดของแพ็กเก็ต UDP คือ 65507 ไบต์ เอกสารนี้มีไว้ที่นี่ :

ขนาดข้อความ UDP สูงสุดที่ถูกต้องคือ 65507 ตามที่กำหนดโดยสูตรต่อไปนี้: 0xffff - (sizeof (IP Header) + sizeof (UDP Header)) = 65535- (20 + 8) = 65507

ดังที่กล่าวไว้โปรโตคอลส่วนใหญ่จะ จำกัด ขนาดที่เล็กกว่ามาก - โดยปกติจะเป็น 512 หรือ 8192 เป็นครั้งคราวคุณสามารถสูงกว่า 548 ได้อย่างปลอดภัยหากคุณอยู่ในเครือข่ายที่เชื่อถือได้ - แต่ถ้าคุณออกอากาศผ่านอินเทอร์เน็ตในวงกว้าง คุณไปได้มากขึ้นคุณจะพบกับปัญหาการส่งแพ็กเก็ตและการสูญเสีย


39
ลิงค์ Microsoft ไม่ใช่ข้อมูลอ้างอิงเชิงบรรทัดฐาน RFCs เป็นข้อมูลอ้างอิงเชิงบรรทัดฐาน และสิ่งที่คุณเสนอมานั้นใช้กับ IPv4 เท่านั้น
— มาร์ควิสแห่ง Lorne

2
เพียงเพราะ MS อนุญาตไม่ได้หมายความว่าเป็นความคิดที่ดีเสมอเนื่องจากเราเตอร์ระดับกลาง ฯลฯ อาจถูกบังคับให้แยกส่วนขนาดแพ็คเก็ตที่ใหญ่ขึ้น (ดังที่คุณกล่าวไว้)
— rogerdpack

1
@EJP พวกเขาไม่ได้อธิบายอย่างชัดเจนในลิงก์ Microsoft แต่ดูเหมือนจะเป็นผลสืบเนื่องมาจากความจำเป็นของ IPv4: ฟิลด์ความยาวรวมของ IPv4 คือ 16 บิตและค่านั้นต้องรวมความยาวของส่วนหัว IP และความยาวของ ส่วนหัว UDP
— jtpereyda

@ jtpereyda ฉันรู้อย่างเต็มที่ว่า ประเด็นของฉันคือสิ่งที่ฉันได้กล่าวไปแล้ว: คุณควรอ้างอิงการอ้างอิงเชิงบรรทัดที่มีอยู่
— มาร์ควิสแห่ง Lorne

ฉันไม่คิดว่าขนาดแพ็กเก็ต UDP สูงสุดจะเท่ากับ 65,507 ไบต์เนื่องจากการ์ด wifi ของฉัน (IEEE 802.3) สามารถทำได้เพียง 1,500 MTU และเฟรมจัมโบ้มีขนาดเพียง 9k ไบต์
— Christian Stewart

52

เพย์โหลด UDP ที่ปลอดภัยสูงสุดคือ 508 ไบต์ นี่คือขนาดแพ็คเก็ต 576 ลบส่วนหัว IP สูงสุด 60 ไบต์และส่วนหัว UDP 8 ไบต์ น้ำหนักบรรทุก UDP ใด ๆ ที่ขนาดนี้หรือเล็กกว่านั้นรับประกันว่าจะสามารถส่งมอบผ่าน IP (แม้ว่าจะไม่รับประกันว่าจะส่งมอบ) ทุกสิ่งที่ใหญ่กว่านั้นอนุญาตให้เราเตอร์ตกหล่นได้ทันทีไม่ว่าด้วยเหตุผลใดก็ตาม ยกเว้นบนเส้นทาง IPv6 เท่านั้นโดยที่น้ำหนักบรรทุกสูงสุดคือ 1,212 ไบต์ ดังที่คนอื่น ๆ ได้กล่าวถึงสามารถเพิ่มส่วนหัวของโปรโตคอลเพิ่มเติมในบางสถานการณ์ อาจต้องการค่าอนุรักษ์นิยมมากกว่าประมาณ 300-400 ไบต์แทน

แพ็กเก็ต UDP ใด ๆ อาจมีการแยกส่วน แต่นี่ไม่สำคัญเกินไปเนื่องจากการสูญเสียส่วนมีผลเช่นเดียวกับการสูญเสียแพ็กเก็ตที่ไม่มีการจัดเรียง: แพ็กเก็ตทั้งหมดจะถูกทิ้ง ด้วย UDP สิ่งนี้จะเกิดขึ้นอย่างใดอย่างหนึ่ง

ที่น่าสนใจขนาดแพ็คเก็ตทางทฤษฎีสูงสุดคือประมาณ 30 MB (1,500 ethernet MTU - 60 IP header x 65,536 จำนวนแฟรกเมนต์สูงสุด) แม้ว่าความเป็นไปได้ที่จะเกิดขึ้นจะน้อยมาก

แหล่งที่มา: RFC 791, RFC 2460


2
ตามค่าเริ่มต้นแพ็กเก็ต UDP ใด ๆ จะถือเป็น "_U_nreliable" ขนาดแพ็คเก็ต UDP ที่ปลอดภัยเท่านั้นที่คุณคาดหวังว่าจะได้รับคือ 1 แพ็คเก็ตที่ไม่มีการจัดเรียง หากคุณต้องการแพ็กเก็ต "ปลอดภัย" ให้ใช้โปรโตคอลแพ็คเก็ตที่ด้านบนของ TCP
— Astara

26
@Astara True โดยธรรมชาติ UDP ไม่น่าเชื่อถือ แต่คำถามคือแพ็คเก็ตขนาดที่กำหนดนั้นรับประกันว่าจะสามารถส่งมอบได้หรือไม่และไม่รับประกันว่าจะส่งมอบหรือไม่ แพ็คเก็ตที่มีขนาดที่แน่นอนสามารถทิ้ง (และ) ทิ้งโดยเราเตอร์ไม่ว่าด้วยเหตุผลใดก็ตามในขณะที่ขนาดเล็กจะต้องพยายามอย่างดีที่สุดจากเราเตอร์ทั้งหมดตามมาตรฐานอุตสาหกรรม ดังนั้น "ปลอดภัย" ในกรณีนี้หมายถึง "รถของฉันจะพอดีใต้สะพาน" หรือไม่ "รถของฉันจะติดอยู่ในการจราจร"
— Beejor

1
ฉันขอแนะนำให้หยุดทำซ้ำสิ่งที่คนที่แต่งตัวประหลาดสุ่มพูดและตรวจสอบข้อเท็จจริงเพราะ UDP นั้นค่อนข้างน่าเชื่อถือ BTW ฉันมีแพ็กเก็ตที่ปลอดภัยที่ด้านบนของ UDP โดยไม่มีค่าใช้จ่ายที่ไม่จำเป็นของ TCP openmymind.net/How-Unreliable-Is-UDP
— Pablo Ariel

5
UDP ไม่ใช่ "ไม่น่าเชื่อถือ" เนื่องจากจำนวนแพ็กเก็ตที่ถูกทิ้ง แต่เนื่องจากแพ็คเก็ตสามารถถูกทิ้ง (และ) ได้ คุณไม่สามารถ "พึ่งพา" ในการส่งแพ็คเก็ตคำสั่งหรือการยืนยัน ข้อมูลมีความเปราะบางและมันก็เหมือนกับการบอกว่าการบังคับเลี้ยวรถที่ใช้งานได้ 99% และ 89% ในทิศทางที่ถูกต้องน่าเชื่อถือ ไม่ใช่ว่า UDP นั้นยอดเยี่ยมสำหรับหลาย ๆ อย่างเพียงแค่ให้คุณเขียน "TCP" บนเวอร์ชันของมันเอง นี่คือกรณีของโลกแห่งความจริงที่น่าสนใจในโลกของเกม dev (แม้ว่าจะล้าสมัยไปแล้ว): gamasutra.com/view/feature/131781
— Beejor

@Beejor คุณอยู่ในเส้นทางที่ถูกต้อง แต่ "ต้องให้คุณเขียน" TCP "บนยอดของรุ่น" โดยทั่วไปแล้วมันผิดอย่างโจ๋งครึ่ม UDP นั้นยอดเยี่ยมสำหรับการออกอากาศและเหมาะสำหรับการส่งข้อมูล 'ที่ไม่สำคัญ' อย่างรวดเร็ว (ในส่วนที่เกี่ยวกับเกม) คุณสามารถค้นหาเซิร์ฟเวอร์ / บริการ (LAN) โดยใช้ UDP และใช้ UDP เพื่อส่งตำแหน่งผู้เล่นได้อย่างรวดเร็ว หากหนึ่งแพ็คเก็ตจะถูกทิ้ง; คุณไม่สนใจเพราะแพ็กเก็ตถัดไปจะมีตำแหน่งที่เป็นปัจจุบันมากขึ้นของผู้เล่นอื่น TCP สามารถมีแพ็คเก็ต "ล้าสมัย" ได้มีค่าใช้จ่ายและไม่ได้ทำการเชื่อมต่อแบบหนึ่งต่อหลายคน ในบางกรณี UDP อาจใช้งานได้มากกว่า
— พอล

46

576 เป็นขนาดบัฟเฟอร์สูงสุดของ reassembly ขั้นต่ำกล่าวคือการติดตั้งแต่ละครั้งจะต้องสามารถรวมกันของแพ็กเก็ตที่มีขนาดอย่างน้อยที่สุด ดูIETF RFC 1122สำหรับรายละเอียด


2
ถ้าหากคุณมีเครือข่ายที่ไม่มี IPv6 ถ้ามันมี IPv6 ให้ใช้ขนาดแพ็กเก็ตสูงสุดของ IPv6-headers จากนั้นลบส่วนหัว encapsulation สำหรับทำ IPv4 ผ่าน IPv6 ;-)
— Astara

@Astara ใน IPv6 การส่งแฟรกเมนต์เสร็จสิ้นโดยผู้ส่งดังนั้นจึงไม่มีปัญหากับเราเตอร์กลางที่ไม่ยอมหลบหลีก และถ้าผู้รับไม่ใช่ขนาดฝังตัวที่ จำกัด หน่วยความจำก็อาจจะรวมตัวกันของแพ็กเก็ตได้สูงสุด 64kB เป็นอย่างน้อย
— user253751

@ user253751 ไม่ใช่เพียงแค่เราเตอร์ที่ไม่สามารถทำงานร่วมกันได้ซึ่งสามารถแยกส่วนได้ มี Path MTU Discovery แต่ถึงกระนั้นก็ยังไม่เพียงพอที่จะกำจัดการแยกส่วนอย่างสมบูรณ์
— dstromberg

@dstromberg เราเตอร์ IPv6 ในสถานการณ์ใดบ้างที่ได้รับอนุญาตให้แยกส่วนดาตาแกรม
— user253751

@ user253751 ฉันยังมี IPv6 ไม่มาก แต่ต่อไปนี้เป็นตัวอย่าง: ลองนึกภาพเครือข่าย IPv6 ที่ส่ง jumbograms (> 65536 bytes) ไปยังเครือข่าย IPv6 อื่นที่รองรับ jumbograms ด้วย นอกจากนี้สมมติว่า Path MTU Discovery บอกว่าควรสนับสนุน jumbograms เหล่านั้นโดยไม่มีการแยกส่วน แต่จากนั้นเราเตอร์ก็จะสิ้นเปลืองพลังงานและส่วนหนึ่งของเส้นทางเครือข่ายจะถูกแทนที่ด้วยอุปกรณ์ที่ไม่ได้กำหนดค่าสำหรับ jumbograms
— dstromberg

14

บทความนี้อธิบายหน่วยการส่งข้อมูลสูงสุด (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unit มันระบุว่าโฮสต์ IP จะต้องสามารถประมวลผล 576 ไบต์สำหรับแพ็คเก็ต IP อย่างไรก็ตามมันตั้งข้อสังเกตว่า minumum คือ 68 RFC 791: "ทุกโมดูลอินเทอร์เน็ตจะต้องสามารถส่งดาตาแกรมได้ 68 octets โดยไม่มีการแยกส่วนเพิ่มเติมเนื่องจากส่วนหัวของอินเทอร์เน็ตอาจสูงถึง 60 octets และแฟรกเมนต์ขั้นต่ำคือ 8 octets ."

ดังนั้นขนาดแพ็กเก็ตที่ปลอดภัย 508 = 576 - 60 (ส่วนหัว IP) - 8 (ส่วนหัว udp) มีความสมเหตุสมผล

ดังที่กล่าวไว้โดย user607811 การแยกส่วนของเลเยอร์เครือข่ายอื่นจะต้องประกอบขึ้นใหม่ https://tools.ietf.org/html/rfc1122#page-56 3.3.2 การประกอบใหม่เลเยอร์ IP ต้องใช้การรวบรวม IP ดาตาแกรมอีกครั้ง เรากำหนดขนาดดาตาแกรมที่ใหญ่ที่สุดที่สามารถประกอบขึ้นใหม่ได้โดย EMTU_R ("MTU ที่มีประสิทธิภาพเพื่อรับ") บางครั้งเรียกว่า "ขนาดบัฟเฟอร์ประกอบใหม่" EMTU_R ต้องมากกว่าหรือเท่ากับ 576


11

ขนาดบัฟเฟอร์การรวมกันใหม่ขั้นต่ำของ IPv4 คือ 576, IPv6 มีไว้ที่ 1500 ลบขนาดส่วนหัวออกจากที่นี่ ดูการเขียนโปรแกรมเครือข่าย UNIX โดย W. Richard Stevens :)


1
ขั้นต่ำแน่นอน ขอบคุณที่จำได้ ไม่รู้ว่าไม่มีใครสังเกตเห็นความผิดพลาดในช่วงหลายปีที่ผ่านมา
— Nikolai Fetissov

1
ในขณะที่ IPv6 อาจมีบัฟเฟอร์การประกอบใหม่ขั้นต่ำที่ 1,500 แต่แพ็คเก็ต IPv6 ไม่ได้รับอนุญาตให้แยกส่วนและ IPv6 ขั้นต่ำของ MT6 คือ 1280 อุปกรณ์ปลายทางไม่ควรรวมกันเป็นแพ็กเก็ต IPv6 ที่แยกส่วน
— Ron Maupin

1
@RonMaupin แพ็คเก็ต IPv6 สามารถแยกส่วนโดยจุดสิ้นสุด ไม่ใช่แค่เราเตอร์ในระหว่าง
— Navin

3
@Navin, ไม่ใช่, แพ็คเก็ต IPv6 จะไม่ถูกแยกส่วนข้อมูลจะต้องถูกแยกส่วนก่อนที่จะถูกแพ็คเก็ตเป็นแพ็คเก็ต IPv6 แต่ตัวแพ็กเก็ตเองไม่ได้แยกส่วน มีความแตกต่าง ซึ่งแตกต่างจากส่วนหัวแพ็คเก็ต IPv4 ซึ่งมีเขตข้อมูลที่จะจัดการกับการกระจายตัวของส่วนหัวแพ็คเก็ต IPv6 ไม่มีอะไรที่จะจัดการกับการกระจายตัว ส่วนหัวของแพ็คเก็ต IPv6 นั้นง่ายกว่าหัวต่อแพ็คเก็ต IPv4 มาก
— Ron Maupin

6

512 เป็นทางออกที่ดีที่สุดของคุณ มันใช้ที่อื่นและเป็นเลขคู่ที่ดี (ครึ่งหนึ่งของ 1024)


6

เนื่องจาก IPV6 มีขนาด 1500 ฉันจะยืนยันว่าผู้ให้บริการจะไม่ให้เส้นทางที่แยกต่างหากสำหรับ IPV4 และ IPV6 (ทั้งคู่เป็น IP ที่มีประเภทแตกต่างกัน) บังคับให้พวกเขาไปยังอุปกรณ์สำหรับ ipv4 ที่จะเก่าซ้ำซ้อนราคาแพงกว่า และเชื่อถือได้น้อยกว่า มันไม่สมเหตุสมผลเลย นอกจากนี้การทำเช่นนั้นอาจได้รับการพิจารณาว่าให้การรักษาแบบพิเศษสำหรับการรับส่งข้อมูลบางอย่าง - ไม่ไม่มีภายใต้กฎที่พวกเขาอาจไม่สนใจมากนัก (เว้นแต่พวกเขาจะถูกจับ)

ดังนั้น 1472 จึงน่าจะปลอดภัยสำหรับการใช้งานภายนอก (แต่นั่นไม่ได้หมายความว่าแอพอย่าง DNS ที่ไม่รู้เกี่ยวกับ EDNS จะยอมรับมัน) และถ้าคุณกำลังพูดถึงอวนภายในคุณน่าจะรู้โครงร่างเครือข่ายของคุณมากกว่า ขนาดแพ็คเก็ตจัมโบ้ใช้สำหรับแพ็คเก็ตที่ไม่มีการแยกส่วนดังนั้นสำหรับ 4096 - 4068 ไบต์และสำหรับการ์ดของ Intel ที่มีบัฟเฟอร์ 9014 ไบต์ขนาดแพ็กเกจของ ... รอ ... 8086 ไบต์จะเป็นความบังเอิญสูงสุด ... ขำ

**** UPDATE ****

คำตอบที่หลากหลายให้ค่าสูงสุดที่อนุญาตโดยผู้ขาย 1 SW หรือคำตอบต่าง ๆ ที่สมมติว่ามีการห่อหุ้ม ผู้ใช้ไม่ได้ขอค่าต่ำสุดเท่าที่จะเป็นไปได้ (เช่น "0" สำหรับขนาด UDP ที่ปลอดภัย) แต่เป็นขนาดแพ็คเก็ตที่ปลอดภัยที่สุด

ค่าการห่อหุ้มสำหรับเลเยอร์ต่างๆสามารถรวมได้หลายครั้ง ตั้งแต่เมื่อคุณหุ้มห่อหุ้มสตรีม - ไม่มีอะไรต้องห้ามพูดเลเยอร์ VPN ด้านล่างนั้นและทำซ้ำชั้นห่อหุ้มอย่างสมบูรณ์เหนือชั้นดังกล่าว

เนื่องจากคำถามเกี่ยวกับค่าความปลอดภัยสูงสุดฉันจึงสมมติว่าพวกเขากำลังพูดถึงค่าความปลอดภัยสูงสุดสำหรับแพ็กเก็ต UDP ที่สามารถรับได้ เนื่องจากไม่มีการรับประกันแพ็คเก็ต UDP หากคุณได้รับแพ็คเก็ต UDP ขนาดที่ปลอดภัยที่สุดจะเป็น 1 แพ็คเก็ตผ่าน IPv4 หรือ 1472 ไบต์

หมายเหตุ - หากคุณใช้ IPv6 ขนาดสูงสุดจะเป็น 1452 ไบต์เนื่องจากขนาดส่วนหัวของ IPv6 คือ 40 ไบต์เทียบกับขนาด 20 ไบต์ของ IPv4 (และทั้งสองวิธีหนึ่งต้องยังคงอนุญาตให้มี 8 ไบต์สำหรับส่วนหัว UDP)


1
คุณคำนวณ 1472 อย่างไร อีเธอร์เน็ตมี MTU เป็น 1500 นั่นคือสิ่งที่คุณอ้างถึง
— rogerdpack

4
@rogerdpack ฉันคิดว่าเขาหมายความว่าเนื่องจาก IPv4 และ IPv6 มีแนวโน้มที่จะแบ่งปันโครงสร้างพื้นฐานจำนวนมากและ IPv6 กำลังได้รับความนิยมค่อนข้างควรปลอดภัยที่จะสมมติขีด จำกัด IPv6 (เช่น 1500) อย่างไรก็ตามเหตุผลนี้ถูกต้องอย่างไรก็ตามฉันไม่สามารถบอกได้
— โทมัส

2
1,500 ต้องได้รับการสนับสนุนโดยส่วนประกอบที่เข้ากันได้กับ IPv6 ในเครือข่าย "เครือข่าย" - หากใช้ IPv4 ซึ่งสามารถเดินทางผ่านเครือข่ายที่รองรับ IPv6 (แม้ว่าการย้อนกลับจะไม่เป็นจริง) ดังนั้นเนื่องจากขนาดส่วนหัวของ IPv4 คือ 20 ไบต์และ ขนาดส่วนหัวของ UDP คือ 8 ไบต์ซึ่งจะทำให้ 1500-20-8 = 1472 เป็นขนาดที่ปลอดภัยสูงสุด (เนื่องจาก IPv6 ไม่อนุญาตให้มีการแยกส่วน) หมายเหตุ - ถ้าผู้คนเพิ่มเลเยอร์ของการห่อหุ้มที่เพียงพอเพียงพออาจไม่มีที่ว่างสำหรับ DATA เมื่อคุณขอ MAX จะไม่มีการใช้งานการห่อหุ้มหลายชั้น
— Astara

" 1,500 จะต้องได้รับการสนับสนุนโดยส่วนประกอบที่เข้ากันได้กับ IPv6 ในเครือข่ายเครือข่าย " ไม่ขั้นต่ำของ IPv6 MTU คือ 1280 อีเธอร์เน็ต MTU คือ 1500
— Ron Maupin

@RonMaupin - Q ต้นฉบับเป็นขนาดแพ็คเก็ต UDP ที่ปลอดภัยที่สุดไม่ใช่ MTU ดู RFC2460 เช่นเดียวกับการกล่าวถึง MTU ที่ 1280 อ็อกเท็ตมันระบุว่า: โหนดจะต้องสามารถรับแพ็คเก็ตที่มีการแยกส่วนซึ่งเมื่อประกอบใหม่ได้มากถึง 1,500 octets การจัดการแพ็คเก็ตที่มีขนาดใหญ่กว่า 1500 เป็นทางเลือก
— Astara

6

ฉันอ่านคำตอบที่ดีที่นี่; อย่างไรก็ตามมีข้อผิดพลาดเล็กน้อย บางคนตอบว่าฟิลด์ความยาวข้อความในส่วนหัวของ UDP มีค่าสูงสุด 65535 (0xFFFF) นี่เป็นความจริงทางเทคนิค บางคนตอบว่าค่าสูงสุดที่แท้จริงคือ (65535 - IPHL - UDPHL = 65507) ข้อผิดพลาดคือฟิลด์ความยาวข้อความในส่วนหัวของ UDP รวมถึงส่วนของข้อมูลทั้งหมด (เลเยอร์ 5-7) รวมถึงความยาวของส่วนหัว UDP (8 ไบต์) สิ่งนี้หมายความว่าถ้าฟิลด์ความยาวข้อความคือ 200 ไบต์ (0x00C8) ส่วนของข้อมูลจะเป็นจริง 192 ไบต์ (0x00C0)

สิ่งที่ยากและรวดเร็วคือขนาดสูงสุดของดาตาแกรม IP คือ 65535 ไบต์ หมายเลขนี้มาถึงยอดรวมของส่วนหัว L3 และ L4 รวมถึงส่วนของข้อมูลเลเยอร์ 5-7 IP Header + UDP Header + Layers 5-7 = 65535 (สูงสุด)

คำตอบที่ถูกต้องที่สุดสำหรับขนาดสูงสุดของดาตาแกรม UDP คือ 65515 ไบต์ (0xFFEB) เนื่องจากดาตาแกรม UDP มีส่วนหัว UDP คำตอบที่ถูกต้องที่สุดสำหรับขนาดสูงสุดของเพย์โหลด UDP คือ 65507 ไบต์เนื่องจากเพย์โหลด UDP ไม่รวมส่วนหัว UDP


1
คุณไม่ได้ตอบคำถาม ผู้ถามต้องการทราบว่ามีขนาดใหญ่ที่สุดเท่าที่จะสามารถใช้เพื่อหลีกเลี่ยงการแยกส่วนของแพ็คเก็ตได้
— Astara

0

ฉันกลัวว่าฉันจะมีปฏิกิริยาไม่พอใจ แต่อย่างไรก็ตามเพื่อชี้แจงให้ฉันถ้าฉันผิดหรือผู้ที่เห็นคำถามนี้และมีความสนใจในคำตอบ:

ความเข้าใจของฉันเกี่ยวกับhttps://tools.ietf.org/html/rfc1122ซึ่งมีสถานะเป็น "ข้อกำหนดอย่างเป็นทางการ" และเป็นข้อมูลอ้างอิงสำหรับคำศัพท์ที่ใช้ในคำถามนี้และไม่ถูกแทนที่โดย RFC อื่นหรือมีข้อผิดพลาด ต่อไปนี้:

ในทางทฤษฎีคือ ตามข้อกำหนดที่เขียนไว้ UDP ที่ได้รับจากhttps://tools.ietf.org/html/rfc1122#section-4จะไม่มี "ขนาดแพ็คเก็ต" ดังนั้นคำตอบอาจเป็น "ไม่ จำกัด "

ในทางปฏิบัติซึ่งเป็นสิ่งที่คำถามนี้น่าจะหา (และสามารถอัปเดตสำหรับเทคโนโลยีที่ใช้งานจริงในปัจจุบัน) สิ่งนี้อาจแตกต่างกันไปและฉันไม่รู้

ฉันขอโทษถ้าฉันทำให้เกิดอารมณ์เสีย https://tools.ietf.org/html/rfc1122#page-8ชุด "Internet Protocol Suite" และ "สถาปัตยกรรมเชิงสมมติฐาน" ไม่ชัดเจนสำหรับฉัน "สมมติฐาน" ที่ฉันทำอยู่บนพื้นฐานของสิ่งที่ฉันได้ยินว่าชั้นจะแยกจากกัน กล่าวคือ เลเยอร์ UDP นั้นไม่จำเป็นต้องกังวลกับเลเยอร์ IP ที่อยู่ (และเลเยอร์ IP จะมีสิ่งต่าง ๆ เช่น Reassembly, EMTU_R, Fragmentation และ MMS_R ( https://tools.ietf.org/html/rfc1122#page-) 56 ))


1
ส่วนหัวของ UDP มีเขตข้อมูลความยาวของดาตาแกรมที่เป็น 16 บิตซึ่งหมายความว่า UDP ที่ใหญ่ที่สุดทางทฤษฎีคือ 65,535 แต่ไม่สามารถเข้าถึงได้เนื่องจาก UDP นั้นถูกห่อหุ้มอยู่ภายในแพ็กเก็ต IP ซึ่งมีความยาวสูงสุดทางทฤษฎีโดยรวมเท่ากับ 65,535 เหมือนกัน) แต่คุณต้องลบส่วนหัว IP และ UDP จากขนาดนั้นเพื่อคำนวณขนาดข้อมูลสูงสุดทางทฤษฎี
— Ron Maupin

ฉันถามเรื่องนี้เมื่อนานมาแล้ว แต่มันกำลังมองหาคำตอบอย่างจริงจัง (สิ่งที่ใช้งานได้จริงในชีวิตจริง) มากกว่าที่จะพูดในสเปค / หรือในทางทฤษฎี ฉันต้องการแพ็คเก็ตแบบ a ถึง b โดยไม่ต้องมีการแยกส่วนมันเป็นปัญหาเครือข่ายเกมแบบเรียลไทม์ - ฉันคิดว่ามีโซลูชั่นมากมายที่พัฒนาโดยคนที่ฉลาดกว่าตอนนี้ :)
— KM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.