如何更好地理解“广播”


0. 定义

广播(Broadcast):

广播是指在IP子网内广播数据包,所有在子网内部的主机都将收到这些数据包。 

广播意味着网络向子网每一个主机都投递一份数据包,不论这些主机是否乐于接收该数据包。所以广播的使用范围非常小,

 只在本地子网内有效,通过路由器和交换机网络设备控制广播传输。

  

           “广播”可以理解为一个人通过广播喇叭对在场的全体说话,这样做的好处是通话效率高,信息一下子就可以传递到全体。


1.特点

    广播的优点: 


                        1)网络设备简单,维护简单,布网成本低廉 

                        2)由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。

   广播的缺点: 
                        1)无法针对每个客户的要求和时间及时提供个性化服务。 
                        2)网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。
                        3)广播禁止允许在Internet宽带网上传输。



与单播、多播的区别:


单播(Unicast):

      定义:

单播在发送者和每一接收者之间实现点对点网络连接。 

如果一台发送者同时给多个的接收者传输相同的数据,也必须相应的复制多份的相同数据包。

如果有大量主机希望获得数据包的同一份拷贝时, 将导致发送者负担沉重、延迟长、网络拥塞;

为保证一定的服务质量需增加硬件和带宽。


“单播”可以理解为一个人对另外一个人说话,此时信息的接收和传递只在两个节点之间进行。

       特点:


单播的优点: 


            1)服务器及时响应客户机的请求 


            2)服务器针对每个客户不通的请求发送不通的数据,容易实现个性化服务。 


单播的缺点: 


            1)服务器针对每个客户机发送数据流,服务器流量=客户机数量×客户机流量;在客户数量大、每个客户机流量大的流媒体应用中服务器不堪重负。 


            2)现有的网络带宽是金字塔结构,城际省际主干带宽仅仅相当于其所有用户带宽之和的5%。如果全部使用单播协议,将造成网络主干不堪重负。现在的P2P应用就已经使主干经常阻塞。而将主干扩展20倍几乎是不可能。




组播(Multicast):

    定义:


组播在发送者和每一接收者之间实现点对多点网络连接。 


如果一台发送者同时给多个的接收者传输相同的数据,也只需复制一份的相同数据包。


它提高了数据传送效率。减少了骨干网络出现拥塞的可能性。


                “多播”可以理解为一个人向多个人(但不是在场的所有人)说话,这样能够提高通话的效率。

    特点:

          优点: 


1)需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。具备广播所具备的优点。 


2)由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP协议允许有2亿6千多万个组播,所以其提供的服务可以非常丰富。 


3)此协议和单播协议一样允许在Internet宽带网上传输。


 缺点:


1)与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和QOS加以弥补。 


2)现行网络虽然都支持组播的传输,但在客户认证、QOS等方面还需要完善,这些缺点在理论上都有成熟的解决方案,只是需要逐步推广应用到现存网络当中。


单播可以看作仅包括一台机器群组的组播;

广播可以看作包含了所有机器群组的组播。

组播出现时间最晚但同时具备单播和广播的优点,最具有发展前景。



----------------------------UDP中的广播----------------------------------------


#coding=utf-8

import socket, sys

dest = ('<broadcast>', 7788)  #此处若使用192.168.1.255 ///为啥不用这个固定IP?因为用这个IP的话,前提是你自己的进程也要在这个网段里面,否则,就用不了。一般用broadcast。

# 创建udp套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 对这个需要发送广播数据的套接字进行修改设置,否则不能发送广播数据
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)#如果s套接字需要发送广播数据,那么可以加上这段代码

# 以广播的形式发送数据到本网络的所有电脑中
s.sendto("Hi", dest)#192.168.1.0  网络号   0->0000 0000   / 192.168.1.255  广播地址    255->1111 1111

print "等待对方回复(按ctrl+c退出)"

while True:
    (buf, address) = s.recvfrom(2048)
    print "Received from %s: %s" % (address, buf)