ping实现

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. 具体代码见附件

  https://download.csdn.net/download/qy532846454/2181075

5. 最终效果如下

  

 

文章知识点与官方知识档案匹配,可进一步学习相关知识

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值