Tại sao IP cục bộ IP 127.0.0.1?


85

Tôi tự hỏi đâu là nguồn gốc của quyết định tạo localhostđịa chỉ IP 127.0.0.1. "Ý nghĩa" của là 127gì? "ý nghĩa" của là 0.0.1gì?


2
Tôi cũng tò mò về điều này. Vòng lặp IPv6 là 0: 0: 0: 0: 0: 0: 0: 1, điều này có ý nghĩa với tôi.
hyperslug

1
Có, localhost của IPv6 không đặt ra quá nhiều câu hỏi :)
Roee Adler

21
Tôi chưa thấy một tấm thảm cửa "Không có nơi nào như 0: 0: 0: 0: 0: 0: 1"!
William Hilsum

9
@Wil Nén nó thành "không có nơi nào như :: 1" và bạn sẽ có thêm một chút kinh doanh.
new123456

6
@WilliamHilsum mở rộng nó thành "Không có nơi nào như 0000: 0000: 0000: 0000: 0000: 0000: 0000: 0001" và tính phí nhiều hơn.
Nick T

Câu trả lời:


87

127 là số mạng cuối cùng trong mạng loại A có mặt nạ mạng con là 255.0.0.0. 127.0.0.1là địa chỉ được gán đầu tiên trong mạng con. 127.0.0.0không thể được sử dụng bởi vì đó sẽ là số dây. Nhưng sử dụng bất kỳ số nào khác cho phần máy chủ sẽ hoạt động tốt và trở lại sử dụng 127.0.0.1. Bạn có thể tự thử bằng cách ping 127.1.1.1nếu bạn muốn. Tại sao họ đợi cho đến khi số mạng cuối cùng thực hiện điều này? Tôi không nghĩ rằng nó đã được ghi nhận.


14
Những lý do duy nhất tôi thấy họ tùy ý chọn 127 là vì đó là một số dễ nhớ (01111111) và có lẽ họ đã cho phép 16 triệu địa chỉ máy chủ chỉ có thể giao tiếp với chính nó (như cách một số chương trình và các thành phần Windows sử dụng cảng ngày nay). Các RFC chỉ thực sự đề cập rằng đó là thông lệ tiêu chuẩn cho 127.0.0.1 / 32 được sử dụng cho loopback. Nó khá mơ hồ về những gì họ dự định cho phần còn lại của khối ngoài việc nó lặp lại với máy chủ và không bao giờ truy cập mạng, do đó tôi suy đoán ở trên.
RoyalKnight

2
Có tất cả các địa chỉ khối trở lại 127.0.0.1 là phụ thuộc vào việc triển khai và có lẽ chỉ là một đặc thù của ngăn xếp Linux. Solaris ít nhất yêu cầu một giao diện được liên kết với địa chỉ đích để thử nghiệm ping của bạn thành công.
jlliagre

56

Đề cập sớm nhất tôi có thể tìm thấy về nhiệm vụ của 127 khi loopback là tháng 11 năm 1986 RFC 990 được tác giả bởi Reynold và Postel:

Địa chỉ số 0 được hiểu là "cái này", như trong "mạng này".

Ví dụ: địa chỉ 0.0.0.37 có thể được hiểu là máy chủ nghĩa là 37 trên mạng này.

...

Lớp mạng số 127 được gán chức năng "loopback", nghĩa là một datagram được gửi bởi giao thức cấp cao hơn tới địa chỉ mạng 127 sẽ lặp lại bên trong máy chủ. Không có datagram "được gửi" đến một địa chỉ mạng 127 sẽ xuất hiện trên bất kỳ mạng nào ở bất cứ đâu.

Ngay từ đầu tháng 9 năm 1981, RFC 790 , 0 và 127 đã được bảo lưu:

000.rrr.rrr.rrr Dành riêng [JBP]
...
127.rrr.rrr.rrr Dành riêng [JBP]

0 và 127 là các mạng Class A dành riêng duy nhất vào năm 1981. 0 được sử dụng để trỏ đến một máy chủ cụ thể, do đó, còn lại 127 cho loopback.

Tôi biết điều này không trả lời câu hỏi, nhưng điều này càng xa càng tốt. Có thể có ý nghĩa hơn khi chọn 1.0.0.0 cho loopback nhưng điều đó đã được trao cho Mạng vô tuyến gói BBN.


23

Các nhà thiết kế của Internet thực sự biết phần cứng hoạt động như thế nào và họ đã thiết kế với mức độ thực thi thấp.

Các giá trị 0, 127 và 255 đặc biệt trong lắp ráp 8 bit và lập trình ngôn ngữ máy vì có "thủ thuật" bạn có thể sử dụng để kiểm tra các giá trị này và phân nhánh thành các mã khác nhau bằng cách sử dụng các lệnh nhỏ hơn thực thi nhanh hơn so với các số nguyên khác. 127 là số nguyên 8 bit được ký cao nhất, do đó, tăng nó lên 1 sẽ gây ra tràn tràn đã ký. Tương tự, tăng 255 sẽ gây ra tràn không dấu. Chỉ tải giá trị 0 vào một thanh ghi thường sẽ đặt cờ không trên chip. Hãy tưởng tượng chương trình mạng trông như thế này trong mã giả:

if (value == 0) doLocal();
if (value == 127) doLoopback();
if (value == 255) doNetwork();

Mặc dù phụ thuộc vào chip, vào thời đó, hầu hết các chip có thể mã hóa các bài kiểm tra này với 2 từ, 3 từ và 3 từ tương ứng (tổng cộng 8 từ) và hơn nữa các bài kiểm tra cụ thể đó đều có khả năng thực hiện trong mỗi chu kỳ 1 đồng hồ. Sử dụng bất kỳ giá trị nào khác có thể sẽ yêu cầu 4 từ mỗi từ (tổng cộng 12 từ), tăng 50% kích thước mã và có khả năng tăng 50% về thời gian thực hiện.


1
Lưu ý rằng tôi đã sử dụng "từ" vì các máy cũ trước đó có kích thước từ khác thường, nhưng chúng vẫn thường sử dụng số học 8 bit. Đối với một 8088, tôi sẽ nói "byte."
Joseph Bùi

5

Nếu bạn nghĩ về địa chỉ IP localhost hoặc loopback nghĩa là gì, bạn nhận ra rằng bạn không bao giờ muốn xem địa chỉ đó hoặc mạng mà địa chỉ đó thuộc về bên ngoài máy chủ. (Bên trong máy chủ lưu trữ, quá tối để nhìn thấy nó. Xin lỗi Mark Twain.)

Vì vậy, ai đó đã phải chọn một mạng IP để đại diện cho địa chỉ localhost này. Tôi không nhớ ai là người đầu tiên đã chọn nó, nhưng nó được chỉ định trong Yêu cầu Nhận xét của IETF được phát hành định kỳ là "Yêu cầu máy chủ".

Nó đã được thực hiện từ lâu, rằng ý tưởng "lãng phí" toàn bộ địa chỉ lớp A không đi vào tâm trí của bất cứ ai vào thời điểm đó.

Tiện ích của localhost là bạn có thể nói chuyện với chính mình bằng địa chỉ IP được mã hóa cứng. Nó đã được sử dụng từ lâu trước khi có Hệ thống tên miền. Bạn thực sự có thể sử dụng bất kỳ địa chỉ hợp lệ 127.xxx nào, nhưng không ai từng làm như vậy. Bạn không thể lẻn và sử dụng 127 như một mạng thực sự vì RFC "Yêu cầu bộ định tuyến" không cho phép định tuyến mạng đó trên bất kỳ internet nào.


4

Đầu tiên, toàn bộ phạm vi 127.xxx trỏ đến localhost của bạn.
127 trong nhị phân là "01111111". "11111111" = 255 và 0 được bảo lưu, vì vậy sự lựa chọn là hiển nhiên :)


25
Làm thế nào mà nó lại rõ ràng một lần nữa?
Roee Adler

Tôi tin rằng họ chỉ chọn một cái gì đó đơn giản. Một lần nữa, tất cả "1" được bảo lưu, vì vậy một số 0 đã được thêm vào :)
kolypto

vậy tại sao không 10111111? :) hoặc 11011111 hoặc 11101111 hoặc 11110111 hoặc 11111011 hoặc 11111101 hoặc một cái gì đó giống như nó?
Mushex Antaranian

1
Không. Thử lại.
Ardee Aram

4

Bởi vì khi các tiêu chuẩn đó được tạo ra, máy tính hoạt động chậm và thường giới hạn ở các thanh ghi 8 bit. So sánh số với số rất chậm, đặc biệt nếu những số đó phải được tìm nạp từ phía sau thì THỰC SỰ bộ nhớ chậm. Các thanh ghi, đó là lưu trữ "CPU trên tàu" nhanh hơn nhiều.

Ngoài ra, các máy tính cũ đó còn có các hướng dẫn đặc biệt, nhanh hơn để phát hiện "bằng 0", "khác 0", "số nguyên âm / dương" (trong đó dấu hiệu là ... đoán xem, bit ngoài cùng bên trái, bây giờ thấy kết nối với 127 , đó là số có tất cả nhị phân "1" ngoại trừ dấu ngoài cùng = dấu?).

Do đó, đây là những con số đặc biệt, vì chúng cho phép các thủ thuật lập trình tiết kiệm rất nhiều chu kỳ CPU cho các hoạt động thường xuyên được thực hiện.

Bạn sẽ không bao giờ thấy hướng dẫn "IF CallerIP =" 0 "mà là hướng dẫn" IF NotZero (CallerIP) ".

Bạn có thể kiểm tra hướng dẫn lắp ráp cổ như "BEQ, BNE" (CPU 6502) để được giải thích lâu hơn. Ngoài ra kiểm tra trang này ra .

Đến cuối cùng:

Tất cả 0, 255 và 127 đều có thể được kiểm tra bằng một lệnh nhanh nhất. Ngay cả các ngôn ngữ cấp cao hơn như C cũng có các hàm so sánh "rút gọn" mà trình biên dịch có thể tối ưu hóa bên trong thành một lệnh.

Các lập trình viên năm 70 và 80 thực sự tạo ra các kiến ​​trúc tuyệt vời với nguồn tài nguyên siêu khan hiếm, đằng sau các tiêu chuẩn như đánh số IP có rất nhiều suy nghĩ và thiên tài.


Câu trả lời chính xác. Đây thực sự là lời giải thích rõ ràng và hợp lý nhất.
not2qubit

Trên thực tế, trở lại khi IP được thiết kế và một số nền tảng ban đầu cho nó đã được đặt xuống, làm việc với dữ liệu theo bội số nguyên 8 bit không phải là một điều nhất định. Nhiều kiến ​​trúc tại thời điểm đó có các thanh ghi và kích thước từ trong bội số của 12 hoặc 18 bit chẳng hạn. Đây là một lý do tại sao bát phân rất phổ biến vào thời điểm đó; 18 bit có thể được biểu diễn dưới dạng chính xác 6 chữ số bát phân mà không mất và không lãng phí; 12 bit là 4 chữ số bát phân. Máy vi tính thường làm việc với số lượng 8-bit, nhưng nó đã được chỉ nhiều sau đó máy vi tính bắt đầu được thường xuyên kết nối (đặc biệt là trực tiếp) với Internet.
một CVn
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.