[转]ICMP协议之ping实现

原文链接http://blog.csdn.net/qy532846454/article/details/5429700

1. 相关ICMP协议概述
  这里只讲解与ping有关的ICMP消息类型,主机发送回送消息(Type = 8),被请求主机回送响应消息(Type = 0),基本格式如下:
  回送消息[ECHO]

    

   回送响应消息[ECHO REPLY]

    

   其中•Code = 0,
     •CheckSum为校验和,重点注意从ICMP的头部(即Type开始),到data结束(即到整个数据包结束),具体计算见下面分析
     •Identifier为标识符,由主机设定,一般设置为进程号,回送响应消息与回送消息中identifier保持一致
     •Sequence Number为序列号,由主机设定,一般设为由0递增的序列,回送响应消息与回送消息中Sequence Number保持   一致
     •data为数据,由主机设定,回送响应消息与回送消息中data保持一致

2. Ping流程
  Ping实际上利用的就是ICMP ECHO和ICMP ECHO REPLY包来探测主机是否存在,所以Ping程序的流程十分简单:发送ICMP    ECHO包---- > 接收ICMP ECHO REPLY包
  发送ICMP ECHO包时填充Identifier为进程ID, Sequence Number为从0递增计数,data填充为发送时间
  接收ICMP ECHO REPLY包时检查Identifier, Sequence Number是否正确,通过IP报头的源地址字段获得回送报文的主机地址是否正确

3. 模拟Ping实现pingy
  Ping的基本流程已讲解完

  由于要自己构造ICMP包,因此创建需要创建原始套接字(即需要自己填充报头):
         sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
  SOCK_RAW用于直接访问网络层,应用程序负责构造自己的协议首部;IPPROTO_ICMP表示ICMP报头由程序构造
  构造ICMP报头,注意各个字段的填充,特别是校验和(可以参照icmp的结构定义)
          icmp->icmp_type
          icmp->icmp_code
          icmp->icmp_cksum
          icmp->icmp_id
          icmp->icmp_seq
          icmp ->icmp_data;

  而完成系统的Ping命令还需添加信息统计,如发送字节数,收到字节数,发送包,接收包,发送时间,TTL等;另外,添加信号处理,在用户使用Control^C等退出时打印即时信息

4. 具体代码见附件

  http://download.csdn.net/source/2181075

5. 最终效果如下

  

时间: 2024-10-06 00:43:44

[转]ICMP协议之ping实现的相关文章

4.ICMP协议,ping和Traceroute

1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送回给主机.给主机一个处理错误的机会,这 也就是为什么说建立在IP层以上的协议是可能做到安全的原因.ICMP数据包由8bit的错误类型和8bit的代码和16bit的校验和组成.而前 16bit就组成了ICMP

TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute

转自:http://blog.csdn.net/goodboy1881/article/details/670761 ———————————————————————————————————————————————————————— 1.IMCP协议介绍 前面讲到了,IP协议并不是一个可靠的协议,它不保证数据被送达,那么,自然的,保证数据送达的工作应该由其他的模块来完成.其中一个重要的模块就是ICMP(网络控制报文)协议. 当传送IP数据包发生错误--比如主机不可达,路由不可达等等,ICMP协议将

【网络协议】ICMP协议、Ping、Traceroute

    ICMP协议 ICMP常常被觉得是IP层的一个组成部分,它是网络层的一个协议.它传递差错报文以及其它须要注意的信息.ICMP报文通常被IP层或更高层(TCP.UDP等)使用,它是在IP数据报内传输的. ICMP报文大致分为两类:查询报文和差错报文. 先来看差错报文.当传送IP数据报错误发生时(比方主机不可达.网络不可达等),ICMP协议将会发送一个ICMP差错报文给源主机,好让主机做出对应的处理,也因此IP层以上的一些协议有可能做到可靠传输. 书中给出了ICMP差错报文中的一些组合(类型

TCP/IP协议---ICMP协议及ping、traceroute

ICMP Internet控制报文协议通常被认为是IP层的组成部分,一般被IP层或更高层(TCP.UDP)使用.ICMP报文是在IP数据报内部被传输的.如图: ICMP报文的格式如下: 报文的前4个字节都一样: 8bit类型,8bit代码,16bit检验和.ICMP报文有不同的报文类型,不同类型由这个8bit的类型和8bit的代码共同决定.一个类型下可能有多个代码.比如: 类型0表示回显应答(ping应答):类型1表示目的不可达,其中代码0表示网络不可达,代码1表示主机不可达,代码2表示协议不可

利用ICMP协议的PING命令获取客户端当前网络质量 by徐文棋

无论在windows下,linux也好,unix也好,都可以通过 Ping命令获得当前设备的网络延迟,延迟是客户端到服务端的网络响应时间.通常延迟越低,反应速度越快 这里使用了SimplePing   同时对其使用方法进行封装. 导入头文件 PingHelper.h 调用代码: [PingHelper pingTo:@"127.0.0.1" withTimes:3 inBlock:^(NetworkQuality quality) { switch (quality) { case G

Ping命令与ICMP协议

ICMP协议 ICMP是"Internet Control Message Ptotocol"(Internet控制消息协议)的缩写.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息 ping命令 ping命令通常用来作为网络可用性的检查.ping命令可以对一个网络地址发送测试数据包,看该网络地址是否有响应并统计响应时间,以此测试网络. ping和ICMP的关系 ping命令发送数据使用的是ICMP协议. ping的原理 向指定的网络地址发送一定长度的数据包,

Linux服务器关闭/开启ICMP协议(ping)

经常会遇到一些问题就是主机明明是在线的却ping不通的,对方可能开启了禁ping模式有时为安全问题着想,需要给我们的Linux服务器禁ping 关闭ICMP协议(禁ping) echo "1">/proc/sys/net/ipv4/icmp_echo_ignore_all cat /proc/sys/net/ipv4/icmp_echo_ignore_all 打开ICMP协议(取消禁ping) echo "0">/proc/sys/net/ipv4/ic

《网络协议》ICMP 协议

ICMP 协议概述 ICMP 经常被认为是 IP 层的一个组成部分,它传递差错报文以及其他需要注意的信息.ICMP 报文通常被 IP 层或更高层协议(TCP 或 UDP)使用.ICMP 报文是在 IP 数据报内部传输的.IP 协议是不可靠协议,不能保证 IP 数据报能够成功的到达目的主机,无法进行差错控制,而 ICMP 协议能够协助 IP 协议完成这些功能.下面是 ICMP 报文的数据结构: 类型:一个 8 位类型字段,表示 ICMP 数据包类型: 代码:一个 8 位代码域,表示指定类型中的一个

PING的原理以及ICMP协议

主要内容: 1.ping的原理以及工作过程 2.ICMP协议 3.ICMP的应用:ping,traceroute 1.ping的原理以及工作过程  ping的原理  ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接. ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机.ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机.如果源主机在一定时间内收到应答,则认为主机可达. ICMP协议通过IP协议发送的,IP协议是