zoukankan      html  css  js  c++  java
  • [转]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. 最终效果如下

      

  • 相关阅读:
    为什么Go没有三元运算符
    [Win10]鼠标没用,插入USB口电脑提示USB Optical Mouse找不到驱动程序的解决方案
    Office2016软件安装教程
    office2019软件安装教程
    Go语言 科学计算库 Gonum 学习1
    AI Studio 学习 Go 豆瓣电影爬取
    Git下载、安装与环境配置
    VueJS 数组哪些方法是响应式的
    VueJS v-for
    VueJS v-show
  • 原文地址:https://www.cnblogs.com/lishuai0214/p/4270975.html
Copyright © 2011-2022 走看看