基于多线程设计检测多台主机ICMP消息串位的问题

一个进程中需要检测多台主机是否正常工作,采用了ICMP检测的方式,每个主机一个线程,定时PING对应主机是否存活。最后发现当有主机down机的情况下,依然能收到ICMP的回应报文。

这个问题看起来很奇怪,其实了解PING的实现原理就会觉得出现这样的问题很正常。

       首先ICMP是基于RAW套接字的,RAW套接字只匹配协议,并不按流匹配,也就是说一个或者多个进程采用RAW方式监听同样协议的socket时,都能收到相同的报文。多个ping进程之所以不出问题,是因为PING将ICMP报文中的icmp_id设置为对应的进程号,进一步通过进程号来区分是否属于自己的报文。最主要的原因是用户态已经去掉了ICMP的报文头,无法看到原地址和目的地址了,所以只能通过ICMP报文的内容来区分。

进而就可以明白为什么多线程情况下检测多台主句会出问题了,因为进程号都一样,所以大家都能收到相同的回应报文,这种情况下只需要修改下icmp协议中icmp_id为自己定义的值就行了。

在TCP和UDP协议情况下,不会用到RAW属性去创建套接字,所以不会有以上 问题。

socket() creates an endpoint for communication and returns a descriptor.


       The  domain  parameter  specifies  a  communication  domain;  this selects the protocol family which will be used for communication.  These fa

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值