LẬP TRÌNH MẠNG NÂNG CAO
Chương 3.
IP MULTICASTING
Nguyễn Vũ – IT Faculty, Viet Han Friendship
1
Kỹ thuật IP Multicasting
BroadCasting là gì?
Dùng để gửi một gói tin đến tất cả các nút trong mạng
Để thực hiện hình thức quảng bá, địa chỉ đến của gói tin sẽ là địa
chỉ quảng bá.
Có hai loại là:
Local BroadCast
Global BroadCast
Ví dụ: Cho mạng lớp B có địa chỉ IP là 192.168.0.0 có SubNet
Mask là 255.255.0.0, địa chỉ Local Broadcast là: 192.168.254.255
Nguyễn Vũ – IT Faculty, Viet Han Friendship
2
Kỹ thuật IP Multicasting
Theo mặc định, Socket không được phép gửi tin nhắn quảng
bá:
Gửi gói dữ liệu BroadCast:
class BadBroadcast {
public static void Main()
{
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050);
byte[] data = Encoding.ASCII.GetBytes("This is a test message");
sock.SendTo(data, iep);
sock.Close();
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
3
Kỹ thuật IP Multicasting
Dùng kỹ thuật BroadCasting để gửi dữ liệu đến nhiều máy trong mạng
cục bộ
Đối với một ứng dụng C # để gửi các gói dữ liệu Broadcast, ta dùng
phương thức SetSocketOption() của lớp Socket :
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.Broadcast, 1);
Nguyễn Vũ – IT Faculty, Viet Han Friendship
4
Kỹ thuật IP Multicasting
Dùng kỹ thuật BroadCasting để gửi dữ liệu đến nhiều máy trong
mạng cục bộ
Gửi gói dữ liệu:
class Broadcst {
public static void Main() {
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);
IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
string hostname = Dns.GetHostName();
byte[] data = Encoding.ASCII.GetBytes(hostname);
sock.SetSocketOption(SocketOptionLeyel.Socket,
SocketOptionName.Broadcast, 1);
sock.SendTo(data, iep1);
sock.SendTo(data, iep2);
sock.Close();
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
5
Kỹ thuật IP Multicasting
Nhận gói dữ liệu:
class RecvBroadcst {
public static void Main() {
Socket sock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,
ProtocolType.Udp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
sock.Bind(iep);
EndPoint ep = (EndPoint)iep;
Console.WriteLine("Ready to receiye…");
byte[] data = new byte[1024];
int recv = sock.ReceiveFrom(data, ref ep);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString());
data = new byte[1024];
recv = sock.ReceiveFrom(data, ref ep);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("received: {0} from: {1}",stringData, ep.ToString());
sock.Close();
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
6
Kỹ thuật IP Multicasting
Sử dụng Broadcast Packet để thông báo có sự hiện diện của
Server
class Advertise {
public static void Main()
{
Advertise server = new Advertise();
}
public Advertise()
{
Thread advert = new Thread(new ThreadStart(sendPackets));
advert.IsBackground = true;
advert.Start();
Console.Write("Press Enter to stop");
string data = Console.ReadLine();
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
7
Kỹ thuật IP Multicasting
Sử dụng Broadcast Packet để thông báo có sự hiện diện của
Server
void sendPackets()
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.Broadcast, 1);
IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9050);
string hostname = Dns.GetHostName();
byte[] data = Encoding.ASCII.GetBytes(hostname);
while (true)
{
sock.SendTo(data, iep);
Thread.Sleep(6000);
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
8
Kỹ thuật IP Multicasting
Multicasting là gì?
Một địa chỉ Multicasting cho phép thiết bị gửi dữ liệu tới một tập
xác định trước các host, được biết đến như các nhóm Multicast,
trong các mạng con khác nhau.
Range
Assignment
224.0.0.0–224.0.0.255
Local network control block
224.0.1.0–224.0.1.255
Internetwork control block
224.0.2.0–224.0.255.0
AD-HOC block
224.1.0.0–224.1.255.255
ST multicast groups
224.2.0.0–224.2.255.255
SDP/SAP block
224.252.0.0–224.255.255.255
DIS transient block
225.0.0.0–231.255.255.255
Reserved
232.0.0.0–232.255.255.255
Source-specific multicast block
233.0.0.0–233.255.255.255
GLOP block
234.0.0.0–238.255.255.255
Reserved
239.0.0.0–239.255.255.255
Administratively scoped block
Nguyễn Vũ – IT Faculty, Viet Han Friendship
9
Kỹ thuật IP Multicasting
Một số địa chỉ Multicast:
Nguyễn Vũ – IT Faculty, Viet Han Friendship
10
Kỹ thuật IP Multicasting
Có hai kỹ thuật Multicast được sử dụng:
Peer to peer:
Nguyễn Vũ – IT Faculty, Viet Han Friendship
11
Kỹ thuật IP Multicasting
Có hai kỹ thuật Multicast được sử dụng:
Central Server:
Nguyễn Vũ – IT Faculty, Viet Han Friendship
12
Kỹ thuật IP Multicasting
Gửi multicast Packets qua Router
Nguyễn Vũ – IT Faculty, Viet Han Friendship
13
Socket Multicasting trong .Net
Sử dụng phương thức SocketOption():
Phương thức SocketOption() dùng để:
Thêm một socket vào nhóm Multicast
Loại một socket khỏi nhóm Multicast
SetSocketOption(SocketOptionLevel,SocketOptionName,
optionValue)
SocketOptionName:
AddMembership
DropMembership
Nguyễn Vũ – IT Faculty, Viet Han Friendship
14
Socket Multicasting trong .Net
Sử dụng phương thức SocketOption():
Ví dụ thêm một Socket vào nhóm Multicast 224.100.0.1 ta viết
như sau:
sock.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership, new
MulticastOption(IPAddress.Parse("224.100.0.1"));
Nguyễn Vũ – IT Faculty, Viet Han Friendship
15
Socket Multicasting trong .Net
Gửi dữ liệu Multicast
class MultiSend{
public static void Main()
{
Socket server = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
IPEndPoint iep = new
IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050);
byte[] data = Encoding.ASCII.GetBytes("This is a test
message");
server.SendTo(data, iep);
server.Close();
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
16
Socket Multicasting trong .Net
Nhận dữ liệu Multicast
class MultiRecv{
public static void Main() {
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
Console.WriteLine("Ready to receive…");
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
EndPoint ep = (EndPoint)iep;
sock.Bind(iep);
sock.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.AddMembership,
new MulticastOption(IPAddress.Parse("224.100.0.1")));
byte[] data = new byte[1024];
int recv = sock.ReceiveFrom(data, ref ep);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine("received: {0} from: {1}", stringData, ep.ToString());
sock.Close();
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
17
Socket Multicasting trong .Net
Multicast với lớp UdpClient
JoinMulticastGroup()
DropMulticastGroup()
JoinMulticastGroup() là phương thức overload
JoinMulticastGroup(IPAddress)
JoinMulticastGroup(IPAddress,int)
Nguyễn Vũ – IT Faculty, Viet Han Friendship
18
Socket Multicasting trong .Net
UdpClient Multicast Receiver
class UdpClientMultiRecv
{
public static void Main()
{
UdpClient sock = new UdpClient(9050);
Console.WriteLine("Ready to receive…");
sock.JoinMulticastGroup(IPAddress.Parse("224.100.0.1"), 50);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
byte[] data = sock.Receive(ref iep);
string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
Console.WriteLine("received: {0} from: {1}", stringData, iep.ToString());
sock.Close();
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
19
Socket Multicasting trong .Net
UdpClient Multicast Sender
class UdpClientMultiSend
{
public static void Main()
{
UdpClient sock = new UdpClient();
IPEndPoint iep = new
IPEndPoint(IPAddress.Parse("224.100.0.1"), 9050);
byte[] data = Encoding.ASCII.GetBytes("This is a test
message");
sock.Send(data, data.Length, iep);
sock.Close();
}
}
Nguyễn Vũ – IT Faculty, Viet Han Friendship
20
Bài tập về nhà
Xây dựng chương trình chat giữa một Server và nhiều Client sử
dụng Socket Broadcast và Socket Multicast?
Nguyễn Vũ – IT Faculty, Viet Han Friendship
21