基于UDP的组播通信

Download Report

Transcript 基于UDP的组播通信

组播技术
• 组播(multicast)是一到多或者多到多的多方通信形
式,远程会议、交互式仿真、分布式内容系统、
多方游戏等应用都对组播业务(multicast service)
提出了需求。在OSI模型的网络层或者应用层实
现业务是目前组播业务的两种实现体制。
• 主机组(host group)是IP组播概念的核心,多个主
机组成主机组,用一个IP组播地址标识,以组地
址为目的地址的组播数据以IP数据报的best-effort
方式转发到主机组的各个主机。组播路由器承担
组播数据的寻路和转发控制功能,这些路由器及
链路在网络中形成了一个控制组播数据传送的逻
辑结构,称为组播转发结构(delivery structure),
这种结构一般是树形的结构,称为转发树,在转
发树上的组播路由器接收、复制、转发组播数据。
• 组播路由协议是IP组播协议体系中最核心的功能。
IP组播路由协议的发展分成域内(intra-domain)
和域间(inter-domain)两个阶段:最初的IP组播
路由协议将网络看成没有层次结构的平面网络,
组播路由算法采用广播方式交互协议消息,因而
只能应用在IP网络的路由自治域内,称为域内路
由协议;域间路由协议的出现是为了解决在大型
的、分层的IP网络中组播路由问题,大型IP网络
采用自治域结构形式组织网络,域间路由协议解
决了分层结构网络的组播路由问题。
基于UDP的组播通信
• 一般数据报通信是在两台主机之间的点对点通信,称为“单播
(Unicast)”。当多台主机同时接收一个数据报时,若采用单播通
信,则源主机需要给每个接收主机发送一个相同的数据报;若采用组
播通信,则源主机只需发送一个数据报即可到达每个接收主机,从而
节省了网络带宽,降低了发送主机的负荷。
• 组播(Multicast)是一种特殊的数据报传输方式,它将具有相同需求
的主机加入到某一个组,向组发送的信息,其所有成员均可接收到。
– 组是用组播地址(在IPv4中,D类IP地址:224.0.0.0-239.255.255.255)
和标准 UDP 端口号来标识的,即待发送数据报的目的地址为一个组播地
址。主机可以申请加入某个组播地址所标识的组,也可以从该组中退出。
– 组播地址被划分为局部链接组播地址、预留组播地址和管理权限
组播地址三类。其中,局部链接组播地址范围在
224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,
路由器并不转发属于此范围的IP包;预留组播地址为
224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网
络协议;管理权限组播地址为239.0.0.0~239.255.255.255,可供
组织内部使用,类似于私有IP地址,不能用于Internet,可限制组
播范围。
MulticastSocket类
• 为了实现组播通信,java.net包中有相应的
MulticastSocket类。多播数据报套接字类
MulticastSocket是DatagramSocket类的子类,它用
来发送和接收IP多播包,同时可以沿用数据报通信的
一些主要方法。其构造方法与常用方法如表所示。
构造方法
功能
·public MulticastSocket()throws IOException
·public MulticastSocket(int port) throws
IOException
·public MulticastSocket(SocketAddress
bindaddr) throws IOException
·创建多播套接字
·创建多播套接字并将其绑定到特定
端口
·创建绑定到指定套接字地址的
MulticastSocket
常用方法
功能
·public void
·加入多播组
·加入指定接口上的
指定多播组
·离开多播组
·离开指定本地接口
上的多播组
joinGroup(InetAddress mcastaddr)
·public void joinGroup(SocketAddress
mcastaddr, NetworkInterface netIf)
·public void leaveGroup(InetAddress
mcastaddr)
·public void leaveGroup(SocketAddress
mcastaddr, NetworkInterface netIf)
• 在官方文档中,对于MulticastSocket类的主要方法如下:
MulticastSocket类继承了UDP DatagramSocket类,是对
UDP DatagramSocket类的扩展,它增加了组播的一些特
定操作。
• MulticastSocket类允许用户发送和接收使用组播IP的数据
报。若要发送或接收组播数据,首先要创建一个组播套接
字,运用MulticastSocket类的构造器创建缺省端口号的以
及指定端口号的组播套接字。
• 使用joinGroup()方法加入到一个组播组,使用
leaveGroup()方法脱离一个组播组。
• 使用send()方法发送组播数据,使用receive()方法接收组
播数据。
• 编写一个Java组播应用程序主要完成以下过程:
(1)
创建一个需要发送的按规定编址的DatagramPacket数据报。
(2)
建立一个用于发送和接收的MulticastSocket套接字。
(3)
加入一个组播组。
(4)
将数据报放入MulticastSocket套接字中发送出去。
(5)
等待从MulticastSocket套接字接收数据报。
(6)
解码数据报提取信息。
(7)
根据得到的信息作出相应
(8)
重复过程(5)-(7) 。
(9)
离开组播组,关闭MulticastSocket。
组播发送程序(服务器)
import java.net.*;
public class BroadCast extends Thread
{ String s="天气预报,最高温度32度,最低温度25度";
int port=5858;
//组播的端口
InetAddress group=null;
//组播组的地址
MulticastSocket socket=null;
//多点广播套接字
BroadCast()
{try
{
group=InetAddress.getByName("239.255.8.0"); //设置组播组的地址为239.255.8.0
socket=new MulticastSocket(port);
//多点组播套接字将在port端口播出
socket.setTimeToLive(1);
//设置组播套接字发送数据报范围为本地网络
socket.joinGroup(group);
//加入多播组,加入group后,socket发送的数据报
}
//可以被加入到group中的成员接收到
catch(Exception e)
{ System.out.println("Error: "+ e);
}
}
public void run()
{ while(true)
{ try{ DatagramPacket packet=null;
//待广播的数据包
byte data[]=s.getBytes();
packet=new DatagramPacket(data,data.length,group,port);
System.out.println(new String(data));
socket.send(packet);
//多播数据包
sleep(2000);
}
catch(Exception e)
{ System.out.println("Error: "+ e);
}
}
}
public static void main(String args[])
{ new BroadCast().start();
}
}