网络课程设计报告4080117
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告利用DELPHI实现IGMP协议
系别电子信息系
专业名称计算机科学与技术
班级学号4080117
学生姓名徐本领
指导教师曲荣欣
成绩
2011年7月13日
1设计题目
利用DELPHI 实现IGMP 协议
2目的要求
了解IGMP 协议的基本原理和功能 熟悉DELPHI 软件编程操作
通过用DELPHI 编程实现Internet 组管理协议的基本功能
3设计分析
协议
Internet 组管理协议(IGMP )是因特网协议家族中的一个组播协议,用于IP 主机向任一个直接相邻的路由器报告他们的组成员情况。IGMP 信息封装在IP 报文中,其IP 的协议号为2。它用来在IP 主机和与其直接相邻的组播路由器之间建立、维护组播组成员关系。IGMP 不包括组播路由器之间的组成员关系信息的传播与维护,这部分工作由各组播路由协议完成。所有参与组播的主机必须实现IGMP 。 参与IP 组播的主机可以在任意位置、任意时间、成员总数不受限制地加入或退出组播组。组播路由器不需要也不可能保存所有主机的成员关系,它只是通过IGMP 协议了解每个接口连接的网段上是否存在某个组播组的接收者,即组成员。而主机方只需要保存自己加入了哪些组播组。
IGMP 在主机与路由器之间是不对称的:主机需要响应组播路由器的IGMP 查询报文,即以IGMP MEMBERSHIP REPORT 报文响应;路由器周期性发送成员资格查询报文,然后根据收到的响应报文确定某个特定组在自己所在子网上是否有主机加入,并且当收到主机的退出组的报告时,发出特定组的查询报文(IGMP 版本2),以确定某个特定组是否已无成员存在。
如何封装在IP 数据报中
正如ICMP 一样,IGMP 也被当作IP 层的一部分。IGMP 报文通过IP 数据报进行传输。不像我们已经见到的其他协议,IGMP 有固定的报文长度,没有可选数据。图3-2显示了IGMP
报文的字段格式
图3-3显示了长度为8字节的IGMP 的报文格式
这是版本为1的IGMP 。IGMP 类型为1说明是由多播路由器发出的查询报文,为2说明是主机发出的报告报文。检验和的计算和ICMP 协议相同。 组地址为D 类IP 地址。在查询报
部 20字节
8字节
3
7 8
15 16
31
文中组地址设置为0,在报告报文中组地址为要参加的组地址。
加入一个多播组
多播的基础就是一个进程的概念(使用的术语进程是指操作系统执行的一个程序),该进程在一个主机的给定接口上加入了一个多播组。在一个给定接口上的多播组中的成员是动态的—它随时因进程加入和离开多播组而变化。
这里所指的进程必须以某种方式在给定的接口上加入某个多播组。进程也能离开先前加入的多播组。这些是一个支持多播主机中任何API所必需的部分。使用限定词“接口”是因为多播组中的成员是与接口相关联的。一个进程可以在多个接口上加入同一多播组。
报告和查询
多播路由器使用IGMP报文来记录与该路由器相连网络中组成员的变化情况。使用规则如下:
(1) 当第一个进程加入一个组时,主机就发送一个IGMP报告。如果一个主机的多个进程加入同一组,只发送一个IGMP报告。这个报告被发送到进程加入组所在的同一接口上。
(2) 进程离开一个组时,主机不发送IGMP报告,即便是组中的最后一个进程离开。主机知道在确定的组中已不再有组成员后,在随后收到的IGMP查询中就不再发送报告报文。
(3) 多播路由器定时发送IGMP查询来了解是否还有任何主机包含有属于多播组的进程。多播路由器必须向每个接口发送一个IGMP查询。因为路由器希望主机对它加入的每个多播组均发回一个报告,因此IGMP查询报文中的组地址被设置为0。
(4) 主机通过发送IGMP报告来响应一个IGMP查询,对每个至少还包含一个进程的组均要发回IGMP报告。
4详细设计
主机端设计界面
服务器端设计界面
主机加入服务器广播组
从服务器端查询主机
服务器向主机发送广播消息
主机收到服务器的广播消息
单个主机离开组播
主机离开后服务器再次广播
主机端显示离开的主机收不到广播消息
5程序源代码
服务器端代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs , Buttons, StdCtrls, ExtCtrls, ColorGrd, Sockets, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,IdSocketHandle; type
Tms = class(TForm)
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Edit1: TEdit;
ListBox1: TListBox;
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
private
ComputerName: array[0..127] of Char;
{ Private declarations }
public
{ Public declarations }
end;