ต้นไม้ Aguri คืออะไร


19

จะผ่านรายการข่าวแฮ็กเกอร์เก่าบางอย่างฉันเจอโพสต์จากผู้ใช้ที่กล่าวว่า

ต้นไม้ Aguri ซึ่งแต่งงานกับ Radix Trie ขนาดเท่าขอบ (เช่นที่คุณใช้ในตารางการจัดเส้นทางซอฟต์แวร์) ไปยังรายการ LRU และสังเคราะห์มวลรวมอัตโนมัติ (เช่น 10.0.0.0/16 จาก 1,000 การสังเกตในทุก IP) จากรูปแบบ ของการแทรก พวกเขาเป็นที่รู้จักกันดีในการวิเคราะห์ทราฟฟิก แต่เราก็ใช้มันในการวิเคราะห์หน่วยความจำรันไทม์เช่นกัน

~ tptacek

ดังนั้นฉันจึงตัดสินใจค้นหามัน

  • การค้นหาโดย Google อย่างรวดเร็วทำให้ฉันไปที่ไดรเวอร์ F1
  • การค้นหาวิกิพีเดียนำไปสู่วรรณะทางการเกษตรในอินเดียและบางรายการจากญี่ปุ่น
  • Stack Overflow พบผล 0 รายการ/programming//search?q=aguri site:stackoverflow.com/questions aguri

ในที่สุดฉันก็เชื่อมโยงมันกลับไปยังผู้ใช้แล้วเห็นว่าเขามีลิงค์ในบล็อกของเขา

http://www.matasano.com/log/1009/aguri-coolest-data-structure-youve-never-heard-of/

แต่มันตายไปแล้ว

ดังนั้นโครงสร้างข้อมูล Aguri นี้คืออะไรและถ้าเป็นโครงสร้างข้อมูลจริงเหตุใดจึงไม่มีการบันทึกไว้ที่อื่น

คำตอบ:


15

Aguriเป็นเครื่องมือสร้างข้อมูลจราจรที่ใช้ต้นไม้นำหน้า บทความที่สมบูรณ์อยู่บนหน้าว่า ในระยะสั้นไม่มีโครงสร้างข้อมูลเช่น "Aguri Tree" เว้นแต่คุณจะนับต้นไม้คำนำหน้าที่ใช้ในระบบนั้นเป็นชนิดย่อยที่เป็นเอกลักษณ์ของตัวเอง


9

มีน้อยมากที่ตายบนอินเทอร์เน็ต Archive.org เพิ่งเกิดขึ้นจะมีหนึ่งภาพเพียงภาพเดียวของบล็อกโพสต์ว่าตั้งแต่เมื่อมันเป็นสด คัดลอกที่นี่:

วิทยาศาสตร์คอมพิวเตอร์เพื่อการแก้ไขบางอย่างสำหรับผู้ตรวจสอบ PCI ในกลุ่มผู้ชมของฉัน

ฉันมอบอาร์เรย์ของจำนวนเต็มแบบสุ่มให้คุณ คุณจะบอกได้อย่างไรว่าหมายเลขสามนั้นอยู่ในนั้น?

มีวิธีชัดเจน: ตรวจสอบหมายเลขตามลำดับจนกว่าคุณจะพบ“ 3” หรือทำให้อาร์เรย์หมด การค้นหาเชิงเส้น เมื่อรับตัวเลข 10 ตัวคุณต้องถือว่ามันสามารถทำได้ 10 ขั้นตอน หมายเลข N ขั้นตอน N

รูปที่ 1.png

การค้นหาเชิงเส้นไม่ดี มันยากที่จะทำสิ่งที่เลวร้ายยิ่งกว่าเชิงเส้น มาปรับปรุงกันเถอะ เรียงลำดับอาร์เรย์

รูปที่ 2.png

อาร์เรย์ที่เรียงลำดับจะแนะนำกลยุทธ์ที่แตกต่าง: กระโดดตรงกลางของอาร์เรย์และดูว่าค่าที่คุณกำลังมองหานั้นน้อยกว่า (ไปทางซ้าย) หรือมากกว่า (ไปทางขวา) ทำซ้ำโดยตัดอาร์เรย์เป็นครึ่งทุกครั้งจนกว่าคุณจะพบค่า

ค้นหาแบบทวิภาค เมื่อรับตัวเลข 10 ตัวมันจะใช้เวลามากถึง 3 ขั้นตอน —- log2 จาก 10 —- เพื่อค้นหาหนึ่งในอาร์เรย์ที่เรียงลำดับ การค้นหา O (บันทึก n) ยอดเยี่ยม หากคุณมีองค์ประกอบ 65,000 รายการคุณจะต้องดำเนินการ 16 ขั้นตอนในการค้นหาหนึ่งรายการ เพิ่มองค์ประกอบเป็นสองเท่าและเป็น 17 ขั้นตอน

แต่อาเรย์เรียงลำดับดูด; สำหรับสิ่งหนึ่งการเรียงลำดับมีราคาแพงกว่าการค้นหาเชิงเส้น ดังนั้นเราจึงไม่ใช้การค้นหาแบบไบนารี่มากนัก เราใช้ต้นไม้คู่แทน

รูปที่ 3.png

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

ค้นหาด้วยต้นไม้ไบนารี (สมดุล) คือ O (บันทึก n) เช่นการค้นหาแบบไบนารีซึ่งแตกต่างกันไปตามจำนวนขององค์ประกอบในต้นไม้ ต้นไม้ไบนารีน่ากลัว: คุณได้รับการค้นหาอย่างรวดเร็วและข้ามเส้นทางเรียงลำดับสิ่งที่คุณไม่ได้ออกจากตารางแฮช ต้นไม้ไบนารีเป็นการใช้งานตารางเริ่มต้นที่ดีกว่าตารางแฮช 2

แต่ต้นไม้ไบนารีไม่ใช่กลไกการค้นหาแบบโครงสร้างเดียว ฐานรากไบนารีพยายามที่เรียกว่าต้นไม้ PATRICIA ทำงานเหมือนต้นไม้ไบนารีที่มีความแตกต่างพื้นฐานอย่างหนึ่ง แทนที่จะเปรียบเทียบมากกว่า / น้อยกว่าที่แต่ละโหนดคุณตรวจสอบเพื่อดูว่ามีการตั้งค่าบิตหรือไม่แยกทางขวาหากตั้งค่าและตั้งค่าหากไม่มี

รูปที่ 4.png

ฉันทิ้งมากเกี่ยวกับวิธีเลขฐานสองพยายามทำงาน นี่เป็นความอัปยศเพราะความพยายามของเรดิกนั้นน้อยกว่าเอกสารที่ฉาวโฉ่ - เซดเซวิคทำให้เสียชื่อเสียงใน“ อัลกอริธึม” และหน้าวิกิพีเดียสำหรับพวกเขา ผู้คนยังคงโต้เถียงกันเกี่ยวกับสิ่งที่เรียกพวกเขา! แทนคำอธิบายของลิงก์ย้อนกลับและขอบบิตเลเบลตำแหน่งนี่เป็นการนำทับทิมขนาดเล็กมาใช้

นี่คือเหตุผลว่าทำไม Radix พยายามเจ๋ง:

Search performance varies with the key size, not the number of elements in the tree. With 16 bit keys, you’re guaranteed 16 steps

โดยไม่คำนึงถึงจำนวนขององค์ประกอบในต้นไม้โดยไม่สมดุล

More importantly, radix tries give you lexicographic matching, which is a puffed-up way of saying “search with trailing wildcard”, or

“ การค้นหาสไตล์คำสั่งเสร็จสิ้นบรรทัด” ในต้นไม้ radix คุณสามารถค้นหา "ro *" และรับ "โรม" และ "โรแมนติก" และ "โรswell" ได้อย่างรวดเร็ว

3

ฉันหลงทาง

มาพูดถึงบริบทกัน ความพยายามเป็นโครงสร้างข้อมูลที่สำคัญสำหรับการกำหนดเส้นทางอินเทอร์เน็ต ปัญหาการกำหนดเส้นทางเป็นดังนี้:

You have a routing table with entries for “10.0.1.20/32 -> a” and “10.0.0.0/16 -> b”.

You need packets for 10.0.1.20 to go to “a”

You need packets for 10.0.1.21 to to to “b”

นี่เป็นปัญหาที่ยากที่จะแก้ด้วยต้นไม้ไบนารีพื้นฐาน แต่ด้วย radix trie คุณแค่ขอ“ 1010.0000.0000.0000.0000.0000.0001.0100” (สำหรับ 10.0.1.20) และ“ 1010” (สำหรับ 10.0.0.0 ) การค้นหาคำศัพท์ให้คุณ "จับคู่ที่ดีที่สุด" สำหรับการกำหนดเส้นทาง คุณสามารถลองได้ในรหัส Ruby ด้านบน เพิ่ม *” 10.0.0.0” .to_ip ไปยัง Trie และค้นหา“ 10.0.0.1” .to_ip

ความสอดคล้องกันระหว่างการเราต์และการพยายาม Radix นั้นแข็งแกร่งมากจนเป็นที่นิยมมากที่สุดในไลบรารี radix trie (หนึ่งจาก CPAN) ที่ถูกขโมยออกจาก GateD มันยุ่งเหยิงและไม่ใช้มัน

หากคุณเข้าใจว่าคู่ชีวิตทำงานอย่างไรคุณก็เข้าใจว่าการแสดงออกปกตินั้นทำงานอย่างไร ความพยายามเป็นกรณีพิเศษของขอบเขต จำกัด ออโตมาตะ (DFAs) ซึ่งสาขาจะขึ้นอยู่กับการเปรียบเทียบบิตและส่งต่อสาขาเสมอ เอ็นจิ้น regex ที่ดีนั้นกำลังจัดการ DFA ด้วย "คุณสมบัติ" เพิ่มเติม หากรูปภาพของฉันเหมาะสมกับคุณรูปภาพในบทความที่ยอดเยี่ยมเกี่ยวกับอัลกอริทึมการลด NFA-DFA ของ Thompson ก็เช่นกันและบทความนั้นจะทำให้คุณฉลาดขึ้น 4

คุณเป็นผู้ให้บริการเครือข่ายที่ backbone ISP โลกของคุณส่วนใหญ่ประกอบด้วย“ คำนำหน้า” —- คู่เครือข่าย IP / netmask netmasks ในคำนำหน้าเหล่านั้นมีความสำคัญอย่างยิ่งสำหรับคุณ ตัวอย่างเช่น 121/8 เป็นของเกาหลี 121.128 / 10 เป็นของ Korea Telecom, 121.128.10 / 24 เป็นของลูกค้า KT และ 121.128.10.53 เป็นคอมพิวเตอร์หนึ่งเครื่องภายในลูกค้ารายนั้น หากคุณกำลังติดตามบ็อตเน็ตหรือการดำเนินการสแปมหรือการแพร่กระจายเวิร์มหมายเลข netmask นั้นเป็นสิ่งสำคัญสำหรับคุณ

น่าเสียดายที่สำคัญแม้ว่ามันจะอยู่ที่ใดก็ตามบนแพ็กเก็ต IP จะมีการประทับตรา“ netmask” —- netmasks ล้วนเป็นรายละเอียดการกำหนดค่า ดังนั้นเมื่อคุณรับชมข้อมูลคุณต้องให้ข้อมูลนี้เป็นหลัก:

ips.png

น่าแปลกที่ได้รับแพ็คเก็ตมากพอที่จะดูนี่เป็นข้อมูลที่เพียงพอในการคาดเดาเน็ตมาสก์ด้วย ในขณะที่ทำงานที่ Sony Kenjiro Cho ก็คิดวิธีที่จะทำเช่นนั้นโดยดูจากความพยายาม นี่คือวิธี:

ใช้ binary radix trie พื้นฐานเช่นเดียวกับที่เราเตอร์ซอฟต์แวร์ใช้ แต่ จำกัด จำนวนโหนดในต้นไม้ให้พูดถึง 10,000 บนลิงก์แบ็คโบนซึ่งบันทึกที่อยู่จากส่วนหัว IP คุณจะหมด 10,000 โหนดในช่วงเวลาหนึ่ง

เก็บรายการของโหนดในรายการเรียงลำดับตาม LRU กล่าวอีกนัยหนึ่งเมื่อคุณจับคู่ที่อยู่ IP กับโหนดให้“ แตะ” ที่โหนดแล้วติดที่ด้านบนของรายการ ที่อยู่ที่ค่อยๆพบเห็นจะปรากฏเป็นฟองขึ้นไปด้านบนและโหนดที่พบไม่บ่อยจะจมลงสู่ด้านล่าง

รูปที่ 6.png

ตอนนี้เคล็ดลับ เมื่อคุณไม่มีโหนดและต้องการสิ่งใหม่ให้เรียกคืนจากด้านล่างของรายการ แต่เมื่อคุณทำแล้วให้กลิ้งข้อมูลจากโหนดขึ้นไปสู่ ​​parent เช่น:

รูปที่ 5.png

10.0.1.2 และ 10.0.1.3 คือพี่น้อง / 32s, สองครึ่งแบ่งเป็น 10.0.1.2/31 หากต้องการเรียกคืนพวกเขาให้รวมเข้าไว้ใน 10.0.1.2/31 หากคุณต้องการเรียกคืน 10.0.1.2/31 คุณสามารถรวมกับ 10.0.1.0/31 เพื่อสร้าง 10.0.1.0/30

ทำสิ่งนี้พูดนาทีและแหล่งที่ยอดเยี่ยมจะปกป้องตำแหน่งของพวกเขาในต้นไม้โดยอยู่ที่ด้านบนของรายการ LRU ในขณะที่รอบ / 32 เสียงฟองขึ้นไป / 0 สำหรับรายการ raw ของ IP ข้างต้นด้วยทรี 100 โหนดคุณจะได้รับสิ่งนี้

โชเรียกว่า Aguri ฮิวริสติกนี้ 5

Aguri ได้รับอนุญาตจาก BSD คุณสามารถไปดาวน์โหลดได้และโปรแกรมไดรเวอร์ที่คอยดูแพ็คเก็ตผ่าน pcap จากหน้าแรกของ Cho 6

ฉันจะไปที่นี่ แต่ตอนนี้ฉันมี 1,300 คำในโพสต์นี้และถ้าคุณเป็นอัลกอริทึมที่คุณเบื่อฉันในตอนนี้และถ้าคุณไม่คุณก็เบื่อคุณด้วย ตอนนี้ ดังนั้นให้ Aguri จมและฉันจะให้อะไรที่เจ๋งและไร้ประโยชน์กับมันในสัปดาห์นี้

มีลิงค์จำนวนมากกระจายอยู่ในนั้น น่าเสียดายที่ Archive.org ไม่ได้เก็บภาพเพียงข้อความเท่านั้นดังนั้นภาพเหล่านั้นจึงสูญหายไปหลายภาพ นี่คือรายการที่ถูกเก็บถาวร:


นี่จะแสดงข้อมูลอย่างแน่นอนมีเหตุผลใดที่ลิงก์เหล่านี้ทั้งหมดไม่สามารถใช้ได้อีกต่อไป?
phwd

@ phwd ฉันเพิ่งคัดลอก / วางลิงก์ที่ด้านล่างจากที่ที่ Wayback Machine ลิงก์ไปถึง และมันเชื่อมโยงกับตัวเองดังนั้นคุณจะเห็นหน้าเว็บเหล่านั้นเหมือนที่เคยเป็นเมื่อมีการโพสต์บล็อก บทความ Wikipedia และการเปรียบเทียบ regex ฉันรู้ว่ายังคงมีอยู่
Izkata
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.