文档详情

第7章 直接网络编程技术.ppt

发布:2017-08-10约3.03千字共16页下载文档
文本预览下载声明
第7章 直接网络编程技术 常规网络编程方法:无法直接访问到位于网络层和数据链路层的网络协议。如NetBIOS和Winsock。 直接网络编程方法: 原始套接字 基于Winpcap的网络数据包捕获技术 基于libnet的网络数据包构造技术 TCP/IP网络层协议 TCP/IP网络层协议及数据单元 (1)IP协议 (2)ARP协议 (3)RARP协议 (4)ICMP协议 (5)IGMP协议 原始套接字编程 原始套接字可以对底层的传输协议加以控制,对IP头信息进行实际的操作,通过它可以模拟一些IP的实用工具,如Tracert和Ping等。 原始套接字(raw socket)是使用SOCK_RAW这个套接字类型来创建的。目前WinSock 2提供了对它的支持。利用原始套接字可直接访问网络层协议数据。 7.1 创建原始套接字 创建原始套接字可用Socket或WSASocket函数。 下述代码片断解释了如何将ICMP作为一种基层IP协议来完成一个原始套接字的创建: SOCKET s; s=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); if(s==INVALID_SOCKET) {//创建套接字失败} 创建原始套接字 使用不同协议创建原始套接字: ICMP: socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) IGMP: socket(AF_INET, SOCK_RAW, IPPROTO_IGMP) UDP: socket(AF_INET, SOCK_RAW, IPPROTO_UDP) IP: socket(AF_INET, SOCK_RAW, IPPROTO_IP) 原始IP: socket(AF_INET, SOCK_RAW, IPPROTO_RAW) 创建原始套接字 由于使用原始套接字可以控制基层传输机制,存在潜在的安全隐患,因此,在Windows NT/2000/XP上,只有属于“管理员” (administrator) 组的成员,才有权创建类型为SOCK_RAW的套接字。在Windows 9x中,系统未对SOCK_RAW的使用加以限制。 完成了原始套接字的创建后,就可以在发送及接收调用中使用对应的套接字句柄。 7.2 ICMP协议 Internet控制消息协议(ICMP)是IP层的一个组成部分,配合IP协议使用,它在IP系统间传递差错和一些需要注意的信息。ICMP报文通常被IP层或更高协议(TCP或UDP)使用。 ICMP报文格式 ICMP报文类型 ICMP报文类型 7.3 ICMP实现——ping示例 该ping程序的主要功能: 测试目标主机的可达性(是否处于活动状态、是否可以通过网络访问到) 测试源主机与目标主机的数据往返时间 记录到目标主机的路由(最多9个)——可选 ping目标主机时,该程序自动向目标主机发送4个回送请求的ICMP报文,每个报文的数据部分长度为32个字节 Ping程序的实现 Ping程序的实现:主机向远程计算机发出ICMP回应请求以后,远程计算机会处理这个请求,然后生成一条回应应答消息,再通过网络传回给发送主机;假如由于某些原因,不能抵达目标主机,就会生成对应的ICMP错误消息(比如“目标主机不可到达”),由那个路径上某处的一个路由器返回。假定与远程主机的物理性连接并不存在问题,但远程主机已经关机或没有设置对网络事件作出响应,便需由自己的程序来执行超时检查,来检测这样的情况。 程序步骤 本例利用了原始套接字和IPPROTO_ICMP协议的特性,其编写步骤如下: (1) 创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。 (2) 创建并初始化ICMP头。 (3) 调用sendto或WSASendto,将ICMP请求发给远程主机。 (4) 调用recvfrom或WSARecvfrom,以接收任何ICMP响应。 7.4 原始套接字的编程方法 创建套接字 创建套接字使用WSASocket或socket函数来完成。 SOCKET WSASocket(int af, int type, int protocol, LPWSAPROTOCOL_INFO lpProtocolInfo, GROUP g, DWORD dwFlag
显示全部
相似文档