ขนาดแพ็คเก็ต 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.