Sự khác biệt giữa 0.0.0.0, 127.0.0.1 và localhost là gì?


271

Tôi đang sử dụng JekyllVagranttrên máy Mac của tôi. Tôi thấy rằng Jekyll serversẽ liên kết với 0.0.0.0:4000thay vì 127.0.0.1:4000. Cũng gem serversẽ liên kết với địa chỉ này theo mặc định. Tôi vẫn có thể truy cập nó thông qua http://localhost:port. Nhưng đối với Jekyll, có vẻ như cài đặt mặc định (ví dụ: 0.0.0.0:4000) yêu cầu truy cập Internet. Tôi không thể chạy Jekyll servermà không có Internet. Có phải là một lỗi nhỏ?

Tôi cũng dùng Vagrant. Tôi đã đặt chuyển tiếp cổng (8080 => 4000) trong Vagrantfile, vì tôi cài đặt Jekylltrong Vagrantmáy ảo và kiểm tra nó trong Macintosh. Nếu tôi sử dụng cài đặt mặc định (0.0.0.0:4000), nó sẽ hoạt động. Tôi có thể truy cập nó từ safari của tôi với http://localhost:8080. Nhưng nếu không có internet, tôi không thể liên kết với 0.0.0.0:4000. Tôi sử dụng jekyll server -H 127.0.0.1để ràng buộc dịch vụ 127.0.0.1:4000thay vào đó, sau đó tôi không thể truy cập nó qua http://localhost:8080.

Bất cứ ai cũng có thể giải thích sự khác biệt giữa 0.0.0.0, 127.0.0.1 và localhost ? Và bất cứ ai có thể giải thích tại sao sự khác biệt sẽ gây ra vấn đề này ?


Bài viết này có thể hữu ích howtogeek.com/225487/...
Fangxing

Câu trả lời:


408

127.0.0.1thông thường là địa chỉ IP được gán cho giao diện "loopback" hoặc chỉ cục bộ. Đây là bộ điều hợp mạng "giả" chỉ có thể giao tiếp trong cùng một máy chủ. Nó thường được sử dụng khi bạn muốn một ứng dụng có khả năng kết nối mạng chỉ phục vụ khách hàng trên cùng một máy chủ. Một quá trình lắng nghe127.0.0.1 các kết nối sẽ chỉ nhận các kết nối cục bộ trên ổ cắm đó.

"localhost" thường là tên máy chủ cho 127.0.0.1địa chỉ IP. Nó thường được đặt trong /etc/hosts(hoặc tương đương Windows có tên "máy chủ" ở đâu đó bên dưới %WINDIR%). Bạn có thể sử dụng nó giống như bất kỳ tên máy chủ nào khác - thử "ping localhost" để xem cách giải quyết 127.0.0.1.

0.0.0.0có một vài ý nghĩa khác nhau, nhưng trong bối cảnh này, khi một máy chủ được yêu cầu lắng nghe 0.0.0.0có nghĩa là "lắng nghe trên mọi giao diện mạng có sẵn". Bộ điều hợp loopback có địa chỉ IP 127.0.0.1từ góc độ của quy trình máy chủ trông giống như bất kỳ bộ điều hợp mạng nào khác trên máy, vì vậy một máy chủ được yêu cầu lắng nghe0.0.0.0 cũng sẽ chấp nhận kết nối trên giao diện đó.

Điều đó hy vọng sẽ trả lời phía IP của câu hỏi của bạn. Tôi không quen thuộc với Jekyll hoặc Vagrant, nhưng tôi đoán rằng việc chuyển tiếp cổng của bạn 8080 => 4000bằng cách nào đó bị ràng buộc với một bộ điều hợp mạng cụ thể, vì vậy nó không nằm trong đường dẫn khi bạn kết nối cục bộ với127.0.0.1


Hmm, ping localhostdường như hoạt động trên Windows ngay cả khi không có tệp máy chủ trỏ 127.0.0.1đến localhost.
Pacerier

Đồng ý với Pacerier. Ít nhất là trong Windows, localhost hoạt động như 0.0.0.0 (không phải 127.0.0.1) theo mặc định
drodsou

5
"Điều này hầu như đúng ngoại trừ mô tả ràng buộc của bạn với 0.0.0.0. Điều này không liên kết với mọi giao diện mạng có sẵn như bạn đã mô tả mà chỉ liên kết với tất cả các địa chỉ . Trong ngăn xếp TCP, điều này được gọi là INADDR_ANY - từ câu trả lời đã bị xóa của @strangemonad.
Piotr Dobrogost

15

Trong phiên bản hiện tại của Jekyll, nó mặc định là http://127.0.0.1:4000/ .
Điều này là tốt, nếu bạn được kết nối với mạng nhưng không muốn ai khác truy cập ứng dụng của mình.

Tuy nhiên, có thể bạn muốn xem ứng dụng của mình chạy trên điện thoại di động hoặc từ một số máy tính xách tay / máy tính khác.

Trong trường hợp đó, bạn có thể sử dụng

jekyll serve --host 0.0.0.0

Điều này liên kết ứng dụng của bạn với máy chủ và sử dụng tiếp theo sau để kết nối với ứng dụng đó từ một số máy chủ khác

http://host's IP adress/4000 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.