การเชื่อมต่อกับ IP 0.0.0.0 สำเร็จ อย่างไร? ทำไม?


41

เราให้บริการพอร์ตบนโลคัลโฮสต์และต้องการเช็คอินกระบวนการอื่นหากพอร์ตพร้อมใช้งาน เนื่องจากข้อผิดพลาดในรหัสของเราเป็นจริงพยายามเชื่อมต่อกับ IP 0.0.0.0:<port>และด้วยเหตุผลบางอย่างมันประสบความสำเร็จ - เป็น strace พิสูจน์:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

มันหมายความว่าอะไร? ทำไมมันทำงาน


คำตอบ:


68

0.0.0.0 เป็นที่อยู่นานัปการเป้าหมายหมายไปยังพื้นที่ที่ไม่สามารถกำหนดเส้นทางหรือ“โฮสต์นี้” ในทางปฏิบัติการเชื่อมต่อกับ 0.0.0.0 เทียบเท่ากับการเชื่อมต่อกับ localhost (การพูดอย่างเคร่งครัดมันไม่ถูกต้องในฐานะที่อยู่ปลายทางเป็นเพียงที่อยู่ต้นทาง แต่การฝึกฝนไม่ตรงกับทฤษฎี)

เมื่อทำการรวม“ โฮสต์นี้” จะขยายเป็น“ ที่อยู่ใด ๆ บนโฮสต์นี้” - ดังนั้นแอปพลิเคชันทั่วไปยอมรับการเชื่อมต่อโดยเชื่อมโยงกับ 0.0.0.0 ซึ่งหมายความว่าพวกเขาจะได้รับแพ็กเก็ตที่ส่งไปยังที่อยู่ IPv4 ใด ๆ บนระบบ


7
เพื่อขยายคำตอบนี้เล็กน้อย - หมายถึง "ที่อยู่ IP ใด ๆ ในระบบนี้รวมถึง IP ที่เพิ่มหลังจากเริ่มฟังกระบวนการ"
Criggie

5
localhost เป็นที่อยู่เดียวส่วนใหญ่ 127.0.0.1 ในขณะที่ 0.0.0.0 หมายถึงที่อยู่ทั้งหมดในโฮสต์นี้
rexkogitans

@rexkogitans localhost ไม่ใช่ที่อยู่เดียว แต่ที่อยู่ใด ๆ ในช่วง 127.0.0.0/8 - เช่นที่อยู่ใดก็ได้ตั้งแต่ 127.0.0.0 ถึง 127.255.255.255
Dezza

6
@Dezza ไม่ localhost คือ 127.0.0.1 127.0.0.0/8 (ตามที่คุณบอกว่าอาคา 127.0.0.0 ผ่าน 127.255.255.255) เป็นย้อนกลับด้วยอุปกรณ์ที่มากที่สุดเช่นการบันทึกโดยRFC 5735 หน้า 4 (น่าสนใจอุปกรณ์ Cisco บางตัวสามารถกำหนดลูปแบ็คไปยังที่อยู่ใดก็ได้ แต่ค่าเริ่มต้นจะไม่รองรับลูปแบ็คเลยไม่ว่าจะมีผลกระทบต่ออุปกรณ์อื่น ๆ ในเครือข่าย) อย่างไรก็ตาม localhost เป็นชื่อโดยทั่วไปแล้วชี้ไปที่เดียว ที่อยู่ซึ่งเป็น 127.0.0.1 และดำเนินการโดยทั่วไปโดยใช้ไฟล์ "โฮสต์" ดังนั้นฉันจึงไม่เห็นด้วยกับการแก้ไขที่คุณพยายามทำ
TOOGAM

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