Chắc hẳn anh em làm nghề đều rất quen với cảnh debug code ở local. Gõ npm run một phát là trình duyệt tự mở lên một trang web, và trên thanh địa chỉ sẽ hiện ra cái gì đó như http://localhost:xxx/index.html. Nhiều người cứ dùng vậy thôi chứ cũng chưa thực sự để tâm xem localhost và 127.0.0.1 khác nhau chỗ nào. Anh em làm hạ tầng thì còn có thể nắm vững chứ nhiều bác Dev cũng không phân biệt rõ hai thằng này, nên anh em nào chưa biết có thể đọc nhé.

Localhost là cái gì?
localhost là một cái domain name. Về cơ bản, nó không khác gì google.com hay các domain khác mà mọi người hay truy cập, chỉ có điều là nó đặc biệt và dễ nhớ hơn thôi. Phạm vi của localhost chỉ giới hạn trong chính cái máy tính của mọi người đang dùng. Cả ông A và bà B đều có thể dùng localhost trên máy của mình mà không hề đụng chạm gì đến nhau, mỗi người sẽ truy cập vào trang web trên máy của chính họ.
Từ Domain đến Program: Nó chạy như thế nào?
Để thực sự hiểu localhost, mình cần nói qua một chút về cách người dùng truy cập vào một program thông qua domain. Lấy google.com làm ví dụ nhé.
-
Khi mọi người gõ
google.comvào trình duyệt, việc đầu tiên nó làm là hỏi DNS (Domain Name System) xem địa chỉ IP củagoogle.comlà gì.- Tại sao lại cần địa chỉ IP? Anh em hình dung thế này: khi có người gửi bưu phẩm đến công ty của bạn, trên phiếu gửi hàng sẽ có địa chỉ công ty, tên công ty, và tên người nhận. Người giao hàng sẽ dựa vào địa chỉ để tìm đường. Trong thế giới mạng cũng vậy, tên miền (
google.com) giống như tên công ty, còn địa chỉ IP mới là địa chỉ vật lý. Muốn tìm đến đúng chương trình, phải có địa chỉ IP. - DNS nó giống như cuốn danh bạ điện thoại khổng lồ, liệt kê địa chỉ IP tương ứng cho mỗi tên miền. Sau khi mọi người mua một tên miền, nhà cung cấp sẽ giúp đăng ký tên miền và địa chỉ IP của server vào cái DNS này.
- Tại sao lại cần địa chỉ IP? Anh em hình dung thế này: khi có người gửi bưu phẩm đến công ty của bạn, trên phiếu gửi hàng sẽ có địa chỉ công ty, tên công ty, và tên người nhận. Người giao hàng sẽ dựa vào địa chỉ để tìm đường. Trong thế giới mạng cũng vậy, tên miền (
-
Có được địa chỉ IP rồi, trình duyệt sẽ gửi một request đến địa chỉ đó. Request này được hệ điều hành đóng gói lại và truyền đi qua mạng. Các router trên internet sẽ dựa vào địa chỉ IP này để tìm đường và cuối cùng gửi gói tin đến đúng cái máy tính đang giữ IP đó.
-
Một máy tính có thể chạy rất nhiều network programs. Vậy làm sao để request được gửi đến đúng ứng dụng? Đây là lúc port vào việc. Mỗi network programs có thể “nghe” trên một hoặc nhiều port, và hệ thống sẽ không cho phép hai program chiếm dụng cùng một port. Khi gửi request, mình chỉ định thêm port để nó đi đến đúng program.
- Nhưng tại sao khi vào Google mình không cần gõ port? Đó là vì có các port mặc định: 80 cho HTTP và 443 cho HTTPS. Khi không chỉ định port, trình duyệt sẽ tự dùng các port này.

Vậy Localhost và 127.0.0.1 khác nhau chỗ nào?
localhostlà một tên miền, như đã nói ở trên.127.0.0.1là một địa chỉ IP. Cụ thể, nó là một địa chỉ IP đặc biệt, được gọi là địa chỉ loopback, dùng để chỉ chính cái máy tính hiện tại. Mọi người có thể dùng địa chỉ IP này ngay cả khi máy tính không kết nối internet, rất tiện cho việc phát triển và kiểm thử chương trình. Các chương trình debug của anh em đang chạy và “nghe” trên địa chỉ IP này.
Vậy làm sao localhost lại được phân giải ra 127.0.0.1? Có cần hỏi DNS không? Không.
Việc phân giải này được xử lý ngay tại máy tính của mỗi người. Trên mọi máy tính đều có một file tên là hosts, file này chứa một vài quy tắc phân giải DNS được hardcode sẵn. Trong đó có quy tắc mặc định là phân giải localhost thành 127.0.0.1. Đây là một quy ước chung.
Nếu thích, mọi người hoàn toàn có thể sửa file hosts để đặt tên khác, ví dụ maycuatoi, và trỏ nó về 127.0.0.1. Thậm chí mọi người có thể trỏ google.com về 127.0.0.1 cũng được, nhưng nó chỉ có tác dụng trên máy của mọi người thôi, không ảnh hưởng đến ai khác.
Chạy nhiều Website trên cùng một IP và Port
Các network programs khác nhau không thể dùng chung một port, nhưng vẫn có cách để lách luật.
Ngày xưa, các nhà cung cấp virtual host có thể nhét hàng chục, hàng trăm trang web trên cùng một máy chủ vật lý, và tất cả mọi người đều truy cập vào trang của mình qua port 80 mặc định. Làm sao họ làm được điều đó?
Nếu mọi người đã từng làm việc với web server như Nginx, Apache, hay IIS, chắc sẽ quen với khái niệm host header. Host header về cơ bản chính là domain. Bằng cách thiết lập host header, các program có thể chia sẻ cùng một port mạng.
Cơ chế hoạt động như sau:
- Khi khởi động, Nginx sẽ chiếm lấy port 80 cho riêng mình.
- Khi một request truy cập website đến port 80 của Nginx, nó sẽ nhìn vào domain trong request (chính là host header).
- Dựa vào domain này, Nginx sẽ biết được request này dành cho website nào đã được cấu hình trong nó.
- Nginx sau đó sẽ chuyển tiếp request đến web tương ứng.
Địa chỉ IP Private
Ngoài 127.0.0.1, còn có nhiều địa chỉ IP private khác, ví dụ như dải 192.168.x.x rất quen thuộc. Các địa chỉ IP này được dành riêng để sử dụng trong mạng nội bộ (LAN). Công ty của bạn có thể dùng địa chỉ 192.168.1.1, và công ty tôi cũng có thể dùng 192.168.1.1 mà không bị xung đột.
Các dải IP private phổ biến của IPv4 bao gồm:
- Lớp A:
10.0.0.0đến10.255.255.255 - Lớp B:
172.16.0.0đến172.31.255.255 - Lớp C:
192.168.0.0đến192.168.255.255
Ngoài ra, còn có một số dải IP được dành riêng khác:
- Dải
127.0.0.0đến127.255.255.255được dùng cho loopback testing, trong đó có địa chỉ127.0.0.1. Mọi người tự gán cho mình IP127.0.0.2cũng sẽ hoạt động y hệt127.0.0.1. - Dải
169.254.0.0đến169.254.255.255được dùng khi máy tính không kết nối được vào mạng LAN và không nhận được IP từ DHCP server.
Về IPv6
Mọi người có thể đã nghe về IPv6, được giới thiệu vì không gian địa chỉ của IPv4 đã cạn kiệt. Về lý thuyết, IPv6 có thể gán một địa chỉ IP cho mỗi hạt cát trên Trái Đất. Mặc dù đã được nói đến nhiều năm, IPv4 vẫn phổ biến hơn vì nhiều lý do.
Một địa chỉ IPv6 trông như thế này: 2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b. Nó dài 128 bit, dài hơn rất nhiều so với 32 bit của IPv4.







