I. Từ Classful networking đến Classless networking
Trong lịch sử mạng máy tính, việc quản lý địa chỉ IP đã trải qua hai giai đoạn chính: Classful networking và Classless Inter Domain Routing (CIDR). Sự chuyển đổi từ Classful networking sang CIDR là một bước tiến quan trọng trong việc tối ưu hóa việc sử dụng địa chỉ IP và giải quyết vấn đề cạn kiệt địa chỉ IP.
1. Nhắc lại Classful networking
Classful networking, được giới thiệu vào những năm 1980, là phương pháp đầu tiên trong việc phân loại địa chỉ IP. Dựa trên cấu trúc của địa chỉ IP, hệ thống này chia địa chỉ IP thành 5 lớp (A, B, C, D, và E), mỗi lớp có một phạm vi địa chỉ cố định và một số lượng địa chỉ nhất định. Lớp A dành cho mạng lớn với số lượng host lớn; lớp B cho mạng vừa và nhỏ; và lớp C cho mạng nhỏ. Lớp D dành cho multicast, và lớp E dành cho mục đích nghiên cứu.
Mặc dù hệ thống classful giúp tổ chức và quản lý địa chỉ IP dễ dàng hơn, nhưng nó cũng dẫn đến sự lãng phí địa chỉ IP nghiêm trọng. Do phân chia cố định, nhiều tổ chức nhận được nhiều địa chỉ IP hơn mức họ cần, trong khi số lượng địa chỉ IP có sẵn lại có hạn.
2. Sự ra đời của CIDR
Để giải quyết vấn đề này, Classless Inter Domain Routing (CIDR) được giới thiệu vào đầu những năm 1990. CIDR loại bỏ sự phân chia cố định của địa chỉ IP và cho phép phân chia linh hoạt hơn dựa trên nhu cầu thực tế của tổ chức.
CIDR mang lại nhiều lợi ích đáng kể so với hệ thống classful trước đó. Nó giúp giảm đáng kể sự lãng phí địa chỉ IP, tăng khả năng mở rộng và linh hoạt trong việc quản lý địa chỉ. CIDR cũng cải thiện hiệu quả của bảng định tuyến bằng cách giảm số lượng mục nhập cần thiết thông qua kỹ thuật "supernetting", giúp đơn giản hóa quản lý mạng và tăng hiệu suất định tuyến.
II. Cách hoạt động của IPv4 theo phương pháp CIDR
1. Định dạng
CIDR là một phương pháp cho phép phân chia linh hoạt các địa chỉ IP thành các mạng con có kích thước khác nhau, thay vì phải tuân theo các lớp cố định A, B, hoặc C như trước đây. CIDR sử dụng ký hiệu "slash" (ví dụ, , ), hay còn gọi là subnet mask (mặt nạ mạng/mặt nạ mạng phụ) để chỉ định số bit được sử dụng cho phần mạng của địa chỉ. Phần còn lại của các bit sau dấu slash được sử dụng cho các địa chỉ host trong mạng đó.
Ví dụ, địa chỉ CIDR có phần subnet mask chỉ ra rằng bit đầu tiên là phần mạng (network ID) và bit cuối cùng là phần dành cho các địa chỉ host (host ID).
2. Một số công thức trong tính toán địa chỉ IP theo CIDR
Với subnet mask là \n, chúng ta có các công thức sau:
Số lượng mạng con
Trong đó, giá trị "No. of bits in default mask" chỉ số lượng bit mặc định trong mask mặc định tương ứng với từng lớp, quy ước như sau:
- Lớp A:
- Lớp B:
- Lớp C:
Địa chỉ mạng con / Địa chỉ mạng
Địa chỉ mạng con/Địa chỉ mạng (Subnet address/Network address) được tính bằng kết quả phép toán AND của IP được cho với subnet mask.
Địa chỉ quảng bá
Để tính địa chỉ quảng bá (Broadcast address), chúng ta đặt tất cả các bit trong host ID bằng , phần network ID lấy từ địa chỉ IP đã cho.
Số lượng host của mỗi mạng con
Địa chỉ host đầu tiên
Địa chỉ host cuối cùng
Ví dụ
Để hiểu rõ các công thức trên, chúng ta xét ví dụ với địa chỉ IP ở dạng CIDR là .
Subnet mask có giá trị . Trước hết đổi sang hệ nhị phân có định dạng:
Địa chỉ này thuộc lớp C nên:
- Số lượng mạng con:
- Địa chỉ mạng con/Địa chỉ mạng: (xem hình ảnh)
- Địa chỉ quảng bá:
- Số lượng host mỗi mạng con:
- Địa chỉ host đầu tiên:
- Địa chỉ host cuối cùng:
Một bộ công thức khác
Ngoài ra bạn đọc có thể tính theo bộ công thức dưới đây có thể rút ngắn thời gian tính toán:
Subnet Number of Hosts = 2 ^ (32 - subnet mask)
Network ID: floor(Host Address/Subnet Number of Hosts) * Subnet Number of Hosts
Broadcast ID: (Network ID + (Subnet Number of Hosts-1))
First Host: Network ID + 1
Last Host: Broadcast ID - 1
Với công thức trên, ta có:
- Số địa chỉ mạng con của host:
- Network ID: nên địa chỉ mạng con là
- Broadcast ID: nên địa chỉ quảng bá là
- First Host: nên địa chỉ host đầu tiên là
- Last Host: nên địa chỉ host cuối cùng là
III. Luyện tập
Tính toán
Đề bài: Từ các công thức trong phần II, hãy tính địa chỉ mạng, địa chỉ quảng bá, địa chỉ host đầu tiên, địa chỉ host cuối cùng với mỗi phần sau:
a) b) c) d)
Lập trình
Viết chương trình thực hiện yêu cầu trong bài tập trên.
Gợi ý lời giải
Hướng giải quyết 1: Lập trình theo công thức
Chương trình Python minh họa:
def ip_to_binary(ip_address): # Chuyển địa chỉ IP thành chuỗi nhị phân 32-bit binary_ip = ''.join(format(int(x), '08b') for x in ip_address.split('.')) return binary_ip def calculate_network_info(ip, subnet_mask): # Chuyển địa chỉ IP và subnet mask sang nhị phân binary_ip = ip_to_binary(ip) binary_subnet_mask = '1' * int(subnet_mask) + '0' * (32 - int(subnet_mask)) # Tìm địa chỉ mạng và broadcast ID network_id = binary_ip[:int(subnet_mask)] + '0' * (32 - int(subnet_mask)) broadcast_id = binary_ip[:int(subnet_mask)] + '1' * (32 - int(subnet_mask)) # Tìm địa chỉ host đầu tiên và cuối cùng first_host = network_id[:-1] + '1' last_host = broadcast_id[:-1] + '0' # Chuyển đổi các địa chỉ từ nhị phân sang thập phân network_address = '.'.join(str(int(network_id[i:i+8], 2)) for i in range(0, 32, 8)) broadcast_address = '.'.join(str(int(broadcast_id[i:i+8], 2)) for i in range(0, 32, 8)) first_host_address = '.'.join(str(int(first_host[i:i+8], 2)) for i in range(0, 32, 8)) last_host_address = '.'.join(str(int(last_host[i:i+8], 2)) for i in range(0, 32, 8)) return network_address, broadcast_address, first_host_address, last_host_address # a) 192.168.1.65/28
network_info_a = calculate_network_info('192.168.1.65', '28')
print("a) Network Address:", network_info_a[0])
print(" Broadcast Address:", network_info_a[1])
print(" First Host Address:", network_info_a[2])
print(" Last Host Address:", network_info_a[3]) # b) 192.168.20.166/25
network_info_b = calculate_network_info('192.168.20.166', '25')
print("\nb) Network Address:", network_info_b[0])
print(" Broadcast Address:", network_info_b[1])
print(" First Host Address:", network_info_b[2])
print(" Last Host Address:", network_info_b[3]) # c) 192.168.30.14/29
network_info_c = calculate_network_info('192.168.30.14', '29')
print("\nc) Network Address:", network_info_c[0])
print(" Broadcast Address:", network_info_c[1])
print(" First Host Address:", network_info_c[2])
print(" Last Host Address:", network_info_c[3]) # d) 192.168.20.86/30
network_info_d = calculate_network_info('192.168.20.86', '30')
print("\nd) Network Address:", network_info_d[0])
print(" Broadcast Address:", network_info_d[1])
print(" First Host Address:", network_info_d[2])
print(" Last Host Address:", network_info_d[3])
Hướng giải quyết 2: Sử dụng thư viện hỗ trợ
Chương trình Python minh họa:
import ipaddress def calculate_network_info(ip, subnet_mask): network = ipaddress.ip_interface(ip + '/' + subnet_mask) network_address = network.network.network_address broadcast_address = network.network.broadcast_address first_host = network.network.network_address + 1 last_host = network.network.broadcast_address - 1 return network_address, broadcast_address, first_host, last_host # a) 192.168.1.65/28
network_info_a = calculate_network_info('192.168.1.65', '28')
print("a) Network Address:", network_info_a[0])
print(" Broadcast Address:", network_info_a[1])
print(" First Host Address:", network_info_a[2])
print(" Last Host Address:", network_info_a[3]) # b) 192.168.20.166/25
network_info_b = calculate_network_info('192.168.20.166', '25')
print("\nb) Network Address:", network_info_b[0])
print(" Broadcast Address:", network_info_b[1])
print(" First Host Address:", network_info_b[2])
print(" Last Host Address:", network_info_b[3]) # c) 192.168.30.14/29
network_info_c = calculate_network_info('192.168.30.14', '29')
print("\nc) Network Address:", network_info_c[0])
print(" Broadcast Address:", network_info_c[1])
print(" First Host Address:", network_info_c[2])
print(" Last Host Address:", network_info_c[3]) # d) 192.168.20.86/30
network_info_d = calculate_network_info('192.168.20.86', '30')
print("\nd) Network Address:", network_info_d[0])
print(" Broadcast Address:", network_info_d[1])
print(" First Host Address:", network_info_d[2])
print(" Last Host Address:", network_info_d[3])
Tài liệu tham khảo
- https://www.geeksforgeeks.org/ip-addressing-classless-addressing/
- https://www.geeksforgeeks.org/ipv4-classless-subnet-equation/
- https://csc-knu.github.io/sys-prog/books/Andrew%20S.%20Tanenbaum%20-%20Computer%20Networks.pdf
- https://www.ucg.ac.me/skladiste/blog_44233/objava_64433/fajlovi/Computer%20Networking%20_%20A%20Top%20Down%20Approach,%207th,%20converted.pdf