[Infrastructure] 127.0.0.1

Introduction

127.0.0.1 là daỹ số cực kỳ quen thuộc, chúng ta gặp nó hàng ngày và làm việc với nó hàng ngày ( dĩ nhiên chúng ta ở đây là những developer 😄 ). Nếu xem trong file /etc/hosts thì domain localhost được hệ điều hành map với 127.0.0.1 và nó còn được gọi là loopback IP. Vậy chính xác loopback IP là gì ? Để trả lời câu hỏi này sẽ cần 1 vài kiến thức liên quan đến Infrastructure từ thời đại học đó là về TCP/IP. Bài viết này tôi mang đến 1 cái nhìn tổng quan về IP protocol cũng như trả lời cho câu hỏi đầu bài.

Trong quá trình viết bài này thì tôi cũng tham khảo 1 vài tài liệu tiếng Việt, nhưng nhận ra còn khá nhiều chỗ chưa thỏa đáng - thậm chí cả với những tài liệu chính thống của các trường đại học 😃

IP Address

Đây là các ví dụ về IP Address:

  • 172.16.254.1
  • 192.168.1.1 (thấy quen quen không ?)
  • 2001:db8:0🔢0:567:8:1

IP Address - hay Internet Protocol Address là dãy số được DHCP server chỉ định cho mỗi thiết bị khi nó kết nối với network. Hiện nay có 2 version của IP Address đang được sử dụng song song.

  • IPv4: độ dài 32 bits (172.16.254.1)
  • IPv6: độ dài 128 bits (2001:db8:0🔢0:567:8:1)

IP Address khác với MAC Address, MAC Address là địa chỉ vật lý cố định của các thiết bị được sử dụng để truyền trực tiếp các gói tin trong mạng local. Còn IP Address được sử dụng để định ra địa điểm của 1 thiết bị trong mạng LAN, WAN, hay internet.

IP Address được quản lý bởi IANARIRs. Các tổ chức này chịu trách nhiệm phân phối các IP Address tới các nhà cung cấp Internet. Đó còn được gọi là các Public IP Address. Trái với Public IP Address ta cũng có Private IP Address, đây là địa chỉ IP được các nhà cung cấp dịch vụ hoặc admin của hệ thống chỉ định cho các thiết bị client. Dễ thấy những thiết bị không sử dụng Public IP Address không thể tương tác trực tiếp với internet mà phải thông qua NAT.

Private IP Address được IANA quy định, những IP nằm ngoài dải Private đương nhiên là Public IP Address.

  • 10.0.0.0 – 10.255.255.255 (Có tổng cộng 16,777,216 địa chỉ)
  • 172.16.0.0 – 172.31.255.255 (Có tổng cộng 1,048,576 địa chỉ)
  • 192.168.0.0 – 192.168.255.255 (Có tổng cộng 65,536 địa chỉ)

IANA dựa vào đâu để gán những IP cho các tổ chức cấp thấp hơn ? Đây được gọi là kỹ thuật Subnetting vậy thì Subnetting & Subnetmask là gì ? Chúng ta sẽ cùng tìm hiểu ở phần sau.

IP Classes

Ngược dòng lịch sử 1 chút, thưở sơ khai từ thời IPv4 mới ra đời, người ta sử dụng 8 bit đầu tiên của dãy IP để định ra địa chỉ của network mà thiết bị (còn gọi là host) đang thuộc về được gọi là network number field , 24 bits còn lại là địa chỉ của host bên trong network được gọi là rest field.

network_number_field.rest_field.rest_field.rest_field

Rất nhanh chóng, kiến trúc này đã không thể đáp ứng nổi tốc độ mở rộng của mạng. Nó chỉ support tối đa 254 network còn số lượng máy hosts lên đến hàng trăm triệu địa chỉ.

Classful network

Để giải quyết nhu cầu mở rộng, giải pháp là tăng số lượng bit của network number field. Thay vì cố định 8 bit đầu tiên để biểu diễn Network Address, người ta có thể dùng 16 hoặc thậm chí 24 tùy vào nhu cầu phân chia network. Kiến trúc này được gọi là Classful Addresses, có 3 Class chính A, B và C được sử dụng làm địa chỉ cho Network, càng nhiều network đồng nghĩ số lượng hosts trên mỗi networks bị giới hạn ít hơn. Để phân loại theo Class, đơn giản chúng ta sẽ sử dụng từng bit đầu tiên trong dãy của địa chỉ IP, theo 1 cách lần lượt.

Dễ dàng bạn có thể tìm thấy tài liệu về phân chia IP Address theo lớp cũng như tác dụng của từng lớp: http://aptech.vn/kien-thuc-tin-hoc/ip-subnet-mask-la-gi.html

Tuy vậy, đây là 1 kiến trúc đã lỗi thời không còn được sử dụng, mặc dù tăng số lượng địa chỉ network nhưng vẫn không thể ngăn chặn được việc thiếu hụt IP Address. Khoảng cách về mặt số lượng địa chỉ giữa các Class là quá lớn.

Nhiều tài liệu chính thống và không chính thống ở Việt Nam - thậm chí giáo trình CCNA - vẫn đang Classful Network vào giảng dạy mà không lưu ý điều này dẫn đến nhầm lẫn cho người đọc.

Tất yếu, nó đã được thay thế bằng các phương pháp ưu việt hơn đó là Subnet MaskClassless Inter-Domain Routing.

Classless Inter-Domain Routing

CIDR được Internet Engineering Task Force giới thiệu vào năm 1993 nhằm thay thế kiến trúc Classful Network, mục tiêu của nó nhằm làm chậm tốc độ thiếu hụt của IPv4 Address. Theo CIDR thì IP Address được cấu thành bao gồm 2 nhóm bitwise:

  • Most significant bits được gọi là Network Prefix - Most significant bits có nghĩa là bit có đại diện cho giá trị lớn nhất trong dãy (ví dụ dãy : 011001 thì 2 Most significant bits là phần tử bit 0 và 1 ở vị trí đầu tiên ). Network prefix sử dụng để nhận diện Network hoặc Subnet.
  • Least significant bits (đại diện cho giá trị nhỏ nhất) sử dụng để nhận diện các thiết bị trong network.

Các IP Address được biểu diễn theo CIDR có dạng:

  • 192.168.2.0/24 - v4
  • 2001:db8:😕32 - v6

Suffix sau dấu "/" biểu thị network prefix, với cách biểu diễn như thế này cho phép chỉ định độ dài của Prefix Network linh hoạt hơn nhiều so với kiến trúc Classful. Đây cũng là kiến trúc được sử dụng rộng rãi nhất hiện nay.

Assignment of CIDR

Không có gì khác biệt so với kiến trúc cũ, tổ chức IANA phân chia các dải IP cho RIRs và RIRs chịu trách nhiệm phân chia địa chỉ IP cho nhà cung cấp. Nhà cung cấp dịch vụ lại phân chia IP cho end-user của mình.

Subnetwork

Subnet Mask

Mặc dù số lượng địa chỉ IP là rất nhiều nhưng so với số lượng người dùng internet vẫn chưa là gì cả. Các nhà cung cấp internet - hay nhỏ hơn là các hệ thống server trong công ty - bắt buộc phải có những phương thức quản lý người dùng theo kiểu mô hình cây phân cấp. Nhờ vào việc chia tách hệ thống mạng, server có thể quản lý được nhiều hosts hơn thông qua các router đóng vai trò như những cầu nối trung gian. Từ một hệ thống mạng lớn ta có thể có nhiều hệ thống network con, và trong các mạng con ta lại có thể có các network cháu.

Việc chia 1 network thành 2 hay nhiều network được gọi là subnetting. Như đã nói 1 địa chỉ IP được chia thành 2 phần Network Prefix và Host Number. Ví dụ : 192.168.1.0/24 là Network Prefix của 1 network IPv4 mà có dãy địa chỉ bắt đầu từ 192.168.1.0, có 24 bits được sử dụng (1) cho Network Prefix và 8 bits còn lại để gán cho các host devices. Tất cả các thiết bị trong cùng 1 network thì đều có chung 1 Network Prefix.

Ý nghĩa của Network Prefix

Dữ liệu sẽ được luân chuyển thông qua router ( hay Default Gateway Address ) đến thiết bị đích nếu như Network Prefix khác nhau, nếu các Prefix giống nhau, các gói tin sẽ được gửi 1 cách trực tiếp.

Đối với IPv4, 1 network cũng có thể được phân loại dựa vào Subnet Mask ,đây là cũng là 1 dãy bits mà khi áp phép bitwise AND vào địa chỉ IP, ta sẽ được Network prefix. Subnet Mask có dạng như sau:

255.255.255.0 (decimal) = 11111111.11111111.11111111.00000000 (binary)

Sử dụng phép bitwise AND , ta có thể tìm ra được Network Prefix cho bất kỳ địa chỉ IP nào.

Network 1 Binary form Dot-decimal notation
IP address 11000000.10101000.00000101.10000010 192.168.5.130
Subnet mask 11111111.11111111.11111111.00000000 255.255.255.0
Network prefix 11000000.10101000.00000101.00000000 192.168.5.0
Host part 00000000.00000000.00000000.10000010 0.0.0.130

Các networks trên thế giới hay trong mạng nội bộ cũng được phân chia như vậy, khi có một yêu cầu vận chuyển gói tin, địa chỉ IP được phân giải trở thành Network Prefix nhằm tìm được đến đúng Network mà gói tin hướng tới sau đó Host Address được sử dụng để tìm đến đúng thiết bị trong Network. Việc phân chia các IP Address (cũng như Network Prefix) theo từng vùng lãnh thổ trên thế giới như đã đề cập ở đầu bài - được quản lý bởi IANA và RIRs. Quá trình phân chia network như vậy được thực hiện bằng cách điều chỉnh các bit nằm ở Host Identifier Part sang Network Prefix và Subnet Mask cho phù hợp. Tăng số lượng bit của Network Prefix đồng nghĩa với việc giảm số lượng hosts và ta được các subnet nhỏ hơn subnet ban đầu, và ngược lại. Ví dụ sau tôi đã chia network phía trên trở thành 4 subnet nhỏ hơn bằng cách sử dụng thêm 2 bit của Subnet Mask cũ.

Network 1 modified Binary form Dot-decimal notation
IP address 11000000.10101000.00000101.10000010 192.168.5.130
Subnet mask 11111111.11111111.11111111.11000000 255.255.255.192
Network prefix 11000000.10101000.00000101.10000000 192.168.5.128
Host part 00000000.00000000.00000000.10000010 0.0.0.2

Subnet mask và CIDR

Subnet Mask cũng như suffix trong CIDR đều biểu thị thông tin về giá trị của Prefix Network. Có thể coi đây là 2 cách biểu diễn nhưng cùng mang 1 ý nghĩa, mặc dù vậy Subnetmask là khái niệm được ra đời trước so với CIDR.

NAT

Đến đây thì bạn cũng đã có thể hình dung về mô hình hoạt động của IP Address rồi, tôi sẽ tóm tắt lại 1 cách đơn giản như sau:

Subnetting gây ra 1 vấn đề, đó là có sự conflict giữa các địa chỉ IP đóng vai trò trong local của network con trong sơ đồ phân cấp (private IP - IP này chỉ có ý nghĩa trên trong local) với các địa chỉ public IP vốn có vai trò thực sự trong việc đánh địa chỉ trên WAN hay internet. Để giải quyết vấn đề này người ta sử dụng đến NAT.

Ở trong Router, sẽ có 1 bộ phận được gọi là NAT - Network Address Translation. Khi các device kết nối vào với router thì DHCP sẽ tự động cấp cho device 1 private IP. Về phía router nó nhận được Public IP mà nhà cung cấp phát cho. Như đã biết thì đây mới là địa chỉ IP được sử dụng để giao tiêp với thế giới bên ngoài, trước khi đến được router của bạn, network cũng đã được trải qua 1 hay nhiều bước subnet rồi. Bởi vì Private IP và Public IP sử dụng những Network Prefix khác nhau nên thông tin từ các thiết bị này không thể kết nối 1 cách trực tiếp mà bắt buộc phải đi qua Default Gateway ( như trong phần Subnet tôi đã nói ). Router lúc này sử dụng NAT, biên dịch thông tin địa chỉ truyền nhận giữa thiết bị bên trong local network và bên ngoài, map các thông tin cho nhau đảm bảo chúng có thể liên lạc được với nhau.

Mỗi lần máy tính trong mạng local muốn kết nối đến máy tính bên ngoài local, nó gửi 1 connection request đến router thông qua Default Gateway Address. Router nhận request này và thay đổi source address từ private IP của thiết bị sang public IP, tại đây router sẽ lưu thông tin này vào NAT table. Sau khi nhận được response từ bên ngoài, router tìm kiếm thông tin trong NAT table connection nào đã được khởi tạo và connection đó đang map với private IP nào. Sau quá trình này, router sẽ truyền response tới máy tính mà đã khởi tạo request.

127.0.0.1

Quay trở lại câu chuyện localhost, các Private IP không phải là các dãy IP duy nhất được định nghĩa sẵn bởi IANA. 127.0.0.1 là 1 Reserved IP Address và ý nghĩa của địa chỉ này là chính host device đang gửi gói tin. Chúng ta có thể sử dụng địa chỉ này cho các mục đích test nhờ vào tính tách biệt của nó với hệ thống mạng. Cụ thể xin tham khảo ở đây. http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml

Nếu như các bạn đã đọc sẽ thấy rằng chính xác thì loopback IP ở đây được biểu diễn bằng CIDR notation như sau:

127.0.0.0/8

Điều này đồng nghĩa với dải IP Address :

127.0.0.0 – 127.255.255.255

Kết quả là gần 17 triệu địa chỉ chứ không phải mỗi 127.0.0.1 như chúng ta vẫn tưởng. Tuy vậy, trên thực tế hầu như chúng ta chỉ sử dụng 127.0.0.1 mà thôi, nhưng hãy nhớ đây không phải là IP Loopback duy nhất. Địa chỉ 127.0.0.1 có thể được resolved bằng domain localhost thậm chí bởi các DNS servers chứ không phải chỉ gói gọn trong file hosts, hãy thử chỉnh lại file /etc/hosts để thấy mọi thứ vẫn hoạt động bình thường. Tổ chức IETF đã cấm việc đăng ký domain này 😄

# 127.0.0.1    localhost
# ::1          localhost

Liên quan đến Classful Network

127.0.0.1 chính xác là 1 địa chỉ IP thuộc Class A, các gói dữ liệu được truyền đi từ lớp cao hơn (B,C ..) tới network 127 sẽ quay vòng lại chính host.

Loopback IP v6

::1

Packet Processing

Tất cả các gói tin được gửi tới loopback address sẽ không được gửi tới NAT như các private address. Ngay từ phần cứng của thiết bị mạng đã ngăn chặn điều này rồi, chip NIC trên card mạng thậm chí không nhận ra sự có mặt của các gói tin này 😄 Các gói tin loopback được phân tách dựa vào địa chỉ IP mà nó được chỉ định truyền tới, điều đó nghĩa là các HTTP service có thể truyền gói tin từ loopback address này sang loopback address khác như bình thường:

127.0.0.99:80 => 127.0.0.100:80

Các gói tin được nhận ở 1 địa chỉ không phải loop-back mà có source hoặc destination address lại là loopback address thì sẽ bị drop và không thể thực hiện. Có thể thấy là loopback address được thiết kế để cho phép thực hiện toàn bộ chức năng của gói giao thức IP bất kể quá trình cài đặt mạng.

What about 0.0.0.0 ?

0.0.0.0 có nghĩa là tất cả địa chỉ IP trên máy host - chính xác là địa chỉ IPv4. Giả như máy tính của bạn có 2 địa chỉ IP 192.168.1.1 và 10.1.2.1, và bạn cài đặt cho 1 webserver như APACHE lắng nghe ở cổng 0.0.0.0. Đồng nghĩa với việc hosts có thể được reach vào cả 2 địa chỉ IP đó, còn việc có access vào được không thì còn là 1 câu chuyện khác liên quan tới firewall và các cài đặt security nhé.

0.0.0.0 không chỉ mang mỗi ý nghĩa đó, đứng ở góc nhìn từ phía router. địa chỉ 0.0.0.0 có nghĩa là Default Gateway , khi không có 1 địa chỉ nào có thể được map trong NAT table, thì destination của nó sẽ được gán địa chỉ này.

Ngoài ra, thì dải 0.0.0.0/8 cũng như là 1 dải reserved IP theo IANA và không thể được sử dụng để làm địa chỉ IP cho các network interface.

...

Thực sự trong khuôn khổ bài viết rất khó để nói sâu sắc tất cả các vấn đề, tôi chỉ có thể đi sơ lược những phần quan trọng nhất và cung cấp phần nào keyword cho mọi người tìm hiểu kỹ hơn. Infrastructure mình đánh gía là mảng rất hay và rất có khả năng phát triển trong tương lai nên đừng ngại tìm hiểu 😄

Refs

Wiki ServerFault Lượm lặt ...