單播」(Unicast)、「多播」(Multicast)和「廣播」(Broadcast)這三個術語都是用來描述網絡節點之間通信方式的術語。那麼這些術語到底是什麼意思?區別何在?
1. 單播:網絡節點之間的通訊就好像是人們之間的對話同樣。若是一我的對另一我的說話,那麼用網絡技術的術語來描述就是「單播」,此時信息的接收和傳遞只在兩個節點之間進行。單播在網絡中獲得了普遍的應用,網絡上絕大部分的數據都是以單播的形式傳輸的,只是通常網絡用戶不知道而已。例如,你在收發電子郵件、瀏覽網頁時,必須與郵件服務器、Web服務器創建鏈接,此時使用的就是單播數據傳輸方式。可是一般使用「點對點通訊」(Point to Point)代替「單播」,由於「單播」通常與「多播」和「廣播」相對應使用。
2.多播:「多播」也能夠稱爲「組播」,在網絡技術的應用並非不少,網上視頻會議、網上視頻點播特別適合採用多播方式。由於若是採用單播方式,逐個節點傳輸,有多少個目標節點,就會有多少次傳送過程,這種方式顯然效率極低,是不可取的;若是採用不區分目標、所有發送的廣播方式,雖然一次能夠傳送完數據,可是顯然達不到區分特定數據接收對象的目的。採用多播方式,既能夠實現一次傳送全部目標節點的數據,也能夠達到只對特定對象傳送數據的目的。IP網絡的多播通常經過多播IP地址來實現。多播IP地址就是D類IP地址,即224.0.0.0至239.255.255.255之間的IP地址。 Windows 2000中的DHCP管理器支持多播IP地址的自動分配。
3.廣播:「廣播」在網絡中的應用較多,如客戶機經過 DHCP自動得到IP地址的過程就是經過廣播來實現的。可是同單播和多播相比,廣播幾乎佔用了子網內網絡的全部帶寬。拿開會打一個比方吧,在會場上只能有一我的發言,想象一下若是全部的人同時都用麥克風發言,那會場上就會亂成一鍋粥。集線器因爲其工做原理決定了不可能過濾廣播風暴,通常的交換機也沒有這一功能,不過如今有的網絡交換機(如全向的QS系列交換機)也有過濾廣播風暴功能了,路由器自己就有隔離廣播風暴的做用。廣播風暴不能徹底杜絕,可是隻能在同一子網內傳播,就好像喇叭的聲音只能在同一會場內傳播同樣,所以在由幾百臺甚至上千臺電腦構成的大中型局域網中,通常進行子網劃分,就像將一個大廳用牆壁隔離成許多小廳同樣,以達到隔離廣播風暴的目的。在IP網絡中,廣播地址用IP地址「255.255.255.255」來表示,這個IP地址表明同一子網內全部的IP地址。java
package com.goma.test; 網絡
import java.net.DatagramPacket; spa
import java.net.InetAddress; .net
import java.net.MulticastSocket; orm
public class MultiCastSend { 視頻
public static void main(String[]args){ 對象
try { 生命週期
/******************發送組播數據****************/ ip
//指定組播IP
InetAddress ip = InetAddress.getByName("228.5.6.7");
MulticastSocket s = new MulticastSocket();
//加入該組
s.joinGroup(ip);
//在多播中設置了TTl值(Time to live),每個ip數據報文中都包含一個TTL,
//每當有路由器轉發該報文時,TTL減1,知道減爲0時,生命週期結束,報文即時沒有到達目的地,
//也當即宣佈死亡。固然在Java中,ttl並非十分準確的,
//曾經在一本書中介紹過報文的傳播距離是不會超過ttl所設置的值的。
s.setTimeToLive(1);
String msg = "IP:123123123;PORT:1231";
DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),ip, 6789);
s.send(hi);
/******************發送組播數據****************/
s.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.goma.test;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class MultiCastReceive {
public static void main(String[]args){
try {
//IP組
InetAddress ip = InetAddress.getByName("228.5.6.7");
//組播監聽端口
MulticastSocket s = new MulticastSocket(6789);
//加入該組
s.joinGroup(ip);
byte[] arb = new byte[24];
while (true) {
DatagramPacket datagramPacket = new DatagramPacket(arb,arb.length);
s.receive(datagramPacket);
System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));
System.out.println(arb.length);
System.out.println(new String(arb));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
注:若在互聯網上運行須要支持多播的路由器的支持(不可能每一個客戶端都安裝相應的路由器,所以多播能夠說,只支持局域網。)
package com.goma.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class BroadCastSend {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
InetAddress ip = InetAddress.getByName("255.255.255.255");
DatagramSocket ds = new DatagramSocket();
String str = "Goma God Like.";
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length, ip, 3001);
ds.send(dp);
ds.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 建立用來發送數據報包的套接字
}
}
package com.goma.test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class BroadCastReceive {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
DatagramSocket ds = new DatagramSocket(3001);// 建立接收數據報套接字並將其綁定到本地主機上的指定端口
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
// String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from " + dp.getAddress().getHostAddress() + ":" + dp.getPort();
System.out.println(new String(buf));
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}