实验3icmp协议实践ping解析
网络协议分析实验报告

网络协议分析实验报告学院:班级:姓名:学号:1 实验1 基于ICMP 的MTU 测量方法实验目的1) 掌握ICMP 协议协议 2) 掌握PING 程序基本原理程序基本原理 3) 掌握socket 编程技术编程技术 4) 掌握MTU 测量算法测量算法实验任务编写一个基于ICMP 协议测量网络MTU 的程序,程序需要完成的功能:的程序,程序需要完成的功能: 1)使用目标IP 地址或域名作为参数,测量本机到目标主机经过网络的MTU ; 2)输出到目标主机经过网络的MTU 。
实验环境1)Linux 系统;系统;2)gcc 编译工具,gdb 调试工具。
调试工具。
实验步骤1. 首先仔细研读ping.c 例程,熟悉linux 下socket 原始套接字编程模式,为实验做好准备;原始套接字编程模式,为实验做好准备;2. 生成最大数据量的IP 数据报(64K ),数据部分为ICMP 格式,ICMP 报文为回送请求报文,IP 首部DF 位置为1;由发送线程发送;;由发送线程发送; 3. 如果收到报文为目标不可达报文,减少数据长度,再次发送,直到收到回送应答报文。
至此,MTU 测量完毕。
测量完毕。
实验原理ICMP:ICMP 是(Internet Control Message Protocol )Internet 控制报文协议。
它是TCP/IP 协议族的一个子协议,用于在IP 主机、路由器之间传递控制消息。
控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
是对于用户数据的传递起着重要的作用。
PING 程序基本原理:向网络上的另一个主机系统发送ICMP 报文,报文,如果指定系统得到了如果指定系统得到了报文,它将把报文一模一样地传回给发送者。
报文,它将把报文一模一样地传回给发送者。
MTU :是网络最大传输单元(包长度),IP 路由器必须对超过MTU 的IP 报进行分片目的主机再完成重组处理,的主机再完成重组处理,所以确定源到目的路径所以确定源到目的路径MTU 对提高传输效率是非常必要的。
实验3 ICMP协议实践ping解析资料

实验3I C M P协议实践p i n g解析计算机网络实验上机指导书专业班级学号姓名沈阳工程学院信息工程系实验2ICMP协议实践--ping解析一.实验目的掌握ICMP原理,利用其实现网络主机状态测试。
二.实验内容利用ICMP协议原理编程实现PING命令,测试目标主机是否可到达。
并了解Ping实现原理。
三.实验前的准备●了解ICMP原理及相关概念。
●掌握相关软件编程知识。
四.实验要求及实验软硬件环境【基本要求】●设计程序完成PING命令。
●完成此项实验,完成实验报告。
【实验组织方式】●个人实验【实验条件】●局域网环境下微机两台,编程软件。
五.实验步骤六..了解ICMP原理以及网络编程(1)源程序:Windows//// Ping.h//#pragma pack(1)#define ICMP_ECHOREPLY 0#define ICMP_ECHOREQ 8// IP Header -- RFC 791typedef struct tagIPHDR{u_char VIHL; // Version and IHLu_char TOS; // Type Of Serviceshort TotLen; // Total Lengthshort ID; // Identificationshort FlagOff; // Flags and Fragment Offsetu_char TTL; // Time To Liveu_char Protocol; // Protocolu_short Checksum; // Checksumstruct in_addr iaSrc; // Internet Address - Sourcestruct in_addr iaDst; // Internet Address - Destination}IPHDR, *PIPHDR;// ICMP Header - RFC 792typedef struct tagICMPHDR{u_char Type; // Typeu_char Code; // Codeu_short Checksum; // Checksumu_short ID; // Identificationu_short Seq; // Sequencechar Data; // Data}ICMPHDR, *PICMPHDR;#define REQ_DATASIZE 32 // Echo Request Data size // ICMP Echo Requesttypedef struct tagECHOREQUEST{ICMPHDR icmpHdr;DWORD dwTime;char cData[REQ_DATASIZE];}ECHOREQUEST, *PECHOREQUEST;// ICMP Echo Replytypedef struct tagECHOREPLY{IPHDR ipHdr;ECHOREQUEST echoRequest;char cFiller[256];}ECHOREPLY, *PECHOREPLY;#pragma pack()//// PING.C -- Ping program using ICMP and RAW Sockets//#include <stdio.h>#include <stdlib.h>#include <winsock.h>#include "ping.h"// Internal Functionsvoid Ping(LPCSTR pstrHost);void ReportError(LPCSTR pstrFrom);int WaitForEchoReply(SOCKET s);u_short in_cksum(u_short *addr, int len);// ICMP Echo Request/Reply functionsint SendEchoRequest(SOCKET, LPSOCKADDR_IN);DWORD RecvEchoReply(SOCKET, LPSOCKADDR_IN, u_char *); // main()void main(int argc, char **argv){WSADATA wsaData;WORD wVersionRequested = MAKEWORD(1,1);int nRet;// Check argumentsif (argc != 2){fprintf(stderr,"\nUsage: ping hostname\n");return;}// Init WinSocknRet = WSAStartup(wVersionRequested, &wsaData);if (nRet){fprintf(stderr,"\nError initializing WinSock\n");return;}// Check versionif (wsaData.wVersion != wVersionRequested){fprintf(stderr,"\nWinSock version not supported\n");return;}// Go do the pingPing(argv[1]);// Free WinSockWSACleanup();}// Ping()// Calls SendEchoRequest() and// RecvEchoReply() and prints resultsvoid Ping(LPCSTR pstrHost){SOCKET rawSocket;LPHOSTENT lpHost;struct sockaddr_in saDest;struct sockaddr_in saSrc;DWORD dwTimeSent;DWORD dwElapsed;u_char cTTL;int nLoop;int nRet;// Create a Raw socketrawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if (rawSocket == SOCKET_ERROR){ReportError("socket()");return;}// Lookup hostlpHost = gethostbyname(pstrHost);if (lpHost == NULL){fprintf(stderr,"\nHost not found: %s\n", pstrHost);return;}// Setup destination socket addresssaDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));saDest.sin_family = AF_INET;saDest.sin_port = 0;// Tell the user what we're doingprintf("\nPinging %s [%s] with %d bytes of data:\n",pstrHost,inet_ntoa(saDest.sin_addr),REQ_DATASIZE);// Ping multiple timesfor (nLoop = 0; nLoop < 4; nLoop++){// Send ICMP echo requestSendEchoRequest(rawSocket, &saDest);// Use select() to wait for data to be receivednRet = WaitForEchoReply(rawSocket);if (nRet == SOCKET_ERROR){ReportError("select()");break;}if (!nRet){printf("\nTimeOut");break;}// Receive replydwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL);// Calculate elapsed timedwElapsed = GetTickCount() - dwTimeSent;printf("\nReply from: %s: bytes=%d time=%ldms TTL=%d", inet_ntoa(saSrc.sin_addr),REQ_DATASIZE,dwElapsed,cTTL);}printf("\n");nRet = closesocket(rawSocket);if (nRet == SOCKET_ERROR)ReportError("closesocket()");}// SendEchoRequest()// Fill in echo request header// and send to destinationint SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr){static ECHOREQUEST echoReq;static nId = 1;static nSeq = 1;int nRet;// Fill in echo requestechoReq.icmpHdr.Type = ICMP_ECHOREQ;echoReq.icmpHdr.Code = 0;echoReq.icmpHdr.Checksum = 0;echoReq.icmpHdr.ID = nId++;echoReq.icmpHdr.Seq = nSeq++;// Fill in some data to sendfor (nRet = 0; nRet < REQ_DATASIZE; nRet++)echoReq.cData[nRet] = ' '+nRet;// Save tick count when sentechoReq.dwTime = GetTickCount();// Put data in packet and compute checksumechoReq.icmpHdr.Checksum = in_cksum((u_short *)&echoReq,sizeof(ECHOREQUEST));// Send the echo requestnRet = sendto(s, /* socket */(LPSTR)&echoReq, /* buffer */sizeof(ECHOREQUEST),0, /* flags */(LPSOCKADDR)lpstToAddr, /* destination */sizeof(SOCKADDR_IN)); /* address length */ if (nRet == SOCKET_ERROR)ReportError("sendto()");return (nRet);}// RecvEchoReply()// Receive incoming data// and parse out fieldsDWORD RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL) {ECHOREPLY echoReply;int nRet;int nAddrLen = sizeof(struct sockaddr_in);// Receive the echo replynRet = recvfrom(s, // socket(LPSTR)&echoReply, // buffersizeof(ECHOREPLY), // size of buffer0, // flags(LPSOCKADDR)lpsaFrom, // From address&nAddrLen); // pointer to address len // Check return valueif (nRet == SOCKET_ERROR)ReportError("recvfrom()");// return time sent and IP TTL*pTTL = echoReply.ipHdr.TTL;return(echoReply.echoRequest.dwTime);}// What happened?void ReportError(LPCSTR pWhere){fprintf(stderr,"\n%s error: %d\n",WSAGetLastError());}// WaitForEchoReply()// Use select() to determine when// data is waiting to be readint WaitForEchoReply(SOCKET s){struct timeval Timeout;fd_set readfds;readfds.fd_count = 1;readfds.fd_array[0] = s;_sec = 5;_usec = 0;return(select(1, &readfds, NULL, NULL, &Timeout));}//// Mike Muuss' in_cksum() function// and his comments from the original// ping program//// * Author -// * Mike Muuss// * U. S. Army Ballistic Research Laboratory// * December, 1983/** I N _ C K S U M** Checksum routine for Internet Protocol family headers (C Version) **/u_short in_cksum(u_short *addr, int len){register int nleft = len;register u_short *w = addr;register u_short answer;register int sum = 0;/** Our algorithm is simple, using a 32 bit accumulator (sum),* we add sequential 16 bit words to it, and at the end, fold* back all the carry bits from the top 16 bits into the lower* 16 bits.*/while( nleft > 1 ) {sum += *w++;nleft -= 2;}/* mop up an odd byte, if necessary */if( nleft == 1 ) {u_short u = 0;*(u_char *)(&u) = *(u_char *)w ;sum += u;}/** add back carry outs from top 16 bits to low 16 bits*/sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ sum += (sum >> 16); /* add carry */answer = ~sum; /* truncate to 16 bits */return (answer);}实验结果如图6-1所示。
[计算机]ping实验报告
![[计算机]ping实验报告](https://img.taocdn.com/s3/m/4cc39e9f7e21af45b207a879.png)
学生__
学 号:
一、实验室名称:3302
二、实验项目名称:基于 ICMP 协议的 ping 程序
三、实验原理:
ping 程序使用 ICMP 协议实现。首先 Ping 向目标发送一个 ICMP 响应-请求(type=8),当目标主机 得到请求后,返回 ICMP 响应-应答,根据返回信息的不同判断目标主机是否存在。
七、实验结论:
.
八、总结与心得体会:
九、对本实验过程与字:
.
主机 A
向 192.168.3.1 发送响 应-请求包
主机存在
接收到应答 向发送响应-请求包
主机不存在
超时
主机 实际存在
主机 实际不存在
.
四、实验目的:
1)理解 ICMP 协议 2)了解 IP 协议 3)了解 ping 程序的功能
4)
五、实验内容:
六、实验器材(设备、元器件):
PC 机、可利用的程序运行网络环境(可自己搭建,也可直接连接 internet)。
常见网络命令的使用实验报告

常见网络命令的使用实验报告一、实验目的了解和掌握常见网络命令的功能和使用方法,能够运用这些命令进行网络配置、故障排查和性能监测,提高对网络的管理和维护能力。
二、实验环境操作系统:Windows 10网络环境:连接到本地局域网和互联网三、实验内容及步骤(一)Ping 命令1、功能Ping 命令用于测试网络连接的可达性,通过向目标主机发送 ICMP (Internet Control Message Protocol,网际控制报文协议)回显请求数据包,并接收回显应答数据包来判断目标主机是否可达,以及网络延迟情况。
2、使用方法在命令提示符中输入“ping 目标主机的 IP 地址或域名”,例如“ping ”。
3、实验结果及分析执行 Ping 命令后,会显示一系列的统计信息,包括发送的数据包数量、接收的数据包数量、丢失的数据包数量以及往返时间的平均值、最小值和最大值。
如果所有数据包都成功接收,且往返时间较短,说明网络连接良好;如果有数据包丢失或往返时间较长,则可能存在网络延迟或丢包问题。
(二)Tracert 命令1、功能Tracert 命令用于跟踪数据包从本地主机到目标主机所经过的路径,并显示每个中间节点的 IP 地址和往返时间。
2、使用方法在命令提示符中输入“tracert 目标主机的 IP 地址或域名”,例如“tracert ”。
3、实验结果及分析执行 Tracert 命令后,会逐行显示数据包经过的每个路由器的 IP 地址和往返时间。
通过分析这些信息,可以确定网络中的故障点或延迟较大的节点,有助于排查网络连接问题。
(三)Ipconfig 命令1、功能Ipconfig 命令用于显示本地网络连接的配置信息,包括 IP 地址、子网掩码、默认网关等。
2、使用方法在命令提示符中输入“ipconfig”可显示基本信息,输入“ipconfig /all”可显示更详细的信息。
3、实验结果及分析通过查看 Ipconfig 命令的输出结果,可以了解本地网络连接的配置情况。
计算机网络实验PING命令的使用

计算机网络实验PING命令的使用PING命令是一个常用的网络工具,用于测试主机之间的连通性和测量网络延迟。
在计算机网络实验中,我们可以使用PING命令来检查网络中的主机是否可达,并评估网络的性能和稳定性。
下面将详细介绍PING 命令的使用。
一、PING命令的基本介绍1.PING的概念和作用PING(Packet InterNet Groper)是一个常用的网络工具,用于检测主机和主机之间是否可达,以及计算网络延迟。
PING命令发送一个探测封包到目标主机,并等待接收到目标主机发送的回应。
2.PING命令的原理PING命令利用了Internet控制报文协议(ICMP)来发送探测封包和接收回应。
当目标主机收到PING封包时,它会发送一个回应封包作为响应。
PING命令通过计算探测封包发送和接收之间的时间差来得到网络延迟。
3.PING命令的格式PING命令的基本格式如下:```ping [参数] 目标主机```其中,参数可以用来控制PING命令的行为,目标主机可以是主机名或IP地址。
二、PING命令的常用参数1.-t(持续发送PING请求)使用-t参数可以让PING命令持续发送PING请求,直到手动停止。
这对于测试网络的稳定性和延迟非常有用。
2.-n(指定要发送的PING请求数量)使用-n参数可以指定要发送的PING请求数量。
默认情况下,PING命令会发送4个请求。
通过增加或减少这个数量,可以更好地评估网络的性能。
3.-l(设置PING请求的数据包大小)使用-l参数可以设置PING请求的数据包大小。
默认情况下,PING命令会发送32字节的数据包。
通过修改数据包大小,可以测试网络的带宽和吞吐量。
4.-w(设置等待PING请求的超时时间)使用-w参数可以设置等待PING请求的超时时间。
默认情况下,PING 命令会等待4秒钟。
通过修改超时时间,可以评估网络的稳定性和响应速度。
三、PING命令的使用示例下面是一些使用PING命令的示例场景。
个人总结-ICMP的协议详解以及实现

个人总结-ICMP的协议详解以及实现ping 的实现:1.首先查本地arp cache信息,看是否有对方的mac地址和IP地址映射条目记录2.如果没有,则发起一个arp请求广播包,等待对方告知具体的mac地址3.收到arp响应包之后,获得某个IP对应的具体mac地址,有了物理地址之后才可以开始通信了,同时对ip-mac地址做一个本地cache4.发出icmp echo request包,收到icmp echo reply包ICMP在网络层协议,不是用端口来说的,它的功能用类型来区别。
ICMP全称Internet Control Message Protocol(网际控制信息协议)。
在网络体系结构的各层次中,都需要控制,而不同的层次有不同的分工和控制内容。
IP层的控制功能是最复杂的,主要负责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的。
在基于IP数据报的网络体系中,网关必须自己处理数据报的传输工作,而IP协议自身没有内在机制来获取差错信息并处理。
为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错误时,立即向信源主机发送ICMP报文,报告出错信息。
让信源主机采取相应处理措施,它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。
二、ICMP报文格式ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文(见图表,ICMP报文的结构和几种常见的ICMP报文格式),IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。
RFC定义了13种ICMP报文格式,具体如下:类型代码类型描述0 响应应答(ECHO-REPLY) 3 不可到达 4 源抑制 5 重定向 8 响应请求(ECHO-REQUEST)11 超时 12 参数失灵 13 时间戳请求 14 时间戳应答 15 信息请求(*已作废) 16 信息应答(*已作废)17 地址掩码请求 18 地址掩码应答其中代码为15、16的信息报文已经作废。
网络实验指导----ICMP协议的分析与实现
实验: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 30 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=4IHL Internet头长Type of Service = 0Total Length IP包的总长度Identification, Flags, Fragment Offset 用于IP包分段Time to Live IP包的存活时长Protocol ICMP = 1Header Checksum 头校验和(检查整个IP报头)Addresses 发送Echo消息的源地址是发送Echo reply消息的目的地址,相反,发送Echo消息的目的地址是发送Echo reply消息的源地址.Echo 或 Echo Reply 消息格式如下:0 1 2 30 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 |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Typeecho消息的类型为8echo reply 的消息类型为0.Code=0Checksum为从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位服务类型TOSunsigned short total_len; //16位IP包总长度(字节)unsigned short ident; //1 6位标识, 用于辅助IP包的拆装,本实验不用,置零unsigned short frag_and_flags; //3位标志位+13位偏移位, 也是用于IP包的拆装,本实验不用,置零unsigned char ttl; //8位IP包生存时间TTLunsigned char proto; //8位协议(TCP, UDP 或其他), 本实验置ICMP,置为1unsigned short checksum; //16位IP首部校验和,最初置零,等所有包头都填写正确后,计算并替换.unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;(2)ICMP报头格式//定义ICMP首部typedef struct _icmphdr{unsigned char i_type; //8位类型, 本实验用8: ECHO 0:ECHO REPL Yunsigned char i_code; //8位代码, 本实验置零unsigned short i_cksum; //16位校验和, 从TYPE开始,直到最后一位用户数据,如果为字节数为奇数则补充一位unsigned short i_id ; //识别号(一般用进程号作为识别号), 用于匹配ECHO和ECHOREPL Y包unsigned short i_seq ; //报文序列号, 用于标记ECHO报文顺序unsigned int timestamp; //时间戳}ICMP_HEADER;3总体设计ICMP协议中的发送、接收ICMP回送请求报文,回送应答报文流程图。
PING实验报告
沈阳工程学院学生实验报告实验室名称:信息工程系软件实验室实验课程名称:计算机网络实验项目名称:icmp协议应用——ping解析班级:姓名:学号:实验日期:2012年04月28日实验台编号:23 指导教师:批阅教师(签字):成绩:篇二:网络编程实验_ping实验报告网络编程-ping程序设计实验指导书一.实验目的(1)熟悉原始套接字编程。
(2)了解网络的结构。
(3)了解网络传输底层协议。
二.实验要求ping程序是用于测试网络连通性的程序。
要求在windows环境下实现基本的ping程序功能.在命令提示符下输入:ping ***.***.***.*** 其中***为目的主机的ip地址,不要求支持域名,对是否带有开关变量也不做要求。
不带开关变量时,要求返回4次响应。
返回信息的格式:reply from ***.***.***.*** 或request timeout (无法ping通的情况)三.实验原理1、ping的工作原理ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。
ping 使用的是icmp协议,它发送icmp回送请求消息给目的主机。
icmp协议规定:目的主机必须返回icmp回送应答消息给源主机。
如果源主机在一定时间内收到应答,则认为主机可达。
icmp协议通过ip协议发送的,ip协议是一种无连接的,不可靠的数据包协议。
因此,保证数据送达的工作应该由其他的模块来完成。
其中一个重要的模块就是icmp(网络控制报文)协议。
当传送ip数据包发生错误--比如主机不可达,路由不可达等等,icmp协议将会把错误信息封包,然后传送回给主机。
给主机一个处理错误的机会,这也就是为什么说建立在ip层以上的协议是可能做到安全的原因。
icmp数据包由8bit的错误类型和8bit的代码和16bit的校验和组成。
而前 16bit就组成了icmp所要传递的信息。
ping利用icmp协议包来侦测另一个主机是否可达。
ICMP实验报告
实验报告月 20日04 月20 日2013 年实验日期: 2013年 04学号:姓名:实验名称:ICMP 总分:一、实验概述1.了解ICMP协议下数据包相关格式和内容;和tracert两种指令功能。
2.了解pingping 和二、实验条件①联网的电脑;②Ethereal软件;③winpcap 4.0.三、实验内容ping指令操作ljj为笔者姓名拼音缩写,检测通道是否导通。
通过输入指令pingping,检测通道是否导通。
抓包Ethereal抓包1. What is the IP address of your host? What is the IP address of the destination host?2. Why is it that an ICMP packet does not have source and destination port numbers?答:因为ICMP数据包在网络层封装在IP数据包中,因此不需要destination和source3. Examine one of the ping request packets sent by your host. What are the ICMP type and code numbers? What other fields does this ICMP packet have? How many bytes are the checksum, sequence number and identifier fields?在其他的地方没有ICMP数据包因为它没有分组4. Examine the corresponding ping reply packet. What are the ICMP type and Code numbers? What other fields does this ICMP packet have? How many bytes are the checksum, sequence number and identifier fields?在其他的地方没有ICMP数据包因为它没有分组tracer指令操作指令操作抓包Ethereal抓包5. What is the IP address of your host? What is the IP address of the target destination host?6. If ICMP sent UDP packets instead (as in Unix/Linux), would the IP protocol number still be 01 for the probe packets? If not, what would it be?不是ICMPICMP((1)number 不是所以它的protocol number01,因为它的上层协议答:不是01,因为它的上层协议UDP,UDP,所以它的7. Examine the ICMP echo packet in your screenshot. Is this different from the ICMP ping query packets in the first half of this lab? If yes, how so?指令Ping指令指令Tracer指令不同可以看出二者的checksum,sequence number,data不同8. Examine the ICMP error packet in your screenshot. It has more fields than the ICMP echo packet. What is included in those fields?error packetecoh packet可以看出,可以看出,error packet error packet 比echo packet 多出了Internet protocol,src:Internet protocol,src:…,…,dst dst:…部分:…部分:…部分9. Examine the last three ICMP packets received by the source host. How are thes packets different from the ICMP error packets? Why are they different?10. Within the tracert measurements, is there a link whose delay is significantly longer than others? Refer to the screenshot in Figure 4, is there a link whose delay is significantly longer than others? On the basis of the router names, can you guess the location o f of the two routers on the end of this link? 答:答:tracert tracert 指令操作,得出时延差距很大的结论,且不能猜出两条线路在末端的连接位置。
实验三(ICMPPing协议)
实验三一、实验名称:ICMP协议Ping程序实现二、实验目的学习ICMP协议原理, 并掌握在其协议上进行Ping程序开发的方法.三、实验要求查找资料, 写出Ping程序原理并编写程序, 写出主要使用到的API函数. 四、实验内容Ping原理:ping的原理就是首先建立通道,然后发送包,对方接受后返回信息,这个包至少包括以下内容,发送的时候,包的内容包括对方的ip地址和自己的地址,还有序列数,回送的时候包括双方地址,还有时间等,主要是接受方在都是在操作系统内核里做好的,时刻在监听,提供一段c程序的代码,希望对大家有用。
向远程计算机通过ICMP协议发送特定的数据包,然后等待回应并接收返回的数据包,对每个接收的数据包均根据传输的消息进行验证。
默认情况下,传输四个包含 32 字节数据(由字母组成的一个循环大写字母序列)的回显数据包。
过程如下:(1)通过将 ICMP 回显数据包发送到计算机并侦听回显回复数据包来验证与一台或多台远程计算机的连接。
(2)每个发送的数据包最多等待一秒。
(3)打印已传输和接收的数据包数。
主要API函数:#include "stdafx.h"#include "ping.h"#include "pingDlg.h"#include <winsock.h>#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifextern SOCKET m_socket;BOOL ping(const char *ipaddr, char *resp);class CAboutDlg : public CDialog{public:CAboutDlg();enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()CPingDlg::CPingDlg(CWnd* pParent /*=NULL*/): CDialog(CPingDlg::IDD, pParent){m_Ctx = _T("");m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CPingDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Control(pDX, IDC_IPADDRESS1, m_IP);DDX_Text(pDX, IDC_EDIT1, m_Ctx);DDX_Text(pDX, IDC_EDIT_NUM, m_Num);}BEGIN_MESSAGE_MAP(CPingDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_OK, OnOk)ON_BN_CLICKED(IDC_START, OnStart)END_MESSAGE_MAP()BOOL CPingDlg::OnInitDialog(){CDialog::OnInitDialog();SetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small iconm_IP.SetWindowText("");int res;int timeout = 100;WSADATA wsaData;if(WSAStartup( MAKEWORD( 1, 0 ), &wsaData ) != 0){MessageBox("Window Socket 初始化失败!");return FALSE;}//创建SOCKET// AF_INET:协议族为TCP/IP//SOCK_RAW:原始方式(直接与IP层交换数据)//IPPROTO_ICMP:子协议类型m_socket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if(m_socket == INV ALID_SOCKET){MessageBox("创建Socket 失败!");return FALSE;}// 设置选项:接受超时为100msres = setsockopt(m_socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));if(res == SOCKET_ERROR){MessageBox("设置接受超时为100ms 失败!");}timeout = 1000;// 设置发送超时为1000msres = setsockopt(m_socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));if(res == SOCKET_ERROR){MessageBox("设置发送超时为100ms 失败!");}return TRUE; // return TRUE unless you set the focus to a control}void CPingDlg::OnOK(){}void CPingDlg::OnCancel(){}void CPingDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机网络实验上机指导书专业班级学号姓名沈阳工程学院信息工程系实验2ICMP协议实践--ping解析一.实验目的掌握ICMP原理,利用其实现网络主机状态测试。
二.实验内容利用ICMP协议原理编程实现PING命令,测试目标主机是否可到达。
并了解Ping实现原理。
三.实验前的准备了解ICMP原理及相关概念。
掌握相关软件编程知识。
四.实验要求及实验软硬件环境【基本要求】设计程序完成PING命令。
完成此项实验,完成实验报告。
【实验组织方式】个人实验【实验条件】局域网环境下微机两台,编程软件。
五.实验步骤六..了解ICMP原理以及网络编程(1)源程序:WindowsPing PingPingPingPingPingS. Army Ballistic Research Laboratory*/while( nleft > 1 ) {sum += *w++;nleft -= 2;}/* mop up an odd byte, if necessary */if( nleft == 1 ) {u_short u = 0;*(u_char *)(&u) = *(u_char *)w ;sum += u;}/** add back carry outs from top 16 bits to low 16 bits*/sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ sum += (sum >> 16); /* add carry */answer = ~sum; /* truncate to 16 bits */return (answer);}实验结果如图6-1所示。
图6-1 ping程序运行结果(2)LINUX/*简单的ping程序*/#include <>#include <>#include <arpa/>#include <sys/>#include <sys/>#include <>#include <netinet/>#include <netinet/>#include <netinet/>#include <>#include <>#include <>#define PACKET_SIZE 4096#define MAX_WAIT_TIME 5#define MAX_NO_PACKETS 3char sendpacket[PACKET_SIZE];char recvpacket[PACKET_SIZE];int sockfd,datalen=56;int nsend=0,nreceived=0;struct sockaddr_in dest_addr;pid_t pid;struct sockaddr_in from;struct timeval tvrecv;void statistics(int signo);unsigned short cal_chksum(unsigned short *addr,int len);int pack(int pack_no);void send_packet(void);void recv_packet(void);int unpack(char *buf,int len);void tv_sub(struct timeval *out,struct timeval *in);void statistics(int signo){ printf("\n--------------------PING statistics-------------------\n");printf("%d packets transmitted, %d received , %%%d lost\n",nsend,nreceived,(nsend-nreceived)/nsend*100);close(sockfd);exit(1);}/*校验和算法*/unsigned short cal_chksum(unsigned short *addr,int len){ int nleft=len;int sum=0;unsigned short *w=addr;unsigned short answer=0;/*把ICMP报头二进制数据以2字节为单位累加起来*/while(nleft>1){ sum+=*w++;nleft-=2;}/*若ICMP报头为奇数个字节,会剩下最后一字节。
把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/if( nleft==1){ *(unsigned char *)(&answer)=*(unsigned char *)w;sum+=answer;}sum=(sum>>16)+(sum&0xffff);sum+=(sum>>16);answer=~sum;return answer;}/*设置ICMP报头*/int pack(int pack_no){ int i,packsize;struct icmp *icmp;struct timeval *tval;icmp=(struct icmp*)sendpacket;icmp->icmp_type=ICMP_ECHO;icmp->icmp_code=0;icmp->icmp_cksum=0;icmp->icmp_seq=pack_no;icmp->icmp_id=pid;packsize=8+datalen;tval= (struct timeval *)icmp->icmp_data;gettimeofday(tval,NULL); /*记录发送时间*/icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/return packsize;}/*发送三个ICMP报文*/void send_packet(){ int packetsize;while( nsend<MAX_NO_PACKETS){ nsend++;packetsize=pack(nsend); /*设置ICMP报头*/if( sendto(sockfd,sendpacket,packetsize,0,(struct sockaddr *)&dest_addr,sizeof(dest_addr) )<0 ) { perror("sendto error");continue;}sleep(1); /*每隔一秒发送一个ICMP报文*/}}/*接收所有ICMP报文*/void recv_packet(){ int n,fromlen;extern int errno;signal(SIGALRM,statistics);fromlen=sizeof(from);while( nreceived<nsend){ alarm(MAX_WAIT_TIME);if( (n=recvfrom(sockfd,recvpacket,sizeof(recvpacket),0,(struct sockaddr *)&from,&fromlen)) <0){ if(errno==EINTR)continue;perror("recvfrom error");continue;}gettimeofday(&tvrecv,NULL); /*记录接收时间*/if(unpack(recvpacket,n)==-1)continue;nreceived++;}}/*剥去ICMP报头*/int unpack(char *buf,int len){ int i,iphdrlen;struct ip *ip;struct icmp *icmp;struct timeval *tvsend;double rtt;ip=(struct ip *)buf;iphdrlen=ip->ip_hl<<2; /*求ip报头长度,即ip报头的长度标志乘4*/ icmp=(struct icmp *)(buf+iphdrlen); /*越过ip报头,指向ICMP报头*/ len-=iphdrlen; /*ICMP报头及ICMP数据报的总长度*/if( len<8) /*小于ICMP报头长度则不合理*/{ printf("ICMP packets\'s length is less than 8\n");return -1;}/*确保所接收的是我所发的的ICMP的回应*/if( (icmp->icmp_type==ICMP_ECHOREPLY) && (icmp->icmp_id==pid) ){ tvsend=(struct timeval *)icmp->icmp_data;tv_sub(&tvrecv,tvsend); /*接收和发送的时间差*/rtt=*1000+1000; /*以毫秒为单位计算rtt*//*显示相关信息*/printf("%d byte from %s: icmp_seq=%u ttl=%d rtt=%.3f ms\n", len,inet_ntoa,icmp->icmp_seq,ip->ip_ttl,rtt);}else return -1;}main(int argc,char *argv[]){ struct hostent *host;struct protoent *protocol;unsigned long inaddr=0l;int waittime=MAX_WAIT_TIME;int size=50*1024;if(argc<2){ printf("usage:%s hostname/IP address\n",argv[0]);exit(1);}if( (protocol=getprotobyname("icmp") )==NULL){ perror("getprotobyname");exit(1);}/*生成使用ICMP的原始套接字,这种套接字只有root才能生成*/if( (sockfd=socket(AF_INET,SOCK_RAW,protocol->p_proto) )<0){ perror("socket error");exit(1);}/* 回收root权限,设置当前用户权限*/setuid(getuid());/*扩大套接字接收缓冲区到50K这样做主要为了减小接收缓冲区溢出的的可能性,若无意中ping一个广播地址或多播地址,将会引来大量应答*/ setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size) );bzero(&dest_addr,sizeof(dest_addr));=AF_INET;/*判断是主机名还是ip地址*/if( inaddr=inet_addr(argv[1])==INADDR_NONE){ if((host=gethostbyname(argv[1]) )==NULL) /*是主机名*/{ perror("gethostbyname error");exit(1);}memcpy( (char *)&,host->h_addr,host->h_length);}else /*是ip地址*/memcpy( (char *)&dest_addr,(char *)&inaddr,host->h_length); /*获取main的进程id,用于设置ICMP的标志符*/pid=getpid();printf("PING %s(%s): %d bytes data in ICMP packets.\n",argv[1],inet_ntoa,datalen);send_packet(); /*发送所有ICMP报文*/recv_packet(); /*接收所有ICMP报文*/statistics(SIGALRM); /*进行统计*/return 0;}/*两个timeval结构相减*/void tv_sub(struct timeval *out,struct timeval *in){ if( (out->tv_usec-=in->tv_usec)<0){ --out->tv_sec;out->tv_usec+=1000000;}out->tv_sec-=in->tv_sec;}/*------------- The End -----------*/运行结果如图6-2所示。