原文在我的csdn,http://blog.csdn.net/lixin88/article/details/56013014;
局域网发现的意义
局域网发现设备是通信的第一步,通信需要先知道对方的ip地址,因为一般使用 DHCP 动态分配 ip 地址的局域网内,各个主机的 IP 地址是由 DHCP 服务器来帮你分配 IP 地址的。所以在很多情况下,你要知道对方的 IP 地址是比较麻烦的。
因此,局域网发现,我们要解决的事情就是:如何找到局域网内其他设备,并获取到设备的ip;
查询资料之后,发现使用udp单播、组播、广播来实现的方式都有,并且亲测确实都可行,那么哪种更合适呢,这也是我写这篇的目的,让大家对这些有个基本概念和对比;
udp 不用保证数据可靠性,传输速度快;并且一般tcp是不用于多播场景的;那使用udp如何实现呢?
单播
只有一个源点网络和一个终点网络。源点网络和终点网络的关系是一对一的。数据报途径的每一个路由器都要将这个分组仅从一个接口转发出去。
图例:
多播
在多播系统中,有一个源点一组终点。这是一对多的关系。在这种类型的通信中,源地址是一个单播地址,而目的地址则是一个组地址。
图例:
多播的优点
q 具有同种业务的主机加入同一数据流,共享同一通道,节省了带宽和服务器的优点,具有广播的优点而又没有广播所需要的带宽。
q 服务器的总带宽不受客户端带宽的限制。由于组播协议由接收者的需求来确定是否进行数据流的转发,所以服务器端的带宽是常量,与客户端的数量无关。
q与单播一样,多播是允许在广域网即Internet上进行传输的,而广播仅仅在同一局域网上才能进行。
广播的缺点
q 多播与单播相比没有纠错机制,当发生错误的时候难以弥补,但是可以在应用层来实现此种功能。
q 多播的网络支持存在缺陷,需要路由器及网络协议栈的支持。
多播的应用主要有网上视频、网上会议等。
组播与广播
广播数据报的接收是被动的。
连接到子网上的所有主机都要接收广播数据报,这会增加网络流量,并且子网上的主机增加额外的负担。
UDP广播只能在内网(同一网段)有效,而组播可以较好实现跨网段群发数据。
UDP广播:消耗更多网络带宽,路由器向子网内的每个终端都投递一份数据包,不论这些终端是否乐于接收该数据包;
UDP组播:有了很大优化,只有终端加入到了一个广播组,UDP组播的数据才能被他接收到;
多播数据报的接收是主动的。主机主动加入指定的多播组,才会接收该组的多播数据报。
不同子网内的A,B进行组播通信,依靠IGMP协议;局域网组播,不考虑跨网段的组播实现,因此组播路由协议IGMP与本文要介绍的内容无关;
多播的地址是特定的,D类地址用于多播。D类IP地址就是多播IP地址,即224.0.0.0至239.255.255.255之间的IP地址,并被划分为局部连接多播地址、预留多播地址和管理权限多播地址3类:
q局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。
q 预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。
q 管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。
局域网发现可以使用:
1.udp单播,获取源主机的ip和子网掩码,得到该局域网的ip地址范围,然后使用udp单播轮询 找到对应的目标主机;
2.udp组播,让源主机和目标主机都加到同一个局部多播地址;源主机给该多播地址发送组播消息即可;
3.udp广播,使用广播地址255.255.255.255 来广播定制好的消息;
综合考虑:udp单播轮询比较耗时,而且如果局域网内设备较多,UDP发送过快的话,会导致本地发送缓冲区丢包;接收过慢的话,也会导致接收缓冲丢包;单播和广播一样,对于不需要关心该消息的主机是一种打扰;
因此,使用udp组播来实现局域网发现比使用udp广播更合适;并且我之后会学习mdns和dns-sd,而这两种都是基于udp组播,所以用组播来实现对于后面的深入研究更有意义;
现在,我们来实现一个最简单的局域网发现的demo;具体实现请看下一篇