网络通信编程原始套接字.ppt
《网络通信编程原始套接字.ppt》由会员分享,可在线阅读,更多相关《网络通信编程原始套接字.ppt(95页珍藏版)》请在三一办公上搜索。
1、1,第四章,原始套接字,2,内容提要,1.使用原始套接字2.套接字选项3.ICMP编程4.使用IP头包含选项5.网络嗅探器实例,3,1.使用原始套接字,利用原始套接字(Raw Socket),可访问底层传输协议。,原始套接字(Raw Socket)与标准套接字区别,4,使用原始套接字可以做什么?实现一些实用工具(ping,traceroute)。可对IP头,TCP头,UDP头,ICMP头等进行操作。原始套接字使用SOCK_RAW套接字类型来创建的,目前只有Winsock2提供了对它的支持。无论Microsoft Windows CE 还是老版本的Windows 95(无Winsock 2升级)
2、均不能利用原始套接字。,5,创建原始套接字,原始套接字类型在IP头中使用预定义的协议(如ICMP)在IP头中使用自定义的协议(使用IP头包含选项),6,创建原始套接字 使用socket()或WSASocket()创建原始套接字。例:创建原始套接字使用预定义协议:SOCKET s;S=socket(AF_INET,SOCK_RAM,IPPROTO_ICMP);/ORS=WSAsocket(AF_INEF,SOCK_RAM,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);,7,使用自定义协议使用IGMP、UDP、IP或者原始IP,只需分别设置IPPROTO_IGM
3、P、IPPROTO_UDP、IPPROTO_IP或IPPROTO_RAW即可。注意:在Windows NT 4、Windows 98以及Windows 95(安装Winsock 2)操作系统中,创建原始套接字时,只能使用ICMP。协议标志IPPROTO_UDP、IPPROTO_IP以及IPPROTO_RAW均要求使用套接字选项IP_HDRINCL,而该选项在上述平台下都是不支持的。Windows 2000提供了对IP_HDRINCL选项的支持,所以能够处理IP头(IPPROTO_RAW)、TCP头(IPPROTO_TCP)以及UDP头(IPPROTO_UDP)。无论是否设置IP_HDRINCL
4、选项,原始套接字上接收到的数据都会包含IP头。,8,使用原始套接字可以对底层传输机制加以控制,所以有些人将其用于不法用途,,9,套接字选项操作函数getsocketopt()获取套接字选项信息。int getsocketopt(SOCKET s,/套接字描述符 int level,/选项级别 int optname,/选项名称 char*optval,/选项值 int*optlen/选项长度);setsocketopt()设置套接字选项。int setsocketopt(SOCKET s,int level,int optname,const char*optval,int optlen);,
5、2.套接字选项,10,选项级别:协议的层次对应选项级别应用层:SOL_SOCKET传输层:IPPROTO_TCP、IPPROTO_UDP网络层:IPPROTO_IP不同级别属性不同,同一级别的不同协议的属性不同,因此必须指定level参数例:Int nTime=2*1000setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*)&nTime,sizeof(nTime),11,SOL_SOCKET选项级别SO_ACCEPTCONN,如果已调用Listen函数,将套接字置为监听模式,这个选项就会返回TRUE。SOCK_DGRAM类型的套接字不支持这一选项。,SO_BR
6、OADCAST,12,SO_CONNECT_TIME,该选项最常见的用法是和AcceptEx函数一道使用。,SO_DONTROUTE,假定创建了一个UDP套接字,并将其与接口A绑定到一起,然后发送一个数据包,目的地址是网络中使用接口B的另一个网络上的某台机器。此时,若采用默认设置,该数据包会经过一个路由过程,使其能通过接口B传入目标网络。但将这里的布尔值设为TRUE,再来调用setsockopt,便可禁止路由,数据包会从绑定的接口上直接发送出去。以后可调用getsockopt,判断是否允许了路由。注意:在默认情况下,路由是允许的。,13,SO_REUSEADDR,监听套接字例外。两个独立的套接
7、字不可与同一个本地地址绑定到一起,以等待进入的连接通知。,SO_EXCLUSIVEADDRUSE,例如,假定两个单独的进程都与同一个本地地址绑定到了一起(假定已设置了SO_REUSEADDR),那么两个套接字中到底由哪一个负责接收进入连接请求通知呢?这一点并未定义!如果应用程序的要求非常苛刻(用于关键性任务的程序),这一点显然是非常不幸的。SO_EXCLUSIVEADDRUSE选项的作用便是将一个本地地址牢牢锁定在与它绑定的那个套接字上。,14,SO_RCVBUF,改缓冲区的大小,一个可能的原因是需要根据应用程序的行为,对缓冲区大小进行相应地调整。,SO_SNDBUF,15,SO_RCVTIM
8、EO,SO_SNDTIMEO,主要用于设置阻塞套接字的收发超时时间,超时时间实际上指明了阻塞时间的长短。当调用接收(发送)函数时,如果在SO _ RCVTIMEO(SO_ SNDTIMEO)指定的时间内没有数据到来,那么函数调用也会结束并且返回错误10060(WSAETIMEDOUT)。,16,IPPROTO_IP级别IPPROTO_IP这一级的套接字选项与IP协议存在密切联系,比如可用这些选项修改IP头的特定字段以及向IP多播组增添一个套接字等等。,IP_OPTIONS,通过该选项可在I P头内设置各种IP选项,可能出现的选项包括:记录路由:每个路由器都将自己的IP地址添加到IP头内。时间标
9、志(时间戳):每个路由器都增添自己的IP地址及时间。,17,源路由选择:源主机指定一条通过互联网的路径。注意:主机和路由器并不支持所有这些选项。设置一个IP选项时,传至setsockopt调用内部的数据会遵照下图所示的数据结构。IP选项头最长可达40字节。,IP选项头格式,18,IP_HDRINCL,若将IP_HDRINCL选项设为TRUE,发送函数会将IP头包括在发送的数据前面,并会促使接收函数将IP头作为数据的一部分。在调用一个Winsock发送函数的时候,必须在数据前面包括完整的IP头,并对IP头的每个字段进行正确的填写。仅仅用于原始套接字该选项仅适用于Windows 2000操作系统。
10、,19,IP_TTL,TTL字段需要在IP头内进行设置。数据报利用TTL字段对数据报能够通过的最大路由器数量加以限制,避免由于路由循环,造成数据报永无休止地在网络中“游荡”。数据报每经过一个路由器,都会由路由器解析出它的TTL值,并将其减去1。若发现这个值变成了0,数据报便会被“无情”地丢弃。注意,Windows CE不支持这个选项。,20,3.ICMP编程,内容提要ICMP协议PING程序分析TRACEROUTE程序分析,为了提高 IP 数据报交付成功的机会,在网际层使用了因特网控制报文协议 ICMP(Internet Control Message Protocol)。ICMP 允许主机或
11、路由器报告差错情况和提供有关异常情况的报告。ICMP 不是高层协议,而是 IP 层的协议。ICMP 报文作为 IP 层数据报的数据,加上数据报的首部,组成 IP 数据报发送出去。,ICMP协议,ICMP的位置及封装,IP,ICMP,IGMP,ARP,RARP,Network layer,ICMP message,ICMP message,ICMP 本身是一个网络层协议ICMP报文首先要封装成IP数据报,然后再传送给下一层,ICMP 报文的格式,首 部,ICMP 报文,0,数 据 部 分,检验和,类型,代码,(这 4 个字节取决于 ICMP 报文的类型),8,16,31,IP 数据报,前 4 个
12、字节都是一样的,ICMP 的数据部分(长度取决于类型),ICMP报文中各字段的作用,类型:8比特长字段,定义了报文的类型。代码:8比特长字段,指明了发送此特定报文类型的原因。检验和:16比特长字段,进行差错检验。首部的其余部分:对每一种报文类型都是特定的。数据部分:在差错报文中:所携带的信息可找出引起差错的原始分组;在查询报文中:携带了基于查询类型的额外信息。,报文类型,ICMP 报文,差错报告,查询,报告路由器或主机(目的站)在处理一个IP数据报时可能遇到的一些问题,帮助主机或网络管理员从一个路由器或另一个主机得到特定的信息它是成对出现的,ICMP 差错报告报文的数据字段的内容,首部,IP
13、数据报,ICMP 的前 8 字节,装入 ICMP 报文的 IP 数据报,IP 数据报首部,ICMP 差错报告报文,8字节,收到的 IP 数据报,IP 数据报首部,8字节,ICMP 差错报告报文,IP 数据报的数据字段,(1)回送请求和回答:由主机/路由器向一特定主机发出ICMP询问,特定主机收到后必须给出ICMP回答报文。,代码:0,检验和,可选数据(由请求报文发送,由回答报文重复),类型:8 or 0,标识符,序号,8:回送请求0:回送回答,ICMP查询报文,说明:,主机或路由器可以发送回送请求报文,收到回送请求报文的主机或路由器发送出回送回答报文。回送请求和回送回答报文可由网络管理员来使用
14、,用来检查IP协议的工作情况。用回送请求和回送回答报文可测试一个主机的可达性,通常是调用ping命令来这样做的。格式中的标识符和序号字段在协议中没有正式定义,可以由发送站任意使用。可供选择的数据字段包含一个报文,它必须由回答的结点在回送回答报文中完全一样的重复。,(2)时间戳请求和回答,代码:0,检验和,类型:13 or 14,标识符,序号,13:请求 14:回答,发送时间戳,接收时间戳,传送时间戳,说明:,发送时间戳:发送方填写接收时间戳:应答主机收到请求报文时填写传送时间戳:应答主机发送应答报文时填写,(3)地址掩码请求和回答,代码:0,检验和,类型:17 or 18,标识符,序号,17:
15、请求 18:回答,地址掩码,主机可能知道他的完整IP地址,但却不知道地址中的哪一部分定义网络地址和子网地址,哪一部分对应于主机标识符。这样,主机就需要知道掩码。要得到掩码,主机应发送地址掩码请求报文给局域网上的路由器。若主机知道该路由器的地址,它就将这个请求直接发给该路由器;若不知道,则广播此报文。路由器收到地址掩码请求报文就响应地址掩码回答报文,向主机提供所需的掩码。在请求报文中,地址掩码字段填入全0,回答报文中,这个字段就包含真正的掩码。,说明:,检验和,发送端的检验和计算:先将首部的检验和字段置为0。将分组划分为K部分,每部分都是16比特长。用反码算术运算将所有这些部分相加。将最终结果取
16、反码就得出检验和。再将其填入检验和字段。,接收端的检验和计算:将收到的分组划分为K部分,每部分都是16比特长。用反码算术运算将所有这些部分相加。将得到的结果取反码。若结果为0,则接收此分组,否组就拒绝此分组。,在ICMP中,检验和的计算覆盖了整个报文(首部和数据)。,PING程序分析,使用原始套接字实现回送请求和回答(PING程序的设计与实现),PING 用来测试两个主机之间的连通性。PING 使用了 ICMP 回送请求与回送回答报文。PING 是应用层直接使用网络层 ICMP 的例子,它没有通过运输层的 TCP 或UDP。,C:Documents and Settingswy ping,代码
17、:0,检验和,可选数据(由请求报文发送,由回答报文重复),类型:8 or 0,标识符,序号,8:回送请求0:回送回答,PING 使用了 ICMP 回送请求与回送回答报文,原始套接字的创建,函数格式:/创建原始套节字 SOCKET sRaw=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);IPPROTO_ICMP指定使用ICMP,PING 程序执行步骤,1、创建协议类型为IPPROTO_ICMP的原始套接字,设置套接字的属性。2、创建并初始化ICMP封包。3、调用sendto函数向远程主机发送ICMP请求。4、调用recvfrom函数接收ICMP响应。,/Ping.h
18、/声明IP头数据结构typedef struct _IPHeader/20字节的IP头 UCHAR iphVerLen;/版本号和头长度(各占4位)UCHAR ipTOS;/服务类型 USHORT ipLength;/封包总长度,即整个IP报的长度 USHORT ipID;/封包标识,惟一标识发送的每一个数据报 USHORT ipFlags;/标志和片偏移 UCHAR ipTTL;/生存时间,就是TTL UCHAR ipProtocol;/协议,可能是TCP、UDP、ICMP等 USHORT ipChecksum;/校验和 ULONG ipSource;/源IP地址 ULONG ipDesti
19、nation;/目标IP地址 IPHeader,*PIPHeader;,PING 程序代码,/ICMP头数据结构typedef struct icmp_hdr unsigned char icmp_type;/消息类型 unsigned char icmp_code;/代码 unsigned short icmp_checksum;/校验和 unsigned short icmp_id;/用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_sequence;/序号 unsigned long icmp_timestamp;/数据传输时间 ICMP_HDR,*
20、PICMP_HDR;/ICMP回送请求的数据结构typedef struct _EchoRequestICMP_HDR icmphdr;char cData32;ECHOREQUEST,*PECHOREQUEST;,/ICMP回送应答的数据结构#define REQ_DATASIZE 32typedef struct _EchoReplyIPHeader iphdr;ECHOREQUEST echoRequest;ECHOREPLAY,*PECHOREPLAY;/校验和的计算/以16位的字为单位将缓冲区的内容相加,如果缓冲区长度为奇数,/则再加上一个字节。它们的和存入一个32位的双字中USHO
21、RT checksum(USHORT*buff,int size);,/Ping.cpp#include#include#pragma comment(lib,WS2_32)/链接到WS2_32.lib#include#include ping.h,USHORT checksum(USHORT*buff,int size)u_long cksum=0;while(size1)/将数据以字为单位累加到cksum 中 cksum=cksum+*buff;buff=buff+1;size=size-sizeof(USHORT);/等价于size=size-2;if(size=1)/共有奇数个字节将最
22、后一个字节扩展为字,再累加 USHORT u=0;u=(USHORT)(*(UCHAR*)buff);cksum=cksum+u;/校验位计算/高16位和低16位相加cksum=(cksum 16)+(cksum,位右移运算符 右边的值依次被移出了,左边的位置依次放0,校验位计算(1)将32位的chsum高16位和低16位相加(2)自加当前数的高16位(3)取反并转换为16位,int main()WSADATA wsaData;WORD version=MAKEWORD(2,2);int ret=WSAStartup(version,/创建ICMP封包(回送请求)ECHOREQUEST ech
23、oReq;/填写ICMP封包数据=8;/请求一个ICMP回显=0;=(USHORT)GetCurrentProcessId();=0;=0;/填充数据部分,可以为任意memset(/Sets buffers to a specified character.,/开始发送和接收ICMP封包USHORT nSeq=0;SOCKADDR_IN from;int nLen=sizeof(from);while(TRUE)static int nCount=0;int nRet;if(nCount+=4)break;=0;/GetTickCount()系统开始后,已经经过的毫秒数=GetTickCoun
24、t();=nSeq+;=checksum(USHORT*),/接收回送应答包ECHOREPLAY echoReply;nRet=recvfrom(sRaw,(char*),/下面开始解析接收到的封包if(nRet sizeof(ECHOREPLAY)printf(Too few bytes from%s n,inet_ntoa(from.sin_addr);/接收到的数据中包含IP头,IP头大小为20个字节if!=0)/回显printf(nonecho type%d recvd n,);return-1;if!=GetCurrentProcessId()printf(someone elses
25、 packet!n);return-1;,printf(%d bytes Reply from%s:,nRet,inet_ntoa(from.sin_addr);printf(icmp_seq=%d.,);int nTick=GetTickCount();printf(time:%d ms,nTick-);printf(TTL=%d,);printf(n);Sleep(1000);WSACleanup();/释放Winsock库return 0;,64 bytes Reply from 192.168.0.2:icmp_seq=0.time:0 ms TTL=6464 bytes Reply
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 通信 编程 原始 套接

链接地址:https://www.31ppt.com/p-6194613.html