單播、多播、廣播的區別(看到網上有用的蒐集)

Web】單播、多播、廣播的區別
 
單播是:有具體目標地址的幀從源到達目標地址的過程。比如你對小月喊“小月”,那麼只有小月答應你 

多播(組播):就是幀送往定義在一組內的地址。比如你喊:“是男人都過來一人發一百塊錢”。哪麼男的都會過來女的就不會過來因爲沒有錢發她不會理你 

廣播:就是把幀發往所有能到達的地址。比如學校的廣播中喊“今天放假”。哪麼全校的同學都會響應,大叫爽死了。 

==========================================================

什麼是單播、多播和廣播 

“單播”(Unicast)、“多播”(Multicast)和“廣播”(Broadcast)這三個術語都是用來描述網絡節點之間通訊方式的術語。那麼這些術語究竟是什麼意思?區別何在?且聽下文分解。 


——★單播★—— 


網絡節點之間的通信就好像是人們之間的對話一樣。如果一個人對另外一個人說話,那麼用網絡技術的術語來描述就是“單播”,此時信息的接收和傳遞只在兩個節點之間進行,參見 

單播:一對一 

單播在網絡中得到了廣泛的應用,網絡上絕大部分的數據都是以單播的形式傳輸的,只是一般網絡用戶不知道而已。例如,你在收發電子郵件、瀏覽網頁時,必須與郵件服務器、Web服務器建立連接,此時使用的就是單播數據傳輸方式。但是通常使用“點對點通信”(PointtoPoint)代替“單播”,因爲“單播”一般與“多播”和“廣播”相對應使用。 


——★多播★—— 


“多播”可以理解爲一個人向多個人(但不是在場的所有人)說話,這樣能夠提高通話的效率。如果你要通知特定的某些人同一件事情,但是又不想讓其他人知道,使用電話一個一個地通知就非常麻煩,而使用日常生活的大喇叭進行廣播通知,就達不到只通知個別人的目的了,此時使用“多播”來實現就會非常方便快捷,但是現實生活中多播設備非常少。 



廣播和多播僅應用於UDP,它們對需將報文同時傳往多個接收者的應用來說十分重要。TCP是一個面向連接的協議,它意味着分別運行於兩主機(由IP地址確定)內的兩進程(由端口號確定)間存在一條連接。 
考慮包含多個主機的共享信道網絡如以太網。每個以太網幀包含源主機和目的主機的以太網地址(48 bit)。通常每個以太網幀僅發往單個目的主機,目的地址指明單個接收接口,因而稱爲單播(unicast)。在這種方式下,任意兩個主機的通信不會干擾網內其他主機(可能引起爭奪共享信道的情況除外)。 
然而,有時一個主機要向網上的所有其他主機發送幀,這就是廣播。通過ARP和RARP可以看到這一過程。多播(multicast) 處於單播和廣播之間:幀僅傳送給屬於多播組的多個主機。 
爲了弄清廣播和多播,需要了解主機對由信道傳送過來幀的過濾過程。 


http://www.52blog.net/user1/3257/archives/2006/751995.shtml 
http://zhangbaoli.blogchina.com/blog/5560985.html
   
 
作者:無名魚0926 
<script></script>
  
 
2008-7-8 19:42   回覆此發言  
 

2 C#廣播程序
 
廣播

由於Tcp是有連接的,所以不能用來發送廣播消息。發送廣播消息,必須用到Udp,Udp可以不用建立連接而發送消息。廣播消息的目的IP地址是一種特殊IP地址,稱爲廣播地址。廣播地址由IP地址網絡前綴加上全1主機後綴組成,如:192.168.1.255是192.169.1.0這個網絡的廣播地址;130.168.255.255是130.168.0.0這個網絡的廣播地址。向全部爲1的IP地址(255.255.255.255)發送消息的話,那麼理論上全世界所有的聯網的計算機都能收得到了。但實際上不是這樣的,一般路由器上設置拋棄這樣的包,只在本地網內廣播,所以效果和向本地網的廣播地址發送消息是一樣的。

C#中發送廣播消息的過程如下,注意要調用SetSockOption函數,不然要拋出異常:

 Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
 ProtocolType.Udp);
 IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255
 IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
 string hostname = Dns.GetHostName();
 byte[] data = Encoding.ASCII.GetBytes(hostname);
 sock.SetSocketOption(SocketOptionLevel.Socket,
 SocketOptionName.Broadcast, 1);
 sock.SendTo(data, iep1);
 sock.SendTo(data, iep2);
 sock.Close();

C#中接收廣播消息的過程如下,沒有什麼特別的:

 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 receive…");
 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();

Attentions:
1 廣播可以由客戶程序來通知子網內的服務程序,自己的位置
2 發送廣播消息時指定的端口也是有作用的,接收端的Udp Socket如果Bind到此接口的話,就能夠接收到消息。(如果不Bind的話,就能接收所有端口的消息??)
3 接收端接到的包中顯示的遠端IP地址是發送端的地址。就是說廣播地址不會顯示到一個包的源IP地址位置(LoopBack地址不會顯示到包的目的IP地址位置)
4 可以用線程不停地發送和接收廣播消息,確認兩端的位置和證明自己的存在
   
 
作者:219.224.191.* 
<script></script>
  
2008-7-9 20:56   回覆此發言  
 

3 回覆:【Web】單播、多播、廣播的區別
 
學校開課C#網絡編程,今天就研究了一下"C#實現局域網UDP廣播,這一塊設置到局域網"飛鴿"類似的通訊軟件編程,需要用到的主要命名空間是:System.Net和System.Net.Sockets

接收端:

 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//初始化一個Scoket協議

 IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9095);//初始化一個偵聽局域網內部所有IP和指定端口

 EndPoint ep = (EndPoint)iep;

 socket.Bind(iep);//綁定這個實例

 while (true)
 {
 byte[] buffer = new byte[1024];//設置緩衝數據流

 socket.ReceiveFrom(buffer, ref ep);//接收數據,並確把數據設置到緩衝流裏面

 Console.WriteLine(Encoding.Unicode.GetString(buffer2).TrimEnd('/u0000') + " " + DateTime.Now.ToString());
 }

發送端:

 Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//初始化一個Scoket實習,採用UDP傳輸

 IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 9095);//初始化一個發送廣播和指定端口的網絡端口實例

 sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);//設置該scoket實例的發送形式

 string request = "你好,TEST SEND!";//初始化需要發送而的發送數據

 byte[] buffer = Encoding.Unicode.GetBytes(request);

 sock.SendTo(buffer, iep);

 sock.Close();

這樣就可以實現對整個局域網內廣播數據,和接收數據了.

參考:http://blog.csdn.net/tt03030576/archive/2008/03/14/2181444.aspx

2樓參考:
http://www.cnblogs.com/markor/archive/2007/06/08/776250.html
   
 
作者:219.224.191.* 
<script></script>
  
2008-7-9 21:25   回覆此發言  
 

4 2L與3L的程序對比
 
第一:
經測試,2L的接收端只能收到發送端的第一個SENDTO的內容,接收端兩次接收到的內容是一樣的,然後自動關閉。3L的接收端可以一直接收,不會自動關閉。

第二:
2L中的這段代碼
int recv = sock.ReceiveFrom(data, ref ep);
string stringData = Encoding.ASCII.GetString(data, 0, recv);
與3L中的這段代碼
socket.ReceiveFrom(buffer, ref ep);
Console.WriteLine(Encoding.Unicode.GetString(buffer).TrimEnd('/u0000') + " " + DateTime.Now.ToString());
的異同:都是爲了去除byte數組元素中的零。

前者:
解釋:
Encoding.ASCII.GetString(byteArray, 0, Array.IndexOf(byteArray, (byte)0));

類似問題:
Hi, All

I have a question about Encoding.ASCII.GetString.

I want convert a byte array to a string, I use
Encoding.ASCII.GetString(byteArray)
(byteArray is something like ['A', 'B', 'C', 0,0,0,0,...])

but the retult is a long string contain string("ABC") and many '0',

How can I only get string "ABC" of I needed?

後者:
解釋:
String.TrimEnd 方法(System)從此實例的結尾移除數組中指定的一組字符的所有匹配項。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章