ความแตกต่างระหว่าง 0.0.0.0, 127.0.0.1 และ localhost คืออะไร


271

ฉันกำลังใช้JekyllและVagrantบน mac ของฉัน ฉันพบว่าJekyll serverจะผูกกับแทน0.0.0.0:4000 127.0.0.1:4000นอกจากนี้gem serverจะผูกกับที่อยู่นี้เป็นค่าเริ่มต้น http://localhost:portฉันยังคงสามารถเข้าชมได้ผ่านทาง แต่สำหรับJekyll, ดูเหมือนว่าตั้งค่าเริ่มต้น (เช่น 0.0.0.0:4000) ต้องการการเข้าถึงอินเทอร์เน็ต ฉันไม่สามารถทำงานได้Jekyll serverหากไม่มีอินเทอร์เน็ต มันเป็นข้อบกพร่องเล็ก ๆ ?

Vagrantฉันยังใช้ ฉันได้ตั้งค่าการส่งต่อพอร์ต (8080 => 4000) ใน Vagrantfile ตั้งแต่ฉันติดตั้งJekyllในVagrantเครื่องเสมือนและทดสอบภายใต้ Macintosh ถ้าฉันใช้การตั้งค่าเริ่มต้น (0.0.0.0:4000) ก็ใช้งานได้ http://localhost:8080ฉันสามารถเยี่ยมชมได้จากซาฟารีของฉันด้วย แต่ถ้าไม่มีอินเทอร์เน็ตฉันไม่สามารถผูกกับ 0.0.0.0:4000 ผมใช้jekyll server -H 127.0.0.1ในการให้บริการผูกไว้กับแทนแล้วฉันไม่สามารถเข้าชมได้ผ่านทาง127.0.0.1:4000http://localhost:8080

ทุกคนสามารถอธิบายความแตกต่างระหว่าง 0.0.0.0, 127.0.0.1 และ localhost ได้หรือไม่ และทุกคนสามารถอธิบายได้ว่าทำไมแตกต่างกันจะทำให้เกิดปัญหานี้ ?


บทความนี้อาจเป็นประโยชน์ได้อย่างไรhowtogeek.com/225487/…
fangxing

คำตอบ:


408

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

"localhost" เป็นชื่อโฮสต์สำหรับที่127.0.0.1อยู่ IP มันมักจะตั้งอยู่ใน/etc/hosts(หรือเทียบเท่า Windows ที่มีชื่อว่า "โฮสต์" บางแห่งภายใต้%WINDIR%) คุณสามารถใช้มันเหมือนกับชื่อโฮสต์อื่น ๆ - ลอง "ping localhost" เพื่อดูว่ามันแก้ปัญหา127.0.0.1ได้อย่างไร

0.0.0.0มีความหมายที่ต่างกันสองสามอย่าง แต่ในบริบทนี้เมื่อเซิร์ฟเวอร์ถูกบอกให้ฟัง0.0.0.0นั่นหมายถึง "ฟังในทุก ๆ อินเตอร์เฟสเครือข่ายที่มี" อะแดปเตอร์ลูปแบ็คที่มีที่อยู่ IP 127.0.0.1จากมุมมองของกระบวนการเซิร์ฟเวอร์ดูเหมือนกับอะแดปเตอร์เครือข่ายอื่น ๆ ในเครื่องดังนั้นเซิร์ฟเวอร์ที่บอกให้รับฟัง0.0.0.0จะยอมรับการเชื่อมต่อบนอินเทอร์เฟซนั้นด้วย

หวังว่าจะได้คำตอบด้าน IP ของคำถามของคุณ ฉันไม่คุ้นเคยกับ Jekyll หรือ Vagrant แต่ฉันเดาว่าการส่งต่อพอร์ตของคุณ8080 => 4000จะเชื่อมโยงกับอะแดปเตอร์เครือข่ายเฉพาะดังนั้นจึงไม่ได้อยู่ในเส้นทางเมื่อคุณเชื่อมต่อภายในเครื่อง127.0.0.1


อืมping localhostดูเหมือนว่าจะทำงานบน Windows แม้จะ ไม่มีไฟล์โฮสต์ที่ชี้127.0.0.1ไปlocalhostก็ตาม
Pacerier

เห็นด้วยกับ Pacerier อย่างน้อยใน Windows localhost จะทำงานเป็น 0.0.0.0 (ไม่ใช่ 127.0.0.1) โดยค่าเริ่มต้น
drodsou

5
"นี่ถูกต้องส่วนใหญ่ยกเว้นคำอธิบายของคุณที่มีผลผูกพันกับ 0.0.0.0 สิ่งนี้ไม่ผูกมัด ส่วนต่อประสานเครือข่ายที่มีอยู่ตามที่คุณอธิบาย แต่จะผูกกับที่อยู่ทั้งหมดในสแต็ค TCP ของ @strangemonad.
Piotr Dobrogost

15

ในรุ่นปัจจุบันของ Jekyll มันเริ่มต้นที่http://127.0.0.1:4000/
นี่เป็นสิ่งที่ดีถ้าคุณเชื่อมต่อกับเครือข่าย แต่ไม่ต้องการให้บุคคลอื่นเข้าถึงแอปพลิเคชันของคุณ

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

ในกรณีนั้นคุณสามารถใช้

jekyll serve --host 0.0.0.0

สิ่งนี้จะผูกแอปพลิเคชันของคุณกับโฮสต์ & ใช้งานต่อไปเพื่อเชื่อมต่อกับโฮสต์อื่น

http://host's IP adress/4000 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.