New FAMILUG

The PyMiers

Saturday 29 October 2011

Lật mặt nạ mạng (phần 2)

2. 0 và 255
như đã cảnh báo trước, phần này ta sẽ giải quyết sòng phẳng vấn đề 0 và 255 đã đi đâu?

255 được sử dụng cho "broadcast". Ta thường hay được nghe xxx.xxx.255.255 là địa chỉ broadcast, và ta cũng nhắc lại như con vẹt "nó là địa chỉ broadcast". Vậy broadcast là gì?
broadcast là một tin nhắn (message) mà bạn muốn tất cả các máy cùng mạng (network) với mình nhìn thấy.
 


Để gửi 1 broadcast đi, bạn phải sử dụng 1 địa chỉ "thần thánh“ được ghép bởi : phần địa chỉ mạng của bạn (network ID) và phần HostID đều là số 1. Địa chỉ này được gọi là địa chỉ broadcast.
VD: Nếu địa chỉ IP của bạn là 129.123.1.7 trong đó phần netID gồm 16 bit đầu tức là 129.123, còn lại 16 bit là phần hostID. Vậy gán 16 bit còn lại ấy = 1, ta có 1 dãy 1111...1111(16 số 1) và nếu hiển 2 octet  này ở cơ số 10 ta sẽ được 255.255 => địa chỉ để ta gửi broadcast trong mạng này sẽ là 129.123.255.255

Một câu hỏi có thể đưa ra là: vậy ta lấy mấy số đầu rồi phần còn lại cứ 255 255 là xong?
Hoàn toàn không đúng! nên nhớ 255 chỉ là biểu diễn 8 bit 1 của ta dưới hệ cơ số 10 cho dễ đọc. Còn địa chỉ để gửi broadcast gồm phần NetID + HostID(toàn số 1 - hệ cơ số 2). Rõ ràng địa chỉ broadcast phụ thuộc vào phần NetID. Nếu phần NetID gồm 17 bit thì 15 số 1 sẽ tạo thành 2 octet ở cơ số 10 như sau:
(7bit ở octet 3) 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 127
(8bit ở octet 4) 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^ 0 = 255
cách tính như trên đơn giản chỉ là cách đổi từ hệ cơ số 2 sang cơ số 10.
=> địa chỉ Broadcast của ta là xxx.xxx.127.255

tính toán như vậy thật lằng nhằng, có cách nào nhanh hơn không?
để tiện lợi ta có thể dùng địa chỉ 255.255.255.255 để gửi broadcast đến tất cả các host cùng mạng.

Câu hỏi cuối cùng cho 255: gửi broadcast để làm gì?
khi bạn muốn gửi yêu cầu đến 1 máy nào đó trong mạng mà không biết cụ thể đó là máy nào.
VD: bạn có thể gửi yêu cầu tìm IP của 1 máy trong mạng có tên kute.familug.
Nếu biết địa chỉ của DNS, hỏi cái nó trả lời ngay, còn nếu không, bằng cách gửi broadcast, tất cả các máy trong mạng của bạn sẽ nhận được yêu cầu này thay vì bạn phải đi hỏi từng host 1.

tham khảo thêm
RFC 919:  http://tools.ietf.org/html/rfc919
Wiki: http://en.wikipedia.org/wiki/Broadcast_address
http://en.wikipedia.org/wiki/Broadcasting_%28computing%29
Nếu bạn muốn đào sâu hơn nữa? tiếp tục và chia sẻ với chúng tôi.
Một vài câu hỏi mở:
- Viết 1 chương trình gửi nhận thông tin qua địa chỉ broadcast
- Những ứng dụng thực tế của địa chỉ broadcast
- Ngắm nghía broadcast với Wireshark...

Còn 0 - một con số bí ẩn!
....
còn tiếp :P

1 comment: