007_原始套接字_基本网络检测技术.ppt
原始套接字与网络检测技术原始套接字n原始套接字是允许访问底层传输协议的一种套接字n原始套接字有两种类型:在IP头中使用预定义的协议,如ICMP在IP头中使用自定义的协议创建原始套接字n使用函数socket()或WSASocket()例:SOCKET sRaw=socket(AF_INET,SOCK_RAW,IPPRPTP_ICMP);n原始套接字提供管理下层传输的能力,它们可能会被恶意利用。因此,仅administrator组的成员能够创建SOCK_RAW类型的套接字。任何人在NT下都可以创建原始套接字,但是没有administrator权限的用户不能用它做任何事情,因为bind函数将会失败。ICMP协议nICMP(Internet Control Message Protocol),网间控制报文协议n互联网的操作由路由器监控着,遇有异常发生,具体事件通过该协议报告。ICMP报文nICMP报文可分为两大类:差错报告报文和查询报文n报文结构:类型(8b)代码(8b)校验和(16b)内容(取决于类型和代码)ICMP报文与IP报文的关系ICMP报文ICMP报文IP首部ICMP报文的类型种类类型代码报文差错控制报文30-15目的站不可达40-1源站抑制110-1时间超时120-1参数问题50改变路由查询报文8或00回送请求或回答13或140时间戳请求或回答17或180地址掩码请求或回答10或90路由器询问或通告表示ICMP头部的数据结构typedef struct icmp_hdr unsigned char icmp_type;/消息类型 unsigned char icmp_code;/代码 unsigned short icmp_checksum;/校验和 unsigned short icmp_id;/ID号 unsigned short icmp_sequence;/序列号 unsigned long icmp_timestamp;/时间戳 ICMP_HDR,*PICMP_HDR;校验和n校验和是网络传输中常用的差错控制方法。计算收到的数据的校验和,与其所带校验和进行比较,即可知数据在传输中是否受损n校验和的计算方法:将数据以字为单位累加到一个双字中,如果数据长度为奇数,最后一个字将被扩展成双字。最后将累加得到的双字的高位和低位相加后取反,便得到校验和。Ping程序:检测网络的可达性n原理:产生一个ICMP回显请求,并驱使它到感兴趣的主机n主要步骤:创建ICMP协议类型的套接字创建并初始化ICMP封包调用sendto()函数向远端主机发送ICMP请求调用recvfrom()函数接收ICMP响应SetTimeout()函数BOOL SetTimeout(SOCKET s,int nTime,BOOL bRecv)int ret=:setsockopt(s,SOL_SOCKET,bRecv?SO_RCVTIMEO:SO_SNDTIMEO,(char*)&nTime,sizeof(nTime);return ret!=SOCKET_ERROR;routeTracer程序:路由追踪n原理:由本地发送UDP封包到目的地址,递加TTL值。初始情况下,TTL值为,这个UDP封包到达第一个路由器后将中止。这个终止会促使路由器产生一个ICMP超时封包。然后TTL值加,再发送这个UDP封包。收集每个ICMP消息便可知道封包所经过的路由器。如果最终到达目的地址,多半会返回ICMP端口不可达消息,因为没有进程在等待这个封包。SetTTL()函数BOOL SetTTL(SOCKET s,int nValue)int ret=:setsockopt(s,IPPROTO_IP,IP_TTL,(char*)&nValue,sizeof(nValue);return ret!=SOCKET_ERROR;