ICMP是Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。我们在网络中经常会使用到ICMP协议,比如我们经常使用的用于检查网络通不通的Ping命令(Linux和Windows中均有)�
这个“Ping”的过程实际上就是ICMP协议工作的过程。Ping命令利用ICMP回射请求报文和回射应答报文来测试目标系统是否可达�
执行 ping 后,首先向目标服务器发出回送请求报文。计算机送出的回送请求到达目标服务器后,服务器回答这一请求,向送信方发送回送请求。这� ICMP 回送回答报文在 IP 层来看,与被送来的回送请求报文基本上一样。不同的只是,源和目� IP 地址字段被交换了,类型字段里填入了表示回送回答的 0�
这两点。也就是,从送信方来看,自己送出� ICMP 报文从目标服务器那里象鹦鹉学舌那样原样返回了�
void ping_count(uint8 s, uint16 pCount, uint8 *addr) { uint16 rlen, cnt,i; cnt = 0; for(i=0; i < pCount+1;i++) /*循环ping pCount�*/ { if(i!=0) { /* Output count number */ printf( "No.%d ",i); } switch(getSn_SR(s)) /*获取socket状�*/ { case SOCK_CLOSED: /*socket关闭状�*/ close(s); /* Create Socket */ IINCHIP_WRITE(Sn_PROTO(s), IPPROTO_ICMP); /*设置ICMP 协议*/ if(socket(s,Sn_MR_IPRAW,3000,0)!=0) /*判断ip raw模式socket是否开�*/ { } /* Check socket register */ while(getSn_SR(s)!=SOCK_IPRAW); break; case SOCK_IPRAW: /*ip raw模式*/ ping_request(s, addr); /*发送Ping请求*/ req++; while(1) { if ( (rlen = getSn_RX_RSR(s) ) > 0) { ping_reply(s, addr, rlen); /*获取回复信息*/ rep++; if (ping_reply_received) break; } if ( (cnt > 1000) ) { printf("Request Time out\r\n\r\n") ; cnt = 0; break; } else { cnt++; delay_ms(1000); } } break; default: break; } if(req>=pCount) { printf("Ping Request = %d, Ping Reply = %d, Lost = %d\r\n",req,rep,req-rep); } } }接下来介绍一下具体的测试过程,测试步骤如�
从打印信息可以看到,发送一次ping请求,之后得到一次ping回复,如果请求和回复的次数保持相同,则说明ping一直正常�