# Ping.pingecho

**URL:** <https://www.ruby-forum.com/t/ping-pingecho/147232>\
**Category:** Ruby\
**Created:** [August 29, 2008, 5:51pm UTC](https://www.ruby-forum.com/t/ping-pingecho/147232 "2008-08-29T17:51:13Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![john\_maclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@john\_maclean](https://www.ruby-forum.com/u/john_maclean)\
**Post date:** [August 29, 2008, 5:51pm UTC](https://www.ruby-forum.com/t/ping-pingecho/147232/1 "2008-08-29T17:51:13Z")

</div>

[Cisco.com](http://Cisco.com) don’t normally allow pings so tracroutes and pings won’t get  
echo requests.

irb(main):003:0\> Ping.pingecho(‘[cisco.com](http://cisco.com)’, 10, 80)  
=\> true

How come this works and `ping` does not? From irb I see that Ruby’s  
ping uses a TCP echo. Also I’ve run tcpdump whilst running ping.echo  
and could not determine the port that it uses. What port does Ruby’s  
Ping use?

---

<div class="post-metadata">

**Author:** ![john\_maclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@john\_maclean](https://www.ruby-forum.com/u/john_maclean)\
**Post date:** [August 29, 2008, 5:56pm UTC](https://www.ruby-forum.com/t/ping-pingecho/147232/2 "2008-08-29T17:56:24Z")

</div>

john maclean wrote:

> [Cisco.com](http://Cisco.com) don’t normally allow pings so tracroutes and pings won’t get  
> echo requests.
> 
> irb(main):003:0\> Ping.pingecho(‘[cisco.com](http://cisco.com)’, 10, 80)  
> =\> true
> 
> How come this works and `ping` does not? From irb I see that Ruby’s  
> ping uses a TCP echo. Also I’ve run tcpdump whilst running ping.echo  
> and could not determine the port that it uses. What port does Ruby’s  
> Ping use?

check out:

[http://www.noobkit.com/show/ruby/ruby/standard-library/ping/pingecho.html](http://www.noobkit.com/show/ruby/ruby/standard-library/ping/pingecho.html)

According to this the ‘echo’ port.

grep’ing ‘echo’ in my /etc/services reveals this is port 7…apparently.  
(UDP and TCP).

---

<div class="post-metadata">

**Author:** ![john\_maclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@john\_maclean](https://www.ruby-forum.com/u/john_maclean)\
**Post date:** [August 30, 2008, 7:23am UTC](https://www.ruby-forum.com/t/ping-pingecho/147232/3 "2008-08-30T07:23:40Z")

</div>

2008/8/29 John Pritchard-williams [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > and could not determine the port that it uses. What port does Ruby’s
> 
> –  
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

Thanks for the reply. pinging on the echo port makes sense. However  
one can ping a host for service and get a response even if that  
service is not actually running on the host.

services = %w{bacula-dir distcc echo fax git hostname http https icmpd  
kermit keyserver ldap mbus msexch-routing mysql nmap postgres quake  
rsync rwhois shell squid ssh svn telnet traceroute tunnel whoami wins  
x11}

wooota = ‘192.168.1.1’

services.each do |x|  
p %Q{checking host #{host} for protocol #{x}}  
p Socket.getaddrinfo(host, x)  
end

I get responses even though I **know** that these services are **not**  
running on my router. Is this because pingecho sends packets on port 7  
regardless of the service that one requests?

---

<div class="post-metadata">

**Author:** ![john\_maclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@john\_maclean](https://www.ruby-forum.com/u/john_maclean)\
**Post date:** [August 30, 2008, 7:10pm UTC](https://www.ruby-forum.com/t/ping-pingecho/147232/4 "2008-08-30T19:10:59Z")

</div>

john maclean wrote:

> > > ping uses a TCP echo. Also I’ve run tcpdump whilst running ping.echo
> 
> end
> 
> I get responses even though I **know** that these services are **not**  
> running on my router. Is this because pingecho sends packets on port 7  
> regardless of the service that one requests?

getaddrinfo doesn’t do what you think it does. All it does is resolve  
the hostname you give it and translate the english name of the port into  
the port number by looking it up in /etc/services (or similar). It  
doesn’t actually try to open a TCP connection to that host to determine  
if that port is open.

Also, a “TCP ping” is an attempt to determine if a host is up by doing  
something like sending it a connection request. If the connection  
request is either allowed (SYN/ACK) or denied (RST), you know the host  
is up. This is unreliable as many hosts drop connection requests on  
ports that are closed, but is a good method of determining if a host is  
up if they block ICMP. When you use Ping.pingecho on a host that drops  
packets instead of sending RST, be sure to specify a port you know is  
open.

---

<div class="post-metadata">

**Author:** ![john\_maclean](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e8c25b/32.png) [@john\_maclean](https://www.ruby-forum.com/u/john_maclean)\
**Post date:** [August 30, 2008, 1:48pm UTC](https://www.ruby-forum.com/t/ping-pingecho/147232/5 "2008-08-30T13:48:29Z")

</div>

On Fri, Aug 29, 2008 at 11:01 PM, john maclean [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> > > ping uses a TCP echo. Also I’ve run tcpdump whilst running ping.echo  
> > > (UDP and TCP).  
> > > service is not actually running on the host.  
> > > p Socket.getaddrinfo(host, x)  
> > > end
> 
> I get responses even though I **know** that these services are **not**  
> running on my router. Is this because pingecho sends packets on port 7  
> regardless of the service that one requests?

I suspect the zeroth entry doesn’t mean anything, just that the  
command ran without error. For example, try  
Socket.getaddrinfo(‘0.0.0.0’, ‘smtp’).

Todd
