当前位置:文档之家› TCPIP协议ICMP协议分析与设计041440516董迎顺剖析

TCPIP协议ICMP协议分析与设计041440516董迎顺剖析

长春大学计算机学院网络工程专业

TCP/IP协议实验报告

备注:实验包括基本技能、进阶技能和创新技能,如果没有创新技能方案则最高分为90分,

实验名称:实验三ICMP协议分析与设计

班级:网络五班姓名:董迎顺学号:041440516

实验地点:机房日期:2015-11-25

一、实验目的:

1.掌握使用Ethereal工具对ICMP协议进行抓包分析的方法。

2.理解不同类型ICMP报文的具体意义。

3.通过实验,进一步了解ICMP协议。

二、基本技能实验内容、要求和环境:

【实验环境】

1.安装Windows2000/2003Server/XP操作系统的PC计算机一台。

2.每台PC具有一块以太网卡,通过双绞线与局域网相连。

3.每台PC运行网络协议分析软件Ethereal或Wireshark。

【实验内容】

1、分析ping程序使用的ICMP信息包

启动Ethereal协议分析工具,选择“Capture”→“Start”,开始数据包的抓取,接下来点击“开始”菜单,在运行中输入“cmd”,进入Windows系统的命令行模式,在命令行模式下输入“ping –n 10 目标IP地址”,ping结束后,停止Ethereal抓包程序,并在Ethereal中的“Filter”域中输入关键字“ICMP”,点击“Apply”按钮,将非ICMP数据包过滤掉。在中间窗口的“Internet Protocol”中可以看到,协议号为01,表明是一个ICMP格式的数据包。查看数据包内容窗口中的“Internet Control Message Protocol”,可以看到该ICMP数据包的协议类型为8(Type 8),代码为0(Code 0),表明是一个ICMP请求(Request)数据包。请注意其他字段“Identifier”,“Sequence number”和“Data”的内容。

分析查看这些ICMP协议数据包,回答以下问题:

(1)本机的IP地址是多少?目标主机的IP地址是多少?

(2)为什么ICMP协议数据包没有源端口号和目的端口号?

(3)查看本机发送的每个Request数据包,回答这些ICMP数据包的类型号(Type)和代码(Code)是多少?这些ICMP数据包中的其他字段有哪些?“Checksum”、“Sequence”和“Identifier”字段分别占多少字节?

(4)查看回复的Reply数据包,它们的类型号(Type)和代码(Code)是多少?这些ICMP数据包中还有其他哪些字段?“Checksum”、“Sequence”和“Identifier”字段分别占多少字节

2、分析traceroute程序使用的ICMP信息包

启动Ethereal协议分析工具,选择“Capture”→“Start”,开始抓取数据包。然后点击“开始”

菜单,在运行中输入“cmd”,进入Windows系统的命令行模式,在命令行模式下输入“tracert 某域名”,tracert命令结束后,停止Ethereal抓包程序,并在Ethereal中的“Filter”域中输入关键字“ICMP”,点击“Apply”按钮,将非ICMP数据包过滤掉。

分析查看这些ICMP协议数据包,回答以下问题:

(1)本机的IP地址是多少?目标主机的IP地址是多少?

(2)查看echo数据包,与ping所使用的ICMP包比较一下,看看是否相同,有什么区别?

【实验指导】

ICMP是Internet Control Message Protocol(Internet控制报文协议)的缩写,是TCP/IP协议族的一个子协议,用于在主机和路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由器是否可用等网络本身的消息。由于IP网络的不可靠并且不能保证信息传递,因此当发生问题时,通知发送者是很重要的。ICMP协议提供有关阻止数据包传递的网络故障问题反馈信息的机制,它让TCP等上层协议能够意识到数据包没有送达目的地,ICMP协议提供一种查出灾难性问题的方法。这些灾难性的问题包括“TTL Exceeded”(超过生存时间)和“需要分更多的数据段”等。ICMP协议不报告IP校验失败等常见的问题。这是因为假定TCP或者其他可靠的协议能够处理这类数据包损坏的问题。而且,如果使用UDP等不可靠的协议,我们就不应理会较小数量的数据损失。

反之,如果网络有问题则需要立即报告。例如,当IP的TTL值(IP生存时间)将达到零,这就可能是网络的某个部分发生了路由环路问题,这样将没有任何数据包能发送到目的地。端点系统需要了解这些类型的故障。ICMP是一种发送各种消息,用于报告网络状态的协议,而非仅仅是简单的ping(连通性测试程序)。回应请求(Echo Request)仅是ICMP协议提供的众多消息之一。Ping 信息可以被过滤掉。但是,大多数ICMP消息类型是IP、TCP和其他协议正常运行所需要的。

ICMP协议本身非常复杂。每一种类型的ICMP消息也称“主要类型(Major Type)”,它拥有自己的“子类型编码(Minor Codes)”。ICMP协议工作在第3层,因此,它能够在互联网上路由。一个ICMP数据包实际上就是一个IP数据部分包含ICMP协议数据的IP数据包。每一个ICMP

消息都将包含引发这条ICMP消息的数据包的完全IP包头,这样端点系统就会知道实际上哪一个数据包没有发送到目的地。

ICMP协议消息包含不会变化的3个字段,随后是ICMP数据,然后是引发此消息的源IP数据包包头。不会变化的3个字段中,第1个字段包含ICMP类型(主要类型)、第2个字段包含了类型代码、第3个字段是ICMP消息校验值。

ICMP协议在某些情况下不会发送错误信息。ICMP不会对ICMP信息做出响应。如果ICMP 回应其他ICMP消息,这些消息的数量会爆炸性增长而演变为一场ICMP消息风暴。为了防止出现广播风暴,ICMP消息也不会回应一个广播或者多播地址。

各种ICMP的报文格式如下:

目的不可达报文

类型:3代码:0至12检验和

未使用(全0)

收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节

?源端抑制报文

类型:4代码:0检验和

未使用(全0)

收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节?超时报文

类型:11代码:0或1检验和

未使用(全0)

收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节?参数问题

类型:12代码:0或1检验和

指针未使用(全0)

收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节?改变路由

类型:5代码:0到3检验和

目标路由器IP地址

收到的IP数据报的一部分,包括IP首部以及数据报数据的前8个字节?回送请求和回答

类型:8或0代码:0检验和

标识符序号

由请求报文发送;由回答报文重复

?时间戳请求和回答

类型:13或14代码:0检验和

标识符序号

原始时间戳

接收时间戳

发送时间戳

?地址掩码请求和回答

类型:17或18代码:0检验和

标识符序号

地址掩码

?路由询问和通告

类型:10代码:0检验和标识符序号

类型:9代码:0检验和地址数地址项目长度寿命

路由器地址1

优先级1

路由器地址2

优先级2

...

三、基本技能实验结果与分析:

1

(1)在cmd中输入ipconfig查看本机ip

目标主机ip通过ping命令看是否能ping通

(2)ICMP是:Internet 控制信息协议(ICMP)是IP 组的一个整合部分。通过IP 包传送的ICMP 信息主要用于涉及网络操作或错误操作的不可达信息。ICMP 包发送是不可靠的,所以主机不能依靠接收ICMP 包解决任何网络问题。ICMP不象TCP或UDP有端口,但它确实含有两个域:类型(type)和代码(code)。而且这些域的作用和端口也完全不同。Ping用到的是ICMP 协议。不是端口。

(3)在cmd中输入ping –n 10 192.168.31.197

在wireshark中抓取icmp数据包

随便找一个icmp的request包

分析一下

可以看见ICMP数据包的协议类型为8(Type 8),字节为1bit;代码为0(Code 0),字节为1bit;表明是一个ICMP请求(Request)数据包。“Identifier”为0x0001 ,字节为2bit。“Sequence number”为15(0x000f),字节为2bit;“Data”的为32bit的长度

(4)

查看回复的Reply数据包

可以看见type类型是8,字节为bit。Code为0;表明是一个ICMP reply数据包;identifier 为0x0001,字节为2bit ,Sequence number”为11(0x000b),字节为2bit;“Data”的为32bit 的长度。其他字段:checksum:0x5550;sequence number(le)

2

(1)在cmd中输入ipconfig 显示本机的ip地址是192.168.31.113

目标主机的IP地址是119.75.217.109(百度)

(2)在命令行模式下输入“tracert 某域名”,

在wieshark中抓icmp查看echo数据包

四、进阶技能的任务与要求

设计一个程序,实现类似ping命令的功能。

五、进阶技能的规划设计与步骤

#include

#include

#pragma comment(lib,"ws2_32.lib")

#include

//#include

//定义一个结构体,来表示ICMP报文的头。

typedef struct icmp_head

{

unsigned char icmp_type;//消息类型

unsigned char icmp_code;//代码

unsigned short icmp_checksum; //校验和

DWORD icmp_id; //请求id号,进程号

DWORD icmp_sequence; //序列号

DWORD icmp_timestamp; //时间戳

}ICMP_HEAD, *PICMP_HEAD;

//计算校验和的通用算法

unsigned short checksum(PICMP_HEAD picmp, int leng) {

long sum = 0;

unsigned short *pusIcmp = (unsigned short *)picmp;

while (leng > 1)

{

sum += *(pusIcmp++);

if (sum & 0x8000000)

{

sum = (sum & 0xffff) + (sum >> 16);

}

leng -= 2;

}

if (leng)

{

sum += *(unsigned char *)pusIcmp;

}

while (sum >> 16)

{

sum = (sum & 0xffff) + (sum >> 16);

}

return (unsigned short)~sum; //取反

}

int main(int argc, char **argv)

{

WSADATA wsaData;

SOCKET client; //原始套接字

SOCKADDR_IN destAddr;

struct hostent * host = NULL;

int nTimeOut = 1000;

char szSendBuffer[sizeof(ICMP_HEAD) + 32] = { 0 }; //定义ICMP报文的发送缓冲区

char szRecvBuffer[1024];

PICMP_HEAD picmp = (PICMP_HEAD)szSendBuffer;//PICMP指向发送缓冲区

if (argc < 2)

{

printf("请输入目标主机的名称或者ip地址:\r\n");

system("pause");

return 1;

}

//加载动态连接库

WSAStartup(MAKEWORD(2, 2), &wsaData);

//创建原始套接字

client = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

if (client == INVALID_SOCKET)

{

printf("SOCKET()失败!错误码:%d\n", WSAGetLastError());

system("pause");

}

//设置接收超时时间

setsockopt(client, SOL_SOCKET, SO_RCVTIMEO, (const char *)&nTimeOut, sizeof(nTimeOut));

//设置目标主机的地址

host = gethostbyname(argv[1]);

if (host == NULL)

{

printf("主机名解析失败!\n");

system("pause");

return 1;

}

destAddr.sin_family = AF_INET;

destAddr.sin_addr.S_un.S_addr = *((unsigned long *)host->h_addr);

destAddr.sin_port = htons(0);

//ICMP报文的封装

//ICMP_HEAD封装

picmp->icmp_type = 8;

picmp->icmp_code = 0;

picmp->icmp_checksum = 0;

picmp->icmp_id = GetCurrentProcessId();

//封装数据

memcpy((szSendBuffer + sizeof(ICMP_HEAD)), "AQWERTYUIOPPASDFGHJKLZXCVBNM", 32);

//计算校验和

picmp->icmp_checksum = checksum((PICMP_HEAD)szSendBuffer, sizeof(szSendBuffer));

//向目标主机发送ICMP报文并接受回射ICMP报文

struct sockaddr_in fromAddr;

int sizeFrom = sizeof(SOCKADDR_IN);

memset(szRecvBuffer, 0, 1023);

//向目标主机发送ICMP报文

int sendBytes = sendto(client, szSendBuffer, sizeof(szSendBuffer), 0, (SOCKADDR *)&destAddr,

sizeof(destAddr));

if (sendBytes == SOCKET_ERROR)

{

printf("发送错误:错误代码%d\n", WSAGetLastError());

system("pause");

return1;

}

else

{

printf("发送ICMP报文成功!发送的字节数:%d\n", sendBytes);

}

//从目标主机接收回射的ICMP报文

int reciveBytes = recvfrom(client, szRecvBuffer, sizeof(szRecvBuffer), 0, (SOCKADDR *)&fromAddr,

&sizeFrom);

if (reciveBytes == SOCKET_ERROR)

{

printf("接收错误:错误码%d\n", WSAGetLastError());

system("pause");

return 1;

}

else

{

printf("接收成功!收到的字节数:%d\n", reciveBytes);

PICMP_HEAD PTEMP = (PICMP_HEAD)szRecvBuffer + 20;//跳过报文的ip头部

DWORD t2 = GetTickCount();

int time = t2 - picmp->icmp_timestamp;//经过的时间

int datalen = reciveBytes - 20 - sizeof(ICMP_HEAD);//发送的字节数

if (strcmp(inet_ntoa(fromAddr.sin_addr), inet_ntoa(destAddr.sin_addr)) == 0)//保持地址一致

{

printf("来自%s的回复:字节=%d 时间=%d ms\n", inet_ntoa(destAddr.sin_addr), datalen, time);

}

}

system("pause");

return 0;

}

六、进阶技能实验结果与分析

该代码不完善,有bug,在调试的时候有时可以出结果,有时候不显示

七:思考题:

1.ICMP的用途是什么?

答:它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控

制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。

2.为什么要限制由失效的ICMP差错报文再产生一个ICMP报文?

答:限制失效报文为了减少网络流量,再产生一个报文一般是报告错误状态。

3.ping程序和tracert程序分别使用什么样的ICMP类型数据包?

答:tracert诊断实用程序通过向目的计算机发送具有不同生存时间的ICMP(Internet控制信息协议)回应报文,以确定至目的地的路由。也就是说,TRACERT命令可以用来跟踪一个报文从一台计算机到另一台计算机所走的路径。

Ping实际上利用的就是ICMP ECHO和ICMP ECHO REPLY包来探测主机是否存在,所以Ping程序的流程十分简单:发送ICMP ECHO包---- > 接收ICMP ECHO REPLY包

八、教师评语:

实验成绩:教师:(签名要全称)年月日

注:1. 此模板为专业实验报告的基本要求,若有特殊要求的实验,可在此模板基础上增加,但不可减少。

2. 实验报告必须在学生提交报告后一星期内批改。

另附创新技能方案及结果分析

说明:

①上下页边距改成2厘米,左边距为2.0厘米,右边距为1.5厘米。

②表格位置为居中

创新活动

发现网络中的活动主机

设计程序,其功能是发送ICMP数据包,以获取指定网段中的活动主机,并将结果显示出来。

相关主题
文本预览
相关文档 最新文档