单播、多播、广播的区别(看到网上有用的搜集)

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)从此实例的结尾移除数组中指定的一组字符的所有匹配项。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章