Windows网络编程 の 原始套接字学习笔记ICMP

 

 

原始套接字学习笔记

 

由于原始套接字能够对基层传输机制加以控制,所以存在一定的潜在的安全漏洞,因此在WIN NT下只有“Administrators”组的成员,才有权创建类型为SOCK_RAW的原始套接字,

但是在NT中可以通过修改注册表绕过这一限制,能够达到让系统禁制对原始套接字的安全检查

方法如下:

注册表中创建如下变量 并设置为1DWORD类型)

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/AFD/Parameters/DisableRawSecurity

 

 

 

 

 

 Windows网络编程 の 原始套接字学习笔记ICMP_第1张图片

icmp头结构

struct icmp_hdr { BYTE icmp_type; //类型 --> 查询/错误两类 BYTE icmp_code; //代码 --> 查询或消息的类型 USHORT icmp_cksum; //效验和 -->对ICMP USHORT icmp_id; //标识符 USHORT icmp_seq; //序列号 ULONG icmp_timestamp; //当前时间 };

1 :由类型和代码定义了ICMP查询或消息的类型
2 :校验和是对ICMP头内容的一个补余求和 其
  
计算方法如下函数

//网际校验和是被校验数据16位值的反码和(ones-complement sum) WORD CalcCheckSum(IN unsigned short* addr,IN int len) { int nleft = len; int sum = 0; unsigned short* w = addr; unsigned short answer = 0; while(nleft > 1) { sum += *w++; nleft -= 2; } if(nleft == 1) { *(unsigned char*)(&answer) = *(unsigned char*)w; sum += answer; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return (answer); }

 

用原始套接字发送报文发送的字节一般为
sendto
sizeof(ICMP头大小) + SendData(数据长度)
接收大小为
recvfrom
sizeof(ip头大小) + sizeof(ICMP头大小) + RecvData(数据长度)

IP头的结构如下

struct ip_hdr { unsigned char h_len:4; //length of header unsigned char version:4; //Version of IP unsigned char tos; //Type of service unsigned short total_len; //total length of the packet unsigned short ident; //unique identifier unsigned short frag_and_flags; //flags unsigned char ttl; //ttl unsigned char proto; //protocol(TCP ,UDP etc) unsigned short checksum; //IP checksum unsigned int sourceIP; unsigned int destIP; };

 

/---------------------------------------------------------------------------------------------/

 

 

 

 

 如果在编写Ping工具的时候希望可以记录经过的路由的IP和Name可以通过

通过

套接字选项setsockopt()设置IP_OPTIONS选项

这样在ICMP包抵达路由器时,他的IP地址就能自动添加到到ICMP包的IP选项头中

 

关于setsockopt看MSDN

 

 

 Windows网络编程 の 原始套接字学习笔记ICMP_第2张图片

 

你可能感兴趣的:(网络编程)