Score:11

จะเกิดอะไรขึ้นหากระบบโลคัลสองระบบดาวน์โหลดทรัพยากรเดียวกันบนพอร์ตเดียวกัน

ธง cn
S.B

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

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

มีกลไกใดในเราเตอร์หรือเซิร์ฟเวอร์ในการตรวจจับสิ่งนี้หรือไม่ หรือพฤติกรรมนี้เป็นไปได้ตั้งแต่แรก?

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


อัปเดต : จากความคิดเห็นฉันรู้ว่าฉันยังไม่ชัดเจนพอดังนั้นฉันจะพูดอีกครั้งด้วยตัวอย่าง:

ฉันแค่สนใจเกี่ยวกับพอร์ต "ต้นทาง" ของอุปกรณ์ สมมติว่าฉันมีแล็ปท็อปสองเครื่อง (192.168.2.10 และ 192.168.2.11) ทั้งคู่กำลังดาวน์โหลดไฟล์เดียวกันจากเซิร์ฟเวอร์เดียวกันที่ไหนสักแห่งในอินเทอร์เน็ต แต่ละคนมีระบบปฏิบัติการที่สร้างพอร์ตแบบสุ่ม ดังนั้น IP ต้นทางและพอร์ตต้นทางจะเป็นดังนี้: 192.168.2.10:6321 และ 192.168.2.11:7132. ฉันคิดว่าใน NAT เราเตอร์จะตั้งค่าที่อยู่ IP (สาธารณะ) พร้อมกับพอร์ตจากแล็ปท็อป ดังนั้นหากที่อยู่ IP สาธารณะของเราเตอร์ที่บ้านคือ 65.82.23.32แพ็คเกจทั้งสองนี้จะได้รับ IP ต้นทางและพอร์ตต้นทางตามลำดับ: 65.82.23.32:6321 และ 65.82.23.32:7132.

ตอนนี้เมื่อมีการตอบกลับ เราเตอร์สามารถระบุได้ว่าแพ็กเก็ตใดสำหรับแล็ปท็อปเครื่องใดจากหมายเลขพอร์ตใช่ไหม จนถึงตอนนี้ดีมาก แต่จะเกิดอะไรขึ้นหากแล็ปท็อปสองเครื่องสร้างพอร์ตต้นทางเดียวกันโดยไม่ตั้งใจหรือตั้งใจ ตัวอย่างเช่น : 192.168.2.10:6000 และ 192.168.2.11:6000. ตอนนี้เราเตอร์จะตั้งค่าที่อยู่ IP สาธารณะเป็นที่อยู่ IP ต้นทางเหมือนเมื่อก่อน แต่ถ้าพยายามใช้หมายเลขพอร์ตเหล่านั้น แพ็คเกจเหล่านั้นจะมี IP ต้นทางและหมายเลขพอร์ตต้นทางเหมือนกันทุกประการ เช่น : 65.82.23.32:6000 และ 65.82.23.32:6000.

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

หลังจากคำตอบของ @ mfinni ฉันสังเกตเห็นว่า PAT ไม่ทำงาน! อุปกรณ์ NAT (ในที่นี้คือเราเตอร์) จะกำหนดพอร์ตเฉพาะให้กับแล็ปท็อปแต่ละเครื่อง (ที่อยู่ IP ส่วนตัว) จากนั้นแพ็กเก็ตที่ส่งออกด้วยพอร์ตเฉพาะเหล่านี้ (เช่น 7777 และ 7778). ดังนั้นเมื่อได้รับคำตอบกลับมา ก็จะชัดเจนว่าแพ็กเก็ตใดเป็นของแล็ปท็อปเครื่องใดจากพอร์ต จากนั้นเราเตอร์จะแปลงข้อมูลเหล่านี้ 65.82.23.32:7777, 65.82.23.32:7778 ถึง --> 192.168.2.10:6000, 192.168.2.11:6000 ตามลำดับ

se flag
เราเตอร์จะรับรู้ว่าที่อยู่ IP นั้นแตกต่างกัน จดจำ.แพ็กเก็ต IP ถูกระบุโดย 4 ชิ้นบนข้อมูล ไม่ใช่ 3 ไม่ใช่ 2 และไม่ใช่ 1: IP ต้นทาง, พอร์ตต้นทาง, IP ปลายทาง, พอร์ตปลายทาง
S.B avatar
cn flag
S.B
@slebetman ฉันรู้ แต่เมื่อมีการดาวน์โหลดไฟล์เดียวกันจาก url เดียวกัน (หากเราเชื่อมต่อกับเว็บเซิร์ฟเวอร์เดียวกัน) IP ปลายทางและพอร์ตปลายทางจะเหมือนกันสำหรับทั้งสองแพ็คเกจ IP ต้นทางก็เหมือนกันเพราะเป็นที่อยู่ IP ของเราเตอร์ ดังนั้นส่วนสุดท้ายของข้อมูลทั้ง 4 นั้นคือ "พอร์ต" ต้นทาง ฉันถูกไหม ?
se flag
พวกเขาไม่สามารถเหมือนกันได้ บริการ NAT ในเราเตอร์ของคุณต้องแน่ใจว่าไม่เหมือนกัน พอร์ตต้นทางที่ออกจาก NAT นั้นสุ่มอยู่แล้ว ดังนั้น NAT จำเป็นต้องตรวจสอบให้แน่ใจว่าได้แมปแพ็กเก็ตภายในกับพอร์ตต้นทางขาเข้ากับพีซีที่ถูกต้อง
se flag
เว้นแต่คุณจะเขียน NAT ของคุณเอง แต่นั่นจะถือว่าเป็นจุดบกพร่องในการใช้งาน NAT ของคุณ
RonJohn avatar
id flag
"มีกลไกใดในเราเตอร์หรือเซิร์ฟเวอร์ในการตรวจจับสิ่งนี้หรือไม่" คุณ **GOT** ได้รู้ว่ามีคนอื่นคิดเรื่องนี้ **บางครั้ง** ในช่วง 22 ปีที่ผ่านมา
Score:44
ธง co

การเชื่อมต่อ TCP (ซึ่งรองรับ HTTP และโปรโตคอลอื่น ๆ อีกมากมาย) นั้นไม่ซ้ำกัน (ณ เวลาที่กำหนด) ซึ่งกำหนดโดยพารามิเตอร์ 4 ตัว:

  • IP ภายในเครื่อง
  • พอร์ตท้องถิ่น
  • IP ระยะไกล
  • พอร์ตระยะไกล

แม้ว่าคุณจะส่งคำขอเดียวกันสองครั้งพร้อมกันจากคอมพิวเตอร์เครื่องเดียวกัน แม้ว่าที่อยู่ IP ทั้งสองเหมือนกันและพอร์ตปลายทางเหมือนกัน พอร์ตต้นทางก็จะแตกต่างกัน

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

จากนั้นอุปกรณ์ NAT จะเก็บการแมปไว้ในตารางการแปลสำหรับการเชื่อมต่อแต่ละครั้งซึ่งระบุว่าการเชื่อมต่อภายนอก (IP ภายนอก, พอร์ตต้นทางภายนอก, IP ปลายทาง, พอร์ตปลายทาง) ถูกแมปกับการเชื่อมต่อภายใน (IP โฮสต์ภายใน, พอร์ตต้นทางโฮสต์ภายใน, ปลายทาง IP, พอร์ตปลายทาง)

S.B avatar
cn flag
S.B
อธิบายได้ดี ฉันจะยอมรับสิ่งนี้เป็นคำตอบ มีความครอบคลุมและเข้าใจง่าย
cn flag
เรียบง่ายและเป็นพื้นฐาน - ความจริงที่ว่ามีพอร์ต SOURCE สำหรับทุกการเชื่อมต่อไคลเอนต์มักถูกมองข้ามโดยผู้เริ่มต้น (และโปรแกรมเมอร์ที่มีประสบการณ์) จริง ๆ แล้วฉันมีคนคิดว่าพอร์ตต้นทางจะเหมือนกับพอร์ตเป้าหมาย ซึ่งเห็นได้ชัดว่าใช้งานไม่ได้ (เช่น เว็บเซิร์ฟเวอร์ทำการเรียก http ไปยังเว็บเซิร์ฟเวอร์อื่น) ข้อเท็จจริงพื้นฐานของ TCP อธิบายได้ดี
cn flag
@TomTom มีโปรโตคอลเฉพาะบางตัวที่ใช้พอร์ตเดียวกันสำหรับต้นทางและปลายทาง เป็นของหายากและมักออกแบบโดยโปรแกรมเมอร์ที่ไม่เข้าใจจุดปลีกย่อยของระบบเครือข่ายอย่างแท้จริง
cn flag
@Tonny พวกเขาไม่สามารถเป็นกระแสหลักได้เพราะไม่เช่นนั้นพวกเขาจะมีพอร์ตที่กำหนด - ซึ่งอยู่ในพื้นที่ควบคุมของพอร์ตต่ำ ;) คุณช่วยบอกชื่อผู้กระทำความผิดเหล่านี้ให้ฉันได้ไหม จริง ๆ แล้วไม่เคยได้ยิน - ฟังดูเหมือนโปรแกรมเมอร์โง่
cn flag
@TomTom พวกเขาเป็นช่องจริงๆ ฉันเคยพบการใช้งานการควบคุมสำหรับอุปกรณ์อุตสาหกรรมมาบ้างแล้ว ไม่มีอะไรล่าสุด (เช่นใน "สหัสวรรษนี้") ฉันจำชื่ออะไรไม่ได้เลยจริงๆ เมื่อ 2 ทศวรรษที่แล้ว และคำว่าโง่ก็อ่อนเกินไปสำหรับคำว่าวิกลจริต...
jcaron avatar
co flag
@HagenvonEitzen ที่จะขัดกับกระบวนทัศน์ TCP ทั้งหมด การเชื่อมต่อ TCP ถูกกำหนดโดย 4-tuple ไม่ใช่ 3 นอกจากนี้ฉันค่อนข้างแน่ใจว่าฉันเข้าใจว่าคุณหมายถึงอะไร หากคุณอยู่ในสถานการณ์ล้มเหลว (ไม่มีการซิงค์ตาราง NAT) ดังนั้นกลไกมาตรฐานสำหรับแพ็กเก็ต TCP ที่ไม่สามารถจับคู่ได้จะเป็น RST ไม่ใช่ ICMP ที่ไม่สามารถเข้าถึงได้
Hagen von Eitzen avatar
cn flag
@jcaron ขออภัยฉันไม่ดีดูเหมือนว่าฉันสับสนเพราะการแสดงระดับสูงของ ICMP ที่ไม่สามารถเข้าถึงได้มักจะกล่าวถึงเฉพาะที่อยู่ปลายทางและพอร์ต - เมื่อจริง ๆ แล้ว *do* มีส่วนหัวของอินเทอร์เน็ตเต็มรูปแบบรวมถึงการส่ง ip บวก 64 บิตของดาต้าแกรม (และด้วยเหตุนี้พอร์ต TCP ที่เกี่ยวข้อง ) ของแพ็คเก็ตที่ละเมิด *อย่างแม่นยำ* เพื่อให้สามารถค้นหาได้ว่าความพยายามใดที่ล้มเหลวจริงๆ
Score:11
ธง cn

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

S.B avatar
cn flag
S.B
โอ้ ขอบคุณ ฉันเกรงว่าคุณหมายถึง `ip` แทนที่จะเป็น `port` ในประโยคแรกของคุณใช่หรือไม่ เพราะพอร์ตจะถือว่าเหมือนกัน
mfinni avatar
cn flag
ไม่ พอร์ตต้นทางจากไคลเอ็นต์จะไม่ถือว่าเหมือนกัน เมื่อไคลเอนต์ส่งคำขอ พอร์ตต้นทางสำหรับโปรโตคอลส่วนใหญ่จะเป็นพอร์ตว่างแบบสุ่มในช่วงพอร์ตชั่วคราว
S.B avatar
cn flag
S.B
ใช่ เป็นเรื่องจริง แต่ฉันถามอย่างเจาะจงเกี่ยวกับสถานการณ์นั้นที่พอร์ตต้นทางเหมือนกัน ตัวอย่างเช่น ฉันจงใจเปิดพอร์ตเดียวกันด้วยซ็อกเก็ตไพธอน
mfinni avatar
cn flag
คุณกำลังทำตัวงี่เง่าที่ทำอย่างนั้น แต่ตาราง NAT รู้ว่า IP ต้นทางนั้นแตกต่างกัน ดังนั้นจึงใช้สิ่งเดียวกัน พอร์ต NAT ขาออกจะแตกต่างกันอย่างแน่นอน ซึ่งจะมาจากช่วงพอร์ตชั่วคราวบนอุปกรณ์ NAT
S.B avatar
cn flag
S.B
ฮ่าๆ มันเป็นเพราะความอยากรู้อยากเห็น ขอบคุณสำหรับข้อมูลของคุณ
se flag
@SorousHBakhtiary ระบบปฏิบัติการของคุณจะป้องกันไม่ให้คุณเปิดพอร์ตเดียวกันสองครั้งโดยมีข้อผิดพลาด "พอร์ตที่ใช้งานอยู่" (โดยปกติจะเป็น EADRINUSE ในการใช้งาน IP ตามปกติ) สิ่งที่คุณทำได้คือให้กระบวนการหนึ่งเปิดพอร์ตต้นทางหนึ่งพอร์ตและสื่อสารกับอีกสองกระบวนการผ่านไพพ์หรือหน่วยความจำที่ใช้ร่วมกัน เป็นต้น และทั้งสองกระบวนการจะพร็อกซีคำขอผ่านกระบวนการแรก แต่ในกรณีนี้การกำหนดเส้นทางจะขึ้นอยู่กับคุณ 100% เพราะตอนนี้อยู่นอกโปรโตคอล IP
se flag
@SorousHBakhtiary ดูเหมือนว่า python ไม่มี API ที่คุณสามารถตั้งค่าพอร์ตสำหรับลูกค้าได้ คุณสามารถระบุพอร์ตเซิร์ฟเวอร์ในเมธอด `.connect()` เท่านั้น พอร์ตไคลเอนต์ถูกกำหนดแบบสุ่มให้กับซ็อกเก็ตของคุณ ดังนั้นคุณจึงไม่สามารถทำในสิ่งที่คุณวางแผนจะทำในไพธอนได้ เป็นไปได้ที่จะทำใน C โดยแก้ไขโครงสร้างซ็อกเก็ต (ปลอมแปลง) ด้วยตนเอง แต่มันไม่ได้มาตรฐาน
S.B avatar
cn flag
S.B
@slebetman คุณพูดถูก มันเป็นความผิดของฉันที่ฉันไม่ชัดเจนพอ ฉันอัปเดตคำถามด้วยตัวอย่าง โปรดดูส่วน "อัปเดต"
user49822 avatar
pl flag
@slebetman อย่างน้อยบน linux คุณสามารถตั้งค่าพอร์ตต้นทางเมื่อเชื่อมต่อโดยเรียกเมธอด `.bind()` ก่อน `.connect()`
Score:6
ธง in

เมื่อคุณอ้างถึง แนท คุณอาจหมายถึง แนป. ซึ่งเปลี่ยนพอร์ตต้นทาง (อย่างน้อยหากจำเป็น) ในอุปกรณ์ NAT ดังนั้นพอร์ตต้นทางจะเปลี่ยนไป

ตัวอย่างเช่น iptables สวมหน้ากาก

เมื่อทำ NAT ในกรณีนี้ จำเป็นต้องมี "การติดตามการเชื่อมต่อ" ซึ่งจะคอยติดตามว่า "พอร์ตภายนอก" ใดเกี่ยวข้องกับ "ไคลเอนต์ภายในและพอร์ต" ใน iptables คุณมักจะเห็นกฎ ที่เกี่ยวข้องจัดตั้งขึ้น ซึ่งใช้. คุณจะพบว่าหากเราเตอร์ที่ทำ NAPT เริ่มการทำงานใหม่ การเชื่อมต่อทั้งหมดจะหยุดทำงาน ในขณะที่เราเตอร์ที่ไม่มี NAT มักจะทำการเชื่อมต่อต่อ (สมมติว่ารีสตาร์ทเสร็จก่อนไคลเอ็นต์หมดเวลา)

S.B avatar
cn flag
S.B
ใช่ ปัญหาของฉันคือ ตัวอย่างเช่น เมื่อเราใช้พอร์ต 6000 ในแอปพลิเคชันของเรา ฉันคิดว่าพอร์ตนั้นจะถูกวางไว้ในแพ็กเก็ตพร้อมกับ IP (สาธารณะ) ของเราเตอร์... แต่เรื่องจริงเป็นเพราะ PAT พอร์ตอื่นที่สร้างโดยอุปกรณ์ NAT (นี่คือเราเตอร์) ถูกกำหนดให้กับที่อยู่ IP ส่วนตัวของเรา นั่นเป็นวิธีที่เราเตอร์สามารถแยกแยะได้อย่างง่ายดายว่าแพ็กเก็ตใดเป็นของที่อยู่ IP ใด แม้ว่าในตอนแรกจะใช้พอร์ตเดียวกันก็ตาม ฉันถูกไหม ?
se flag
@SorousHBakhtiary เมื่อคุณพูดว่าพอร์ต 6000 คุณหมายถึงบนเซิร์ฟเวอร์หรือไคลเอ็นต์ คุณรู้หรือไม่ว่าทุกแพ็กเก็ตในโปรโตคอล IP นั้นระบุด้วยข้อมูล 4 บิตใช่ไหม ไม่ใช่แค่ 2. พอร์ตไคลเอนต์ (ต้นทาง), ไคลเอนต์ (ต้นทาง) IP, ปลายทาง (เซิร์ฟเวอร์ - ฉันคิดว่านี่คือสิ่งที่คุณหมายถึงโดย 6000) พอร์ต, IP ปลายทาง ดังนั้นแม้ว่าไคลเอ็นต์สองเครื่องบนพีซีเครื่องเดียวกันจะเชื่อมต่อกับ (ปลายทาง) พอร์ต 6000 ระบบปฏิบัติการของคุณก็จะกำหนดพอร์ตต้นทางที่แตกต่างกันแบบสุ่ม นี่คือสิ่งที่เราเตอร์ (และ NAT) ใช้ในการกำหนดเส้นทาง - พอร์ตต้นทาง, IP ต้นทาง, พอร์ตปลายทาง, IP ปลายทาง
Score:5
ธง ru

เราเตอร์ไม่ได้ใช้หมายเลขพอร์ตต้นทางเดียวกันกับที่แล็ปท็อปสร้างในคำขอขาออกไปยัง WAN แต่จะสร้างพอร์ตต้นทางเฉพาะของตัวเอง ตาราง NAT ในเราเตอร์แปลงแล็ปท็อป 1:6000 เป็น publicip:N และแล็ปท็อป 2:6000 เป็น publicip:M จากนั้นระบบจะรู้ว่าจะกำหนดเส้นทางแพ็กเก็ตขาเข้าตามพอร์ตใดที่ทราฟฟิกมาจากอินเทอร์เน็ต

โพสต์คำตอบ

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