一种基于icmp协议的网络连通性能判断方法
技术领域
1.本发明属于计算机控制技术领域,涉及一种基于icmp协议的网络连通性能判断方法。
背景技术:2.icmp是以太网控制消息协议报文,他是tcp/ip协议族的一个子协议。用在ip主机、路由器之间传递网络连通性、主机可到达性、路由可用性等这些控制消息。控制消息并不传输用户数据,但是对于用户数据传递起着重要作用。
3.以太网通信方式属于工业中常用总线通讯方式,在系统硬件部署初始阶段,通常需要使用测试程序测量网络的连通性能,网络的连通性能包括网络的通断以及对于接通网络的延迟。传统上测量网络连通性能的方法采用两种方式,第一种方法是系统中具有人机交互操作系统的设备,需要启动系统后通过图形化界面人工进行ping操作,ping操作可以在人机界面上显示出网络是否接通以及接通后的网络延迟时间,但是这种测试方法通常需要搭建测试环境,接入显示设备与输入设备。第二种方法对于不具有人机交互的操作系统,通常开发一个套接字程序并通过套接字发送一包udp报文,进行报文回环操作,在报文发送和接收时刻分别记录时间,来测试网络的连通与延迟时间这种测试方法在传输层进行测试,并不具有网络测试的普适性。
技术实现要素:4.(一)发明目的
5.本发明的目的是:提供一种基于icmp协议的网络连通性能判断方法,能够实现测试简单,具有网络测试的普适性。
6.(二)技术方案
7.为了解决上述技术问题,本发明提供一种基于icmp协议的网络连通性能判断方法,过程如下:
8.设计一个icmp报文结构体,结构体中包括
①
icmp报文消息类型icmp_type。
②
cmp报文消息代码icmp_code。
③
icmp报文校验和icmp_checksum。
④
icmp报文请求id号icmp_id。
⑤
icmp报文序列号icmp_sequence,定义源节点地址以及端口号,目的节点地址以及端口号。
9.定义需要使用的套接字变量以及超时变量,定义32个字节的字符数组,定义icmp数据缓冲区databuf,长度为s1中结构体的长度加上32的值。
10.使用系统套接字创建函数socket()创建一个套接字。协议类型设置为icmp报文类型,使用系统套接字设置函数setsockopt()设置网络数据接收超时时间,时间为ntimeout
11.设置icmp报文发送的目的信息。定义套接字地址类型变量。设置协议族成员为地址族。将ip地址成员设置为目标地址。将端口号设置为目标端口号。定义套接字地址类型变量以及长度变量。
12.定义一个icmp协议包头指针picmp,对该指针所指的各个成员进行赋值
①
消息类型icmp_type
②
消息代码icmp_code
③
校验和icmp_checksum
④
序列号icmp_sequence。将当前时间值存储在truedata数组中。将数组中的值拷贝到icmp报文缓冲区中国,并计算校验和赋值到picmp中的校验和成员icmp_checksum。
13.使用sendto函数发送icmp数据。套接字口的描述字设置为s。待发送数据缓冲区databuf。icmp报文发送出去后,启动定时器,设置为cnt,定时器每启动一次进行减一操作,转到s7
14.在while中循环等待接收icmp消息,使用网络数据阻塞接收函数recv()接收数据,套接字口的描述字设置为s,接收到的数据指针为recvpacket(数组名表示该数据的指针),接收数据最大长度为recv_size,将返回值赋值到recvbytes。当接收到icmp报文数据时转到s8
15.对接收到的icmp报文进行解析,判断icmp报文中icmp_type是否为icmp_echoreply,同时判断icmp中icmp_id的值和使用系统函数getpid()获取到的id值是否相同。并将该地址强制转化为指针实时时间类型(structtimeval)并计算报文发送的时间t1。使用系统时间获取函数gettimeofday()计算当前时间t2。根据发送时间和接收时间差计算网络延迟时间,此时提示网络连通,网络连通时间为t2
‑
t1。
16.(三)有益效果
17.上述技术方案所提供的基于icmp协议的网络连通性能判断方法,通过构建icmp报文,将网络联通检测程序加载到,检测网络连通状况,可以进行网络连通性的自动化测试。
附图说明
18.图1为本发明基于icmp协议的网络连通判断方法流程图。
具体实施方式
19.为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
20.参照图1所示,本实施例基于icmp协议的网络连通判断方法包括以下步骤:
21.s1:设计一个icmp报文头结构体struct icmp_header
22.结构体中包括:
①
icmp报文消息类型icmp_type,此类型设置为无符号字符型;
②
icmp报文消息代码icmp_code,类型为无符号字符型;
③
icmp报文校验和icmp_checksum,类型为无符号短整形;
④
icmp报文请求id号icmp_id,类型为无符号短整形;
⑤
icmp报文序列号icmp_sequence,类型为无符号短整形。
23.定义相关的常量值:
①
使用宏定义设置目的节点ip地址destip的值,本实例中此值设置为192.168.0.200;
②
使用宏定义设置源节点ip地址srcip的值,本实例中此值设置为192.168.0.11;
③
使用宏定义设置目的节点端口号destport,本实例中此值设置为0x8080;
④
使用宏定义设置源节点端口号srcport,本实例中使用0x8085。使用宏定义设置icmp_header_size的值,此值使用c语言运算符sizeof()进行计算,传入参数为icmp报文头结构体structicmp_header。
24.s2:定义使用的变量以及缓冲区。套接字(socket)类型变量s,定义变量ntimeout,
类型设置为整型,初始值设置为1000,表示超时时间为1s。定义一个数据字符数组truedata,类型设置为无符号字符型,长度为32个字节,使用random()函数生成随机数据填充数组truedata。设置icmp数据缓冲区databuf,类型设置为字符型。长度为icmp_header_size+32。定义数据接收缓冲区数组recvpacket,长度值为recv_size,设置为4096。定义变量recvbytes,类型设置为整形,初值赋值为0。
25.s3:建立网络连接套接字,使用网络套接字创建函数socket()创建一个套接字,协议类型设置为ipproto_icmp,表示所选协议为icmp报文,该函数的返回值赋值到s2中定义的变量s。使用系统套接字设置函数setsockopt()设置网络数据接收超时时间,时间为ntimeout。
26.s4:设置icmp报文发送的目的信息,定义套接字地址类型sockaddr_in的变量destaddr。将destaddr中协议族成员sin_family设置为地址族af_inet。将ip地址成员sin_addr设置为destip,这个值需要使用ip转化函数inet_addr()进行参数类型转换。将端口号sin_port设置为destport,该变量需要使用字节转换函数htons()进行本地字节序到网络字节序的转换。定义套接字地址类型sockaddr_in变量srcaddr,该变量表示报文的源地址。定义变量nlen,表示长度值,该长度的初始值设置为sizeof(sockaddr_in)
27.s5:定义一个icmp协议包头指针picmp,对该指针所指的各个成员进行赋值
28.①
消息类型icmp_type值设置为icmp_echo_request,值为8,表示该报文为icmp包回应请求报文;
②
消息代码icmp_code设置为0;
③
校验和icmp_checksum初值设置为0;
④
序列号icmp_sequence初值设置为0,使用系统时间获取函数gettimeofday()获取当前值并存储在truedata数组中。
29.使用内存拷贝函数memcpy(),将以truedata为首地址,长度为32的数据拷贝到databuf+icmp_header_size所指的内存中。
30.使用校验和计算函数checksum()计算以databuf为首地址,长度为icmp_header_size+32的数据的校验和,将计算出的校验和值赋值到picmp中的校验和成员icmp_checksum。
31.s6:使用网络数据发送函数sendto发送icmp数据。套接字口的描述字设置为s。待发送数据缓冲区databuf,长度为icmp_header_size+32;调用方式标志位设置为0;目的套接口指针为destaddr的地址;长度为sockaddr_in结构的长度。icmp报文发送出去后,此时启动系统定时器,设置定时器计数周期为20ms,计数值定义为cnt,本实例中cnt值设置初始值为50),每触发一次定时器则cnt值进行减一操作,此时转到s7;
32.s7:在while中循环等待接收icmp消息,使用网络数据阻塞接收函数recv()接收数据,套接字口的描述字设置为s,接收到的数据指针为recvpacket,数组名表示该数据的指针;接收数据最大长度为recv_size,调用方式标志设置为0,目的套接口指针设置为destaddr的地址,地址信息结构体长度设置为sockaddr_in结构的长度,此长度计算方式为sizeof(sockaddr_in),将返回值赋值到recvbytes。当接收到icmp报文数据时转到s8,如果在此过程中一直没有收到icmp报文,并且计数器cnt值已经减为零,则直接提示网络不通。
33.s8:对接收到的icmp数据进行解析。解析函数的形参包括
①
数据指针变量pdata,类型设置为无符号指针型。
②
数据长度变量len,类型设置为整型。定义一个icmp报文头结构体struct icmp_header的变量icmp。定义变量iplength,类型为整型,初值赋值为0。定义
系统中ip结构体(structip)指针变量ip。将recvpacket赋值给pdata,将recvbytes赋值给len。将ip所指向的ip_hl(4位首部长度)左移两位后赋值给iplength。
34.将数据指针pdata向后偏移iplength长度,偏移后指针所指向的值为pdata+iplength,将偏移后的指针强制转化为struct icmp_header类型指针并赋值给变量icmp。
35.判断变量icmp中icmp_type是否为icmp_echoreply(值设置为8,表示icmp应答请求消息),同时判断icmp中icmp_id的值和使用系统函数getpid()获取到的id值是否相同。如果相同,则计算pdata+iplength+icmp_header_size的地址,并将该地址强制转化为指针实时时间类型(structtimeval)并计算报文发送的时间t1。使用系统时间获取函数gettimeofday()计算当前时间t2,。根据发送时间和接收时间差计算网络延迟时间t2
‑
t1,此时提示网络连通,网络连通的延时时间为t2
‑
t1。
36.以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。