Kết nối với IP 0.0.0.0 thành công. Làm sao? Tại sao?


41

Chúng tôi đang phục vụ một cổng trên localhost và muốn kiểm tra quy trình khác nếu cổng đó khả dụng. Do một lỗi trong mã của chúng tôi, nó thực sự đang cố gắng kết nối với IP 0.0.0.0:<port>và vì một lý do nào đó, nó thành công - như strace chứng minh:

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

Nó có nghĩa là gì? Tại sao nó hoạt động?


Câu trả lời:


68

0.0.0.0 với tư cách là một địa chỉ đích đề cập đến một máy chủ không thể định tuyến hoặc để lưu trữ máy chủ này . Trong thực tế, kết nối với 0.0.0.0 tương đương với kết nối với localhost. (Nói đúng ra nó không hợp lệ như một địa chỉ đích, chỉ là một địa chỉ nguồn, nhưng thực tế không phù hợp với lý thuyết.)

Khi liên kết, máy chủ lưu trữ này, máy chủ lưu trữ mở rộng đến bất kỳ địa chỉ nào trên máy chủ lưu trữ này - vì vậy các ứng dụng thường chấp nhận các kết nối bằng cách liên kết với 0.0.0.0, có nghĩa là chúng sẽ nhận được các gói được gửi đến bất kỳ địa chỉ IPv4 nào trên hệ thống.


7
Để mở rộng câu trả lời này một chút - nó có nghĩa là "bất kỳ địa chỉ IP nào trên hệ thống này, bao gồm cả IP đã được thêm sau khi quá trình nghe bắt đầu"
Criggie

5
localhost là một địa chỉ duy nhất, chủ yếu là 127.0.0.1, trong khi 0.0.0.0 có nghĩa là tất cả các địa chỉ trên máy chủ này.
rexkogitans

@rexkogitans localhost không phải là một địa chỉ, mà là bất kỳ địa chỉ nào trong phạm vi 127.0.0.0/8 - tức là bất kỳ địa chỉ nào từ 127.0.0.0 đến 127.255.255.255
Dezza

6
@Dezza Không, localhost là 127.0.0.1. 127.0.0.0/8 (như bạn nói, còn gọi là 127.0.0.0 đến 127.255.255.255) là loopback với hầu hết các thiết bị, ví dụ như được ghi lại bởi RFC 5735 trang 4 . (Thật thú vị, một số thiết bị của Cisco có thể gán loopback cho bất kỳ địa chỉ nào, nhưng mặc định không hỗ trợ loopback. Không phải điều này có thể ảnh hưởng đến các thiết bị khác trên mạng.) Tuy nhiên, localhost là một tên, thường chỉ trỏ đến một địa chỉ 127.0.0.1 và thường được thực hiện bằng cách sử dụng tệp "máy chủ". Vì vậy, tôi không đồng ý với sự cố gắng của bạn.
TUYỆT VỜI

Bạn có thể làm rõ ý của bạn bằng cách "nó không hợp lệ làm địa chỉ đích, chỉ là địa chỉ nguồn"? Khi máy chủ mysql lắng nghe tại 0.0.0.0, là địa chỉ đích hay nguồn? Nó không phải là đích đến của một yêu cầu được gửi từ máy khách mysql?
Tim
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.