




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 实验 实验 ICMP 协议的分析与实现协议的分析与实现 实验目的实验目的 分析 ICMP 报文 理解 ICMP 协议在 Internet 网中的具体应用及其实现原理 深入了解 TCP IP 网 络的容错控制 学会运用网络套接字 Winsock 开发网络通信程序 实验内容实验内容 使用 Visual Studio C 6 0 和网络接口套接字 Socket 进行 Windows 环境下的网络编程 运用原 始嵌套字 RAW SOCKET 从 IP 层开始构造整个 ICMP 报文 通过 ICMP 协议所提供的回送请求 echo request 和回送应答 echo reply 这两种报文实现检测目的站的可达性与状态 1 IP 报头 报头 ICMP 报文的基本描述报文的基本描述 IP 协议并不能保证绝对的可靠 所以就设计了 ICMP 协议 进行差错报告 ICMP 消息使用 IP 头作为基本控制 IP 头的格式如下 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 Version IHL Type of Service Total Length Identification Flags Fragment Offset Time to Live Protocol Header Checksum Source Address Destination Address Version 4 IHL Internet 头长 Type of Service 0 Total Length IP 包的总长度 Identification Flags Fragment Offset 用于 IP 包分段 Time to Live IP 包的存活时长 Protocol ICMP 1 Header Checksum 头校验和 检查整个 IP 报头 Addresses 发送 Echo 消息的源地址是发送 Echo reply 消息的目的地址 相反 发送 Echo 消息的目的地址是发送 Echo reply 消息的源地址 2 Echo 或 Echo Reply 消息格式如下 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 Type Code Checksum Identifier Sequence Number Data Type echo 消息的类型为 8 echo reply 的消息类型为 0 Code 0 Checksum 为从 TYPE 开始到 IP 包结束的校验和 也就是校验整个 ICMP 报文 Identifier 如果 code 0 identifier 用来匹配 echo 和 echo reply 消息 Sequence Number 如果 code 0 identifier 用来匹配 echo 和 echo reply 消息 功能描述 收到 echo 消息必须回应 echo reply 消息 identifier 和 sequence number 可能被发送 echo 的主机用来匹配返回的 echo reply 消息 例如 identifier 可能用于类似于 TCP 或 UDP 的 port 用来标示一个会话 而 sequence number 会在每次发送 echo 请求后递增 收到 echo 的主机或 路由器返回同一个值与之匹配 2 数据结构数据结构 1 IP 报头格式报头格式 定义 IP 首部 typedef struct iphdr unsigned char h lenver 4 位 IP 版本号 4 位首部长度 unsigned char tos 8 位服务类型 TOS unsigned short total len 16 位 IP 包总长度 字节 unsigned short ident 1 6 位标识 用于辅助 IP 包的拆装 本实验不用 置零 unsigned short frag and flags 3 位标志位 13 位偏移位 也是用于 IP 包的拆装 本实验不用 置零 unsigned char ttl 8 位 IP 包生存时间 TTL unsigned char proto 8 位协议 TCP UDP 或其他 本实验置 ICMP 置为 1 unsigned short checksum 16 位 IP 首部校验和 最初置零 等所有包头都填写正确后 计算并替换 unsigned int sourceIP 32 位源 IP 地址 unsigned int destIP 32 位目的 IP 地址 IP HEADER 2 ICMP 报头格式报头格式 定义 ICMP 首部 3 typedef struct icmphdr unsigned char i type 8 位类型 本实验用 8 ECHO 0 ECHO REPLY unsigned char i code 8 位代码 本实验置零 unsigned short i cksum 16 位校验和 从 TYPE 开始 直到最后一位用户数据 如果为字节数 为奇数则补充一位 unsigned short i id 识别号 一般用进程号作为识别号 用于匹配 ECHO 和 ECHO REPLY 包 unsigned short i seq 报文序列号 用于标记 ECHO 报文顺序 unsigned int timestamp 时间戳 ICMP HEADER 3总体设计总体设计 ICMP 协议中的发送 接收 ICMP 回送请求报文 回送应答报文流程图 数据包太短 不是回送响 应 ID 不符合 输出数据报中的 IP 地址 填充 ICMP 数据报 发送数据报 接受数据报 去掉 IP 报头 获取 ICMP 信息 结束 y y y N N N 开 始 4 4 4 VCVC 中网络套接字中网络套接字 WinsockWinsock 编程基础编程基础 在 VC 中进行 WINSOCK 的 API 编程开发的时候 需要在项目中使用下面三个文件 否则会出现编 译错误 1 WINSOCK H 这是 WINSOCK API 的头文件 需要包含在项目中 2 WSOCK32 LIB WINSOCK API 连接库文件 在使用中 一定要把它作为项目的非缺省的连接库 包含到项目文件中去 3 WINSOCK DLL WINSOCK 的动态连接库 位于 WINDOWS 的安装目录下 几个基本的套接字 1 创建套接字 socket 功能 使用前创建一个新的套接字 格式 SOCKET PASCAL FAR socket int af int type int procotol 参数 af 通信发生的区域 type 要建立的套接字类型 procotol 使用的特定协议 2 指定本地地址 bind 功能 将套接字地址与所创建的套接字号联系起来 格式 int PASCAL FAR bind SOCKET s const struct sockaddr FAR name int namelen 参数 s 是由 socket 调用返回的并且未作连接的套接字描述符 套接字号 其它 没有错误 bind 返回 0 否则 SOCKET ERROR 地址结构说明 struct sockaddr in short sin family AF INET u short sin port 16 位端口号 网络字节顺序 struct in addr sin addr 32 位 IP 地址 网络字节顺序 char sin zero 8 保留 3建立套接字连接 connect 和 accept 功能 共同完成连接工作 格式 int PASCAL FAR connect SOCKET s const struct sockaddr FAR name int namelen SOCKET PASCAL FAR accept SOCKET s struct sockaddr FAR name int FAR addrlen 参数 同上 4 监听连接 listen 功能 用于面向连接服务器 表明它愿意接收连接 格式 int PASCAL FAR listen SOCKET s int backlog 5 数据传输 send 与 recv 5 功能 数据的发送与接收 格式 int PASCAL FAR send SOCKET s const char FAR buf int len int flags int PASCAL FAR recv SOCKET s const char FAR buf int len int flags 参数 buf 指向存有传输数据的缓冲区的指针 6 多路复用 select 功能 用来检测一个或多个套接字状态 格式 int PASCAL FAR select int nfds fd set FAR readfds fd set FAR writefds fd set FAR exceptfds const struct timeval FAR timeout 参数 readfds 指向要做读检测的指针 writefds 指向要做写检测的指针 exceptfds 指向要检测是否出错的指针 timeout 最大等待时间 7 关闭套接字 closesocket 功能 关闭套接字 s 格式 BOOL PASCAL FAR closesocket SOCKET s 5 5 部分程序代码部分程序代码 初始化初始化 SOCKETSOCKET WSADATA wsaData iErrorCode WSAStartup MAKEWORD 2 2 CheckSockError iErrorCode WSAStartup sockRaw socket AF INET SOCK RAW IPPROTO ICMP 原始套接字 CheckSockError sockRaw socket 设置超时时间设置超时时间 timeout time iErrorCode setsockopt sockRaw SOL SOCKET SO RCVTIMEO char 设置接受延 时 CheckSockError iErrorCode SO RCVTIMEO timeout time iErrorCode setsockopt sockRaw SOL SOCKET SO SNDTIMEO char 设置发送延 时 6 CheckSockError iErrorCode SO SNDTIMEO 获得目标主机获得目标主机 IPIP memset 初始化 dest 结构 dest sin family AF INET 填充 SOCKADDR IN 结构内容 if dest sin addr s addr inet addr lpdest INADDR NONE if hp gethostbyname lpdest NULL 目的主机名字不为空 memcpy dest sin family hp h addrtype printf dest sin addr s n inet ntoa dest sin addr else CheckSockError SOCKET ERROR gethostbyname 创建创建 ICMPICMP 数据包数据包 datasize sizeof ICMP HEADER 包长 icmp data char malloc 1024 创建 icmp 数据报内存空间 recvbuf char malloc 1024 接收 icmp 包缓冲区 if icmp data recvbuf CheckSockError SOCKET ERROR malloc memset icmp data 0 MAX PACKET 初始化 icmp data FillICMPData icmp data datasize 填充 icmp 包 printf Pinging s with d bytes of data timeout d ms n n inet ntoa dest sin addr datasize timeout 发送与接收发送与接收 ICMPICMP 数据包数据包 while 1 memset recvbuf 0 MAX PACKET 初始化接受缓冲区 static int nCount 0 设置发送 icmp 包的次数 一般为 4 if nCount 4 break ICMP HEADER icmp data i cksum 0 初设校验和为 0 ICMP HEADER icmp data timestamp GetTickCount 获得目前时间 ICMP HEADER icmp data i seq seq no icmp 数据报的序列号 7 ICMP HEADER icmp data i cksum checksum USHORT icmp data datasize 计算校验和 iErrorCode sendto sockRaw icmp data datasize 0 struct sockaddr 发送 icmp 数据报 if iErrorCode SOCKET ERROR 错误检查 if WSAGetLastError WSAETIMEDOUT printf timed out n continue CheckSockError SOCKET ERROR sendto if iErrorCode i type ICMP ECHO 发送 ping Request an ICMP echo icmp hdr i code 0 代码字段为 0 icmp hdr i id USHORT GetCurrentProcessId 获得当前进程号 icmp hdr i cksum 0 icmp hdr i seq 0 初始化序列号 datapart icmp data sizeof ICMP HEADER 加上 icmp 包头 Place some junk in the buffer memset datapart E datasize sizeof ICMP HEADER 填充 datapart 计算检验和计算检验和 USHORT checksum USHORT buffer int size unsigned long cksum 0 while size 1 cksum buffer size sizeof USHORT if size cksum UCHAR buffer 9 cksum cksum 16 cksum cksum cksum 16 return USHORT cksum ICMP ICMP 解包程序解包程序 void DecodeICMPHeader char buf int bytes struct sockaddr in from IP HEADER iphdr NULL ICMP HEADER icmphdr NULL unsigned short iphdrlen DWORD
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第二课 探究世界的本质教学设计-2025-2026学年高中政治统编版2019必修4 哲学与文化-统编版2019
- (2024年秋季版)江苏省七年级历史下册 第6课 北宋的政治说课稿 川教版
- 农场农机服务及安全保障协议
- Unit 1 When is your birthday教学设计-2025-2026学年小学英语Join in 外研剑桥英语四年级上册-Join in 外研剑桥英语
- 2025年航空机场行业投资趋势与盈利模式研究报告
- 2025年休闲农业与乡村旅游行业投资趋势与盈利模式研究报告
- 2025年航空电子行业需求分析及创新策略研究报告
- 2025年船员服务行业投资趋势与盈利模式研究报告
- (2025年标准)互动退出合伙协议书
- 2025年智慧健康行业前景分析及投资机遇研究报告
- 2025-2026学年人教版(2024)小学数学三年级上册教学计划及进度表
- 2025年福建省工会社会工作者(工会专干)招聘考试(工会基础知识)历年参考题库含答案详解(5套)
- 2025年人工流产试题及答案
- 2026届潍坊市达标名校中考联考语文试卷含解析
- (新教材)2025年秋期部编人教版二年级上册小学语文全册教案(教学设计)(新课标核心素养教案)
- (标准)棋牌室转让合同协议书
- 幼儿园膳食委员会组织机构及职责
- 手术室护理实践指南:院感控制管理
- ERP方案设计与研究
- 高二语文秋季开学第-课:笔墨山河待君行
- 阆中古镇管理办法细则
评论
0/150
提交评论