IPv4 và subnetting: tính đúng mạng, host và gateway

Tính network, broadcast và dải host từ IPv4/prefix; đối chiếu gateway, mask sai và ngoại lệ /31, /32. Có ví dụ số học kiểm chứng bằng Python.
Máy A có địa chỉ 192.168.10.70, máy B là 192.168.10.130. Cả hai đều bắt đầu bằng 192.168.10, nên người hỗ trợ kết luận chúng cùng mạng. Kết luận đó thiếu subnet mask: với /24 chúng có thể cùng subnet, còn với /26 thì chúng nằm trong hai subnet khác nhau. Ba octet giống nhau không đủ để chọn cách chuyển gói.
Bài này tính từng bước từ địa chỉ và prefix, rồi dùng kết quả để kiểm tra host, gateway và đường đi. Ví dụ là mạng văn phòng giả định, chưa phải cấu hình production. Phần đầu dùng subnet Ethernet thông thường có địa chỉ network và broadcast; /31 và /32 được tách riêng để tránh áp dụng công thức sai.
1. Nhìn IPv4 như 32 bit được chia bởi prefix
Địa chỉ IPv4 dài 32 bit, thường được viết thành bốn octet thập phân. Prefix /26 nghĩa 26 bit đầu thuộc phần mạng và còn 6 bit phía sau cho phần host. Mask tương ứng là 255.255.255.192, vì octet cuối có dạng nhị phân 11000000. Các bit 1 của subnet mask liên tiếp từ trái sang phải trong cách biểu diễn CIDR thông thường.
Địa chỉ 192.168.10.70 không tự mang một mask cố định vì nó “thuộc lớp C”. Cách chia lớp có giá trị lịch sử; khi tính và định tuyến hiện nay, cần đọc prefix được cấu hình. Hai host có cùng địa chỉ nhưng mask khác sẽ tạo quyết định on-link khác nhau. Đây là nguyên nhân có thể làm trao đổi một chiều hoặc phụ thuộc proxy ARP trong các thiết kế cụ thể.
RFC 4632 trình bày mô hình địa chỉ classless và aggregation. Trong thực hành, hãy viết đầy đủ 192.168.10.70/26 khi bàn về host, và 192.168.10.64/26 khi bàn về subnet chứa host đó. Viết đúng dạng giúp tránh nhầm địa chỉ interface với địa chỉ mạng.

Cuộn ngang khi cần, hoặc chạm sơ đồ để mở ảnh gốc.
Mỗi octet có trọng số 128, 64, 32, 16, 8, 4, 2, 1. Số 70 bằng 64 + 4 + 2, nên biểu diễn là 01000110. AND nó với mask cuối 11000000 cho kết quả 01000000, tức 64. Ba octet đầu giữ nguyên trong ví dụ này vì mask của chúng là 255.
2. Tính network, broadcast và dải host bằng hai cách
Cách tổng quát là lấy địa chỉ AND subnet mask để tìm network, rồi đặt toàn bộ bit host thành 1 để tìm broadcast của subnet thông thường. Với 192.168.10.70/26, network là 192.168.10.64 và broadcast là 192.168.10.127. Host khả dụng nằm từ .65 đến .126, trước khi trừ thêm phần dành cho gateway, thiết bị hoặc chính sách quản lý.
Cách nhẩm nhanh ở octet có ranh giới là tính bước nhảy 256 − 192 = 64. Các khối /26 trong /24 bắt đầu tại .0, .64, .128 và .192. Số 70 nằm giữa 64 và 127, nên thuộc khối thứ hai. Không lấy chính địa chỉ 70 làm điểm bắt đầu rồi cộng 64; khối phải bắt đầu ở đúng biên.
| Subnet /26 | Dải host thông thường | Broadcast |
|---|---|---|
| 192.168.10.0/26 | .1–.62 | .63 |
| 192.168.10.64/26 | .65–.126 | .127 |
| 192.168.10.128/26 | .129–.190 | .191 |
| 192.168.10.192/26 | .193–.254 | .255 |
Công thức 2^(32 − prefix) cho tổng số địa chỉ trong một prefix IPv4. Với subnet broadcast thông thường ở đây, trừ network và broadcast để còn 2^6 − 2 = 62 địa chỉ host. Con số 62 chưa có nghĩa đủ cho 62 máy người dùng nếu gateway và các thiết bị khác cũng tiêu thụ địa chỉ trong cùng subnet.
Không nhầm “số subnet tạo được” với “số host trong mỗi subnet”. Chia /24 thành /26 mượn thêm 2 bit, tạo 4 subnet bằng nhau. Mỗi subnet vẫn có 64 địa chỉ tổng. Bốn khối không chồng lấn ghép lại đúng 256 địa chỉ ban đầu; tổng này là một phép tự kiểm tra đơn giản.

Cuộn ngang khi cần, hoặc chạm sơ đồ để mở ảnh gốc.
3. Dùng kết quả để chọn gateway và xác định cùng subnet
Nếu A là .70/26, có thể chọn gateway .65/26 trong mô hình thông thường. Gateway phải là địa chỉ interface hoặc địa chỉ ảo thực sự phục vụ subnet, không phải con số được chọn vì trông quen. .65 không mặc nhiên là router; phải đối chiếu cấu hình. Các thiết kế point-to-point, unnumbered hoặc route đặc biệt có thể có điều kiện khác, ngoài ví dụ Ethernet đang dùng.
Host B .130/26 thuộc subnet .128/26, nên A gửi tới B qua gateway nếu có route phù hợp. Nhưng A .70/24 coi B là on-link, có thể đi tìm MAC B trực tiếp. Nếu B lại giữ /26, hai bên không cùng quan điểm về liên kết. Sửa mask cần có kế hoạch vì có thể ảnh hưởng kết nối quản trị và dịch vụ đang dùng.
Trong bài ARP, ta đã chọn next hop trước khi phân giải MAC. Phép tính subnet giúp giải thích route kết nối trực tiếp, nhưng quyết định cuối cùng vẫn theo bảng tuyến. VPN thêm route cụ thể hoặc máy có nhiều interface có thể làm kết quả khác cách suy luận từ một dòng IP/mask duy nhất.
Địa chỉ broadcast không dùng làm gateway host thông thường. Với .70/26, .127 là broadcast của subnet đó; .255 không phải broadcast duy nhất có ý nghĩa chỉ vì octet cuối bằng 255. Ngược lại, một địa chỉ kết thúc bằng .0 có thể là host hợp lệ trong một prefix lớn hơn /24, chẳng hạn 192.168.11.0/23 thuộc mạng 192.168.10.0/23.
4. Phân biệt private, public và các trường hợp /31, /32
RFC 1918 dành ba khối cho mạng riêng: 10.0.0.0/8, 172.16.0.0/12 và 192.168.0.0/16. Không gọi toàn bộ 172.0.0.0/8 là private. Ví dụ 172.15.1.1 không thuộc khối 172.16/12, trong khi 172.31.1.1 có thuộc. Private không tự mang ý nghĩa mã hóa hoặc được firewall bảo vệ.
Không thuộc RFC 1918 cũng chưa đủ để gọi một địa chỉ là public có thể định tuyến toàn cầu. Còn có loopback, link-local, multicast, địa chỉ tài liệu và các mục special-purpose. Khi thiết kế, kiểm tra nguồn cấp địa chỉ và mục đích sử dụng thay vì chỉ loại trừ ba dải private.
/31 là trường hợp đặc biệt cho liên kết point-to-point khi hai phía hỗ trợ cách dùng theo RFC 3021. Hai địa chỉ trong khối đều được dùng làm endpoint, không trừ hai như subnet broadcast thông thường. Không mang /31 áp vào VLAN nhiều máy rồi kết luận còn hai vị trí người dùng.
/32 mô tả một địa chỉ duy nhất, thường gặp ở host route hoặc loopback tùy thiết kế. Nó không cho biết một subnet Ethernet có thêm broadcast và gateway nằm ở đâu. Vì thế một công cụ thư viện trả danh sách host của /31 hoặc /32 khác công thức nhẩm không phải bằng chứng công cụ sai; trước hết phải đọc ngữ nghĩa của loại prefix.
5. Kiểm tra phép tính bằng công cụ độc lập
Python 3 có module chuẩn ipaddress, phù hợp để xác nhận phép tính trên giấy. Đoạn sau chỉ tính trong bộ nhớ, không đổi cấu hình máy và không gửi traffic. ip_interface giữ địa chỉ host; từ thuộc tính network ta lấy subnet đã được chuẩn hóa.
from ipaddress import ip_interface, ip_address
iface = ip_interface("192.168.10.70/26")
net = iface.network
print(net) # 192.168.10.64/26
print(net.netmask) # 255.255.255.192
print(net.broadcast_address) # 192.168.10.127
print(net.num_addresses) # 64
print(ip_address("192.168.10.130") in net) # False
Các giá trị kết quả đã được đối chiếu bằng module chuẩn trong quá trình biên tập; đây là kiểm chứng số học, không phải kiểm thử kết nối mạng. Tài liệu Python ipaddress giải thích sự khác nhau giữa interface, network và host iterator. Dùng chế độ strict cho dữ liệu network giúp bắt lỗi đưa địa chỉ host vào chỗ đòi hỏi biên mạng.
Trên Windows, ipconfig /all và route print -4 giúp đối chiếu địa chỉ thực và tuyến. Linux có ip -4 addr và ip -4 route. Chưa cần đổi IP để kiểm tra một phép tính; đọc dữ liệu hiện tại rồi so với sơ đồ đã được duyệt thường ít tác động hơn.
Nếu dữ liệu nhận từ DHCP sai, sửa trên client có thể chỉ che triệu chứng cho đến lần gia hạn sau. Cần xác định scope, VLAN, relay và server đã cấp cấu hình. Nếu IP tĩnh, kiểm tra địa chỉ có nằm trong vùng cấp động hoặc bị dùng ở nơi khác trước khi thay thế.
6. Đọc các lỗi chia subnet qua tình huống cụ thể
Phòng có 50 máy và cần một gateway. /26 có 62 địa chỉ host thông thường nên còn chỗ, nhưng 12 địa chỉ dư không phải dự phòng nhiều nếu thêm máy in, AP quản trị hoặc gateway ảo/thiết bị dự phòng. Số thiết bị phải được tính theo tất cả interface cần địa chỉ trong VLAN, không chỉ số bàn làm việc.
Nếu cần 62 máy cộng gateway, /26 không đủ. Đừng chọn nó chỉ vì bảng ghi “62 hosts”. Ngược lại, không bắt buộc mọi phòng đều /24; khối quá lớn có thể làm kế hoạch địa chỉ khó quản lý. Chọn kích thước là quyết định thiết kế có nhu cầu và dự phòng, không chỉ giải một bài toán lũy thừa.

Cuộn ngang khi cần, hoặc chạm sơ đồ để mở ảnh gốc.
Một lỗi khác là cấu hình 192.168.10.96/26 như một subnet độc lập. .96 nằm giữa khối .64/26 nên không phải biên /26; nếu ý định là subnet .96 thì có thể đang cần /27 với dung lượng khác. Đừng để công cụ âm thầm chuẩn hóa che đi sự nhầm lẫn trong hồ sơ cấp phát.
Để báo cáo rõ, ghi ba dữ liệu riêng: CIDR của mạng, dải host được phép dùng, và các địa chỉ đã dành riêng. Bổ sung gateway, DHCP scope, VLAN và chủ sở hữu. Một bảng “IP còn trống” mà không có mask và nguồn xác thực không đủ để cấp địa chỉ an toàn.
7. Tự giải một subnet rồi chuyển sang VLSM
Với 192.168.10.150/27, bước nhảy là 32; khối chứa 150 bắt đầu ở .128 và kết thúc ở .159. Dải host thông thường .129–.158, tổng 30 địa chỉ host. Gateway .129 có thể dùng nếu đã được cấu hình, còn .159 không dùng làm gateway của subnet này. Hãy kiểm chứng bằng cả AND nhị phân và công cụ trước khi nhìn đáp án.
Khi giải được các khối đều nhau, bước tiếp theo là chia một /24 cho các phòng có nhu cầu khác nhau. Bài VLSM và tổng hợp tuyến sẽ dùng các khối lớn/nhỏ, dự phòng và ranh giới aggregate. Giữ lại phép kiểm tra “đúng biên, không chồng lấn, đủ chỗ cho gateway”; nó sẽ ngăn nhiều lỗi khi số subnet tăng lên.