ICMP是用来对网络状况进行反馈的协议,可以用来侦测网络状态或检测网路错误。

限于当前Golang在网络编程方面的代码稀缺,资料甚少,所以分享一个用Golang来构造ICMP数据包并发送ping程序的echo消息的实例。

RFC792定义的echo数据包结构:

  1. 0 1 2 3
  2. 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  3. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  4. | Type | Code | Checksum |
  5. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  6. | Identifier | Sequence Number |
  7. +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  8. | Data ...
  9. +-+-+-+-+-

代码:

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "net"
  7. )
  8. type ICMP struct {
  9. Type        uint8
  10. Code        uint8
  11. Checksum    uint16
  12. Identifier  uint16
  13. SequenceNum uint16
  14. }
  15. func CheckSum(data []byte) uint16 {
  16. var (
  17. sum    uint32
  18. length int = len(data)
  19. index  int
  20. )
  21. for length > 1 {
  22. sum += uint32(data[index])<<8 + uint32(data[index+1])
  23. index += 2
  24. length -= 2
  25. }
  26. if length > 0 {
  27. sum += uint32(data[index])
  28. }
  29. sum += (sum >> 16)
  30. return uint16(^sum)
  31. }
  32. func main() {
  33. var (
  34. icmp  ICMP
  35. laddr net.IPAddr = net.IPAddr{IP: net.ParseIP("192.168.137.111")}  //***IP地址改成你自己的网段***
  36. raddr net.IPAddr = net.IPAddr{IP: net.ParseIP("192.168.137.1")}
  37. )
  38. //如果你要使用网络层的其他协议还可以设置成 ip:ospf、ip:arp 等
  39. conn, err := net.DialIP("ip4:icmp", &laddr, &raddr)
  40. if err != nil {
  41. fmt.Println(err.Error())
  42. return
  43. }
  44. defer conn.Close()
  45. //开始填充数据包
  46. icmp.Type = 8 //8->echo message  0->reply message
  47. icmp.Code = 0
  48. icmp.Checksum = 0
  49. icmp.Identifier = 0
  50. icmp.SequenceNum = 0
  51. var (
  52. buffer bytes.Buffer
  53. )
  54. //先在buffer中写入icmp数据报求去校验和
  55. binary.Write(&buffer, binary.BigEndian, icmp)
  56. icmp.Checksum = CheckSum(buffer.Bytes())
  57. //然后清空buffer并把求完校验和的icmp数据报写入其中准备发送
  58. buffer.Reset()
  59. binary.Write(&buffer, binary.BigEndian, icmp)
  60. if _, err := conn.Write(buffer.Bytes()); err != nil {
  61. fmt.Println(err.Error())
  62. return
  63. }
  64. fmt.Printf("send icmp packet success!")
  65. }

执行后可以用wireshark抓下包看看,可以看到远方网关传来了reply响应:

看看我们构造的ICMP是否正确:

如果转载请注明出处:http://blog.csdn.NET/gophers/article/details/21481447

用Golang自己构造ICMP数据包的更多相关文章

  1. ping 命令 指定特定网卡 发送 ICMP 数据包

    Windows : ping -S Linux : ping -I <device> -I interface interface is either an address, or an ...

  2. scapy构造数据包

    一.进入scapy交互界面 在终端下输入:scapy ,进入交互界面: 二.查看scapy已经实现的网络协议 ls() 列出scapy中已实现的网络协议 ls(协议类型) 查看某个协议头部字段格式 l ...

  3. ETHERNET数据包格式( IP & UDP & ICMP & ARP )

    ETHERNET数据包格式( IP & UDP & ICMP & ARP ) ETHERNET数据包格式 一.ETHERNET 数据包的协议类型 TYPE 的值为 0x0800 ...

  4. ICMP 隧道——将流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测

    利用 ICMP 隧道穿透防火墙 转自:http://xiaix.me/li-yong-icmp-sui-dao-chuan-tou-fang-huo-qiang/ 以前穿透防火墙总是使用 SSH 隧道 ...

  5. 强大的数据包处理程序scapy

    实验目的 利用scapy工具构造arp.icmp数据包,发送到目标主机,根据应答包推测出目标系统存活情况 实验原理 Scapy是Python写的一个功能强大的交互式数据包处理程序,可用来发送.嗅探.解 ...

  6. netfilter的钩子——数据包在内核态得捕获、修改和转发

    转发:http://blog.csdn.net/stonesharp/article/details/27091391 数据包在内核态得捕获.修改和转发(基于 netfilter)    忙活了好几天 ...

  7. Windows下底层数据包发送实战

    1.简介 所谓“底层数据包”指的是在“运行”于数据链路层的数据包,简单的说就是“以太网帧”,而我们常用的Socket只能发送“运行”在传输层的TCP.UDP等包,这些传输层数据包已经能满足绝大部分需求 ...

  8. Linux 命令 - ping: 向网络主机发送 ICMP ECHO_REQUEST 包

    ping 命令会向指定的网络主机发送特殊网络数据报 IMCP ECHO_REQUEST.多数网络设备收到该数据包后会做出回应,通过此法即可验证网络连接是否正常. 有时从安全角度出发,通常会配置部分网络 ...

  9. opencontrail—VXLAN模式下数据包的传输过程

    在这篇文章中,我们将看到VM生成的数据包如何能够到达另一个VM或外部资源,Neutron使用OpenContrail插件的上下文中的关键概念/组件是什么. 我们将重点介绍OpenContrail,它如 ...

随机推荐

  1. 虚拟现实-VR-UE4-认识UE4

    VR的火热,让每个人都想参与一下, 公司在展会上面搞了一个VR的Demo,关注度超出预期,使得公司高层决定来个VR项目 所以 关于UE4 百度百科地址:http://baike.baidu.com/l ...

  2. 第三篇 Postman之 Tests(后置处理器,断言)

    第二篇里讲了手动设置全局变量及局部变量的方法,但是这有一个缺点,就是每次测试之前,都需要获取相关变量值,手动再填写更新到对应的全局变量或者局部变量里,这对于想进行自动化执行的人或者懒人就不太友好了,本 ...

  3. golang交叉编译笔记

    GOOS:目标平台的操作系统(darwin.freebsd.linux.windows) GOARCH:目标平台的体系架构(386.amd64.arm) Mac 下编译 Linux 和 Windows ...

  4. Hyperledger04

    代码 'use strict'; var Fabric_Client = require('fabric-client'); var path = require('path'); var util ...

  5. [leetcode-635-Design Log Storage System]

    You are given several logs that each log contains a unique id and timestamp. Timestamp is a string t ...

  6. 关于Android Studio启动后自己的配置

    根据Android Stduio自己设置的配置,我们在执行一些操作时可能不向教程那样,此时就要看教程上的Android Stduio的设置.

  7. (转载)MYSQL千万级数据量的优化方法积累

    转载自:http://blog.sina.com.cn/s/blog_85ead02a0101csci.html MYSQL千万级数据量的优化方法积累 1.分库分表 很明显,一个主表(也就是很重要的表 ...

  8. 软工实践 - 第二十三次作业 Beta 冲刺(1/7)

    队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10093337.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...

  9. 重写page的OnInit(学习中总结的)

    在写b/s框架的系统的时候,我们会发现,我们经常会在不同的网页中验证Session是否存在,,而我这里没有用Session,用的是MemCache技术,其实它就是键值对. 只不过将Memcache中的 ...

  10. 弹框中的elment-form在弹框重新打开后,怎么初始化验证信息

    如果弹框关闭前有错误提示,弹框重新打开,由于没重新刷新页面,该错误还是存在.... 解决办法:弹框中的内容写成一个组件,prop接收父元素弹框的状态,并监听且reset表格 1. cnpm insta ...