เพียร์ทูเพียร์ทำงานผ่านอินเทอร์เน็ตอย่างไร


15

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

สมมติว่าเรามีการตั้งค่าที่มีลักษณะดังนี้:

  1. คอมพิวเตอร์ -A, IP 192.168.1.2 (เกตเวย์เริ่มต้น 192.168.1.1)

  2. คอมพิวเตอร์ -B, IP 192.168.1.3 (เกตเวย์เริ่มต้น 192.168.1.1)

  3. เราเตอร์ -C, IP 192.168.1.1 (IP ภายนอก 1.1.1.1)

  4. Router-D (IP ภายนอก 2.2.2.2)

Computer-A, Computer-B และ Router-C เป็นของเครือข่ายท้องถิ่นเดียวกัน Router-D ต้องการส่งข้อมูลไปที่ Computer-A แต่ไม่สามารถทำได้โดยไม่ต้องผ่าน Router-C

ตอนนี้ Router-C จะส่งต่อแพ็กเก็ตไปที่ Computer-A หากพอร์ตปลายทางคือ 1,000 และจะส่งต่อแพ็กเก็ตไปยัง Computer-B หากพอร์ตปลายทางคือ 2000 แต่แน่นอนอุปกรณ์เดียวที่รู้กลไกการกำหนดเส้นทางนี้คือ Router-C เอง! ไม่แม้แต่ Computer-A หรือ Computer-B จะรู้ใช่มั้ย

ดังนั้น Router-D สามารถส่งแพ็คเก็ตไปที่ Computer-A ได้ถ้ามันส่งแพ็กเก็ตไปยัง Router-C ผ่านพอร์ต 1000 แต่เราเตอร์-D รู้วิธีส่งแพ็กเก็ตผ่านพอร์ต 1000 ได้อย่างไรและไม่พูดพอร์ต 1001

โปรแกรมเพียร์ทูเพียร์เช่น Bittorrent ได้รับผ่านปัญหานี้อย่างไร ทางออกเดียวที่ฉันคิดได้คือสำหรับ Router-D เพื่อส่งแพ็กเก็ตไปยัง Router-C ผ่านพอร์ตทั้งหมดเช่นนั้นจะถูกส่งต่อไปยัง Computer-A แต่มีทางออกที่ดีกว่าหรือไม่

คำตอบ:


9

ความสับสนของคุณเกิดจากสมมติฐานที่ไม่ถูกต้อง

แต่แน่นอนอุปกรณ์เดียวที่รู้กลไกการกำหนดเส้นทางนี้คือ Router-C เอง! ไม่แม้แต่ Computer-A หรือ Computer-B จะรู้ใช่มั้ย

อะไรทำไม router ทำไมเราเตอร์ถึงตั้งค่าให้ส่งต่อพอร์ตเหล่านั้นไปยัง IP เหล่านั้น คุณต้องตั้งค่าไคลเอนต์ P2P เพื่อใช้พอร์ตเฉพาะแล้วตั้งค่าเราเตอร์ให้สอดคล้อง

แต่เราเตอร์ -D รู้วิธีส่งแพ็กเก็ตผ่านพอร์ต 1,000 อย่างไรและไม่พูดพอร์ต 1001

เนื่องจากคุณกำหนดค่าไคลเอนต์ P2P เพื่อใช้พอร์ตเฉพาะ (มาตรฐานหรือไม่ได้มาตรฐานสำหรับโปรโตคอลนั้น)

ทางออกเดียวที่ฉันคิดได้คือสำหรับ Router-D เพื่อส่งแพ็กเก็ตไปยัง Router-C ผ่านพอร์ตทั้งหมดเช่นนั้นจะถูกส่งต่อไปยัง Computer-A แต่มีทางออกที่ดีกว่าหรือไม่

มันง่ายกว่านั้นมาก เมื่อไคลเอนต์ทำการเชื่อมต่อกับเพียร์มันระบุพอร์ตที่มันต้องการใช้ดังนั้นเพียร์ส่งข้อมูลบนพอร์ตนั้น

อืม แต่ Bittorrent ไม่เปลี่ยนพฤติกรรมของเราเตอร์ใช่ไหม เนื่องจากกลไกการกำหนดเส้นทางบางอย่างอาจเป็นแบบไดนามิกดังที่แสดงใน superuser.com/a/187190/78897 คอมพิวเตอร์ A สามารถรับรู้ได้อย่างไร

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

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

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


หากคุณใช้โปรแกรมเช่นSmartSniffหรือTCPViewเพื่อตรวจสอบการเชื่อมต่อของคุณคุณจะสังเกตเห็นว่าการเชื่อมต่อ P2P มักจะมีพอร์ตที่คุณกำหนดค่า (หรือค่าเริ่มต้นสำหรับไคลเอ็นต์) เป็นปลายทางสำหรับการเชื่อมต่อขาเข้าและเป็นค่าเริ่มต้นหรือกำหนดเอง / พอร์ตสุ่มสำหรับแหล่งที่มาและในทางกลับกันสำหรับการเชื่อมต่อขาออก


อืม แต่ Bittorrent ไม่เปลี่ยนพฤติกรรมของเราเตอร์ใช่ไหม เนื่องจากกลไกการกำหนดเส้นทางบางอย่างอาจเป็นแบบไดนามิกดังที่แสดงในsuperuser.com/a/187190/78897คอมพิวเตอร์ A สามารถรับรู้ได้อย่างไร
Pacerier

การส่งต่อพอร์ต คุณตั้งค่าไว้ล่วงหน้า
UtahJarhead

@Pacerier หากทั้งเราเตอร์และแอพ p2p ใช้UPnPการส่งต่อพอร์ตสามารถทำได้แบบไดนามิก ในกรณีนี้ใช่ Bittorrent จะเปลี่ยนพฤติกรรมของเราเตอร์
zero2cx

@ zero2cx มีการทำเพียร์ทูเพียร์โดยไม่เปลี่ยนพฤติกรรมของเราเตอร์หรือไม่
Pacerier

@Pacerier ถ้าคุณต้องการให้ NAT (หลาย ๆ ระบบใช้การเชื่อมต่อร่วมกัน) คุณต้องกำหนดค่าเราเตอร์ให้รู้ว่าจะทำการเชื่อมต่อที่ไหนดี (โดยทางเทคนิคแล้วคุณสามารถให้ทุกคนคายการเชื่อมต่อกับพอร์ตทั้งหมดตามที่คุณแนะนำ ที่จะดีที่สุดน่ากลัว) คุณสามารถทำสิ่งนี้แบบคงที่ (กำหนดค่า IP และพอร์ต) หรือแบบไดนามิก (UPnP)
Synetech

4

คำถามของคุณสัมผัสกับหัวใจของอินเทอร์เน็ตและความหมายของการกำหนดเส้นทาง ในตัวอย่างของคุณเราเตอร์ D ส่งข้อมูลไปยังคอมพิวเตอร์ A โดยยึดตามสถานที่สองแห่ง:

  • มีการบอกให้ส่งข้อมูลไปยังคอมพิวเตอร์ A.
  • มันประมวลผลข้อมูลจากคอมพิวเตอร์ A. แล้ว

สถานการณ์สมมติของคุณดูเหมือนจะเป็นตัวเลือกแรก - เราเตอร์ D ต้องการส่งไปยังคอมพิวเตอร์ A. แต่จะไปได้อย่างไร มันทำได้โดยการใช้ตารางเส้นทางที่ใช้ร่วมกันโดยเราเตอร์ระหว่างกัน

เราเตอร์ C ส่งการอัพเดทไปยังเราเตอร์ทุกตัวที่รู้ - รวมถึงเราเตอร์ D - ว่า "รู้" "192.168. *" เครือข่าย (ในความเป็นจริง - สิ่งนี้จะไม่เกิดขึ้นเพราะเครือข่ายนั้นไม่ได้กำหนดเส้นทาง - เป็นส่วนตัว เพิกเฉยต่อสิ่งนั้น) ดังนั้นเราเตอร์ D จึงรู้ว่าเราเตอร์ C รู้เครือข่ายนั้นอยู่แล้ว

ดังนั้นเมื่อข้อมูลถูกกำหนดไว้สำหรับคอมพิวเตอร์ A มันจะถูกแก้ไขโดยเครือข่ายก่อน ดังนั้นเราเตอร์ D ถามว่า "ฉันต้องการค้นหาเครือข่าย 192.168. * ฉันรู้หรือไม่ไม่ฉันรู้จักคนอื่นบ้างหรือไม่ใช่เราเตอร์ C ทำได้ฉันจะไปยังเราเตอร์ C ได้อย่างไรผ่าน 2.2 2.2 ส่วนต่อประสาน "

จากนั้นเราเตอร์ D จะส่งข้อมูลไปยังเราเตอร์ซีเราเตอร์ C รับแล้วบอกว่า "โอ้ฉันมีข้อมูลจากเราท์เตอร์ดี แต่สำหรับเครือข่าย 192.168 ฉันรู้จักเครือข่ายนั้นหรือไม่ใช่ผ่านเครือข่าย 192.168.1.1 ของฉัน" จากนั้น ส่งต่อมัน

มีงานอื่นที่ต้องทำเพื่อแก้ไขที่อยู่ IP และ MAC แต่ฉันครอบคลุมการกำหนดเส้นทางต่อไม่ใช่ ARP และเครือข่ายท้องถิ่น

คุณจะสังเกตเห็นข้อสันนิษฐานแรกของคุณ - เราเตอร์ระยะไกลต้องทราบกลไกการกำหนดเส้นทาง - ไม่ได้เล่นที่นี่ เราเตอร์ D ไม่สนใจว่าเราท์เตอร์ C กำลังใช้ EIGRP, RIP, RIPv2, OSPF หรืออะไรก็ตาม สิ่งที่สำคัญคือต้องได้รับการอัปเดต (แน่นอนว่าการอัปเดตเป็นสิ่งสำคัญอย่างไรเพื่อให้แน่ใจว่าทั้งสองอยู่ในสถานะซิงค์ แต่อีกครั้งนั่นเป็นปัญหาที่แตกต่างกัน)

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

จากตัวอย่างของคุณเราเตอร์ C จะส่งต่อข้อมูลบนพอร์ต 1000 (ต่อสถานการณ์ของคุณ) เนื่องจากเป็นไปได้ว่ามีบริการบนคอมพิวเตอร์ A คาดว่าจะมีข้อมูลบนพอร์ตเฉพาะนั้น แต่รู้เพียงเพราะเราเตอร์ D ส่งไปที่พอร์ต 1000 และเราเตอร์ D เท่านั้นส่งไปที่พอร์ตนั้นเพราะผู้สร้างข้อมูลส่งไปยังเราเตอร์ D บนพอร์ตนั้น

ฉันไม่เข้าใจการรวมโปรแกรม bittorrent หรือ P2P ของคุณเป็นภาพสะท้อนของคำถามที่คุณถาม คำอธิบายเดียวกันจะนำไปใช้ เราเตอร์สามารถกำหนดค่าด้วยพอร์ตทริกเกอร์ซึ่งเชื่อมโยงอุปกรณ์เฉพาะ (หรือ IP) กับพอร์ตเฉพาะ เมื่อการรับส่งข้อมูลมาที่พอร์ต 1234 เราเตอร์จะรู้ว่าจะส่งข้อมูลไปยังอุปกรณ์ ABCD ซึ่งมักจะเกี่ยวข้องกับพอร์ต TCP ขาออก นั่นคือถ้าฉันส่งทราฟฟิกที่พอร์ต 7890 เราเตอร์จะรู้ทราฟฟิกที่เข้ามาจะอยู่ที่พอร์ต 1234 และส่งมาให้ฉัน

แต่การเรียกพอร์ตไม่เกี่ยวข้องกับการตัดสินใจกำหนดเส้นทาง (ระยะไกล) แต่จะเกี่ยวข้องกับตาราง MAC / IP ภายในที่เราเตอร์ใช้สำหรับ LAN

อัปเดต / แก้ไข : เพื่อตอบและอธิบายเพิ่มเติมหลังจากความคิดเห็นของคุณ เราเตอร์ D รู้คอมพิวเตอร์ A ด้วยที่อยู่ IP เท่านั้น (192.168.2.2) แต่เราเตอร์ C รู้คอมพิวเตอร์โดยที่อยู่ IP และที่อยู่ MAC ของมัน MAC (การควบคุมการเข้าถึงสื่อ) เป็นตัวระบุ (โดยปกติ ... ) 48 บิตที่กำหนดโดยมาตรฐานสากล อุปกรณ์ทุกชิ้นที่เชื่อมต่อกับ LAN (แบบใช้สายและไร้สาย) ควรจะมีที่อยู่ MAC ที่ไม่ซ้ำกัน

เราเตอร์ (เราเตอร์ C) เชื่อมโยงที่อยู่ IP และที่อยู่ MAC ร่วมกันในตาราง (ตารางที่อยู่ MAC) ดังนั้นเมื่อทราฟฟิกเข้ามาใน Router C และเราเตอร์ตระหนักถึง "local" ของมันมันจะทำการค้นหาตารางที่อยู่ MAC จากนั้นเราเตอร์จะเปลี่ยนข้อมูลที่อยู่ของเฟรมอย่างแท้จริง

มันสร้างใหม่ (เขียนใหม่) ข้อมูลปลายทางของเลเยอร์ 2 เพื่อให้ที่อยู่ MAC ปลายทางของคอมพิวเตอร์ A แต่เก็บข้อมูลที่อยู่ IP (เลเยอร์ 3) ให้เหมือนเดิม

หากเส้นทางไม่ทราบที่อยู่ MAC หรือไม่มีความสัมพันธ์ IP-MAC ในตารางของมันมันทำสิ่งที่เรียกว่า ARP (โปรโตคอลการแก้ไขที่อยู่) เพื่อขอให้ "HEY ทุกคนในเครือข่ายนี้คุณมีที่อยู่ MAC นี้หรือไม่" หรือบางครั้ง - "ทุกคนที่อยู่ MAC ของคุณคืออะไร") อุปกรณ์ / อุปกรณ์ที่เหมาะสมตอบสนองและเราเตอร์สร้างตาราง IP-MAC


ดังนั้น Router-D ส่งแพ็กเก็ตไปยัง Router-C ผ่านพอร์ต 60000 (กำหนดค่าล่วงหน้า), Router-C ได้รับแพ็คเก็ต แต่จะรู้ได้อย่างไรว่าแพ็คเก็ตนี้จะถูกส่งต่อไปยัง Computer-A?
Pacerier

1
เราเตอร์ D รู้ปลายทางสุดท้ายแล้ว - คอมพิวเตอร์ A. มัน (เราเตอร์ D) รู้จักคอมพิวเตอร์ A เท่านั้นโดยใช้ที่อยู่ IP: 192.168.2.2 แต่เราเตอร์ C รู้คอมพิวเตอร์ได้สองวิธี: ที่อยู่ IP (192.168.2.2) และสิ่งที่เรียกว่าที่อยู่ MAC ของมัน ฉันจะอัปเดตคำตอบด้วยข้อมูลเพิ่มเติม
จอห์น

2

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

บางรุ่นมีเซิร์ฟเวอร์กลางที่ใช้สำหรับการสื่อสารขั้นพื้นฐาน ตัวอย่างเช่น:

  • Client1 ลงชื่อเข้าใช้ด้วยเซิร์ฟเวอร์สำหรับการสื่อสาร 2 ทาง
  • Client2 ลงชื่อเข้าใช้ด้วยสิ่งเดียวกัน

เซิร์ฟเวอร์รู้ไฟล์ทั้งหมดที่ Client1 และ Client2 มีแล้ว

  • Client2 บอกว่า "ฉันต้องการไฟล์ X จาก Client1" ไปยังเซิร์ฟเวอร์
  • เซิร์ฟเวอร์บอกว่า Client1 "Client2 ต้องการไฟล์ X"
  • ไคลเอ็นต์ 1 ส่งข้อมูลขยะไปยังไอพีสาธารณะของ Client2 ปิดพอร์ตทริกเกอร์เพื่อเปิดพอร์ตสำหรับการตอบกลับจาก Client2
  • Client2 ส่งสัญญาณเริ่มต้นไปที่ IP สาธารณะของ Client1

Client1 เพิ่งหลอกให้เราเตอร์เปิดพอร์ตนั้นสำหรับ Client2

ในบางกรณีเช่น BitTorrent หรือ Napster ดั้งเดิม (iirc) คุณต้องส่งต่อพอร์ตบนเราเตอร์ของคุณเพื่อให้มันทำงานได้อย่างดีที่สุด

เท่าที่ลูกค้ารายอื่นรู้ว่าพอร์ตใดที่จะเชื่อมต่อในตอนแรกนั่นเป็นเพราะลูกค้าของคุณบอกกับฝูงหรือเซิร์ฟเวอร์ที่คุณใช้พอร์ต BitTorrent ใช้ตัวติดตามบ่อยๆและติดตามว่าพอร์ตไหนที่ลูกค้าใช้


เท่าที่พวกเขารู้ว่าพอร์ตใดที่จะใช้ ... คุณกำหนดค่าไคลเอนต์ให้ฟังพอร์ตที่เฉพาะเจาะจง ลูกค้าของคุณบอกฝูง (เช่นในกรณีของ BitTorrent) พอร์ตใดที่คุณเปิดเพื่อให้ลูกค้ารายอื่นรู้ว่าจะเชื่อมต่อกับอะไร พีซีของคุณบอกพวกเขา
UtahJarhead

ฉันคิดว่าคุณตอบในขณะที่ภาคผนวกแรกของฉันถูกเขียน แก้ไข?
UtahJarhead

แต่พีซีจะรู้กลไกการกำหนดเส้นทางอย่างไรเมื่อเป็นเราเตอร์ที่ทำ กลไกบางอย่างอาจเป็นแบบไดนามิกดังแสดงในsuperuser.com/a/187190/78897
Pacerier

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

แต่การส่งต่อพอร์ตเป็นไปได้ก็ต่อเมื่อผู้ดูแลระบบกำหนดค่าไว้ล่วงหน้า .. คุณหมายถึงว่า Bittorrent กำหนดค่าเราเตอร์ใหม่หรือไม่?
Pacerier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.