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à 127
gì? "ý nghĩa" của là 0.0.1
gì?
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à 127
gì? "ý nghĩa" của là 0.0.1
gì?
Câu trả lời:
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.1
là địa chỉ được gán đầu tiên trong mạng con. 127.0.0.0
khô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.1
nế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.
Đề 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.
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.
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.
Đầ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 :)
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.