为什么 ping 不通某网站,但是却可以访问该网站?
访问一个网站的时候,想看看它的 ip 是多少,就在 windows 命令行下去 ping 了下该网站。ip 地址是解析出来了,但是却发现请求超时,没有 ping 通,当时就很困惑。然后又 tracert 该 ip 跟踪了一下,想看看到底什么问题。最后我发现,当跟踪到该 ip 的时候,请求被拒绝了。突然想到,应该是服务端 设置了相关策略 对网络层 icmp 回显请求报文 进行了限制;而访问网页用的是 http[s] 协议,因此会出现此现象。
[notice]ping 的实质:发送一个 icmp 回显请求报文给目的的主机,并等待回显的 icmp 应答,然后打印出回显报文。[/notice]
回显的结果包括:字节数、反应时间、TTL(生存时间)
[notice]Tracert 的实质:利用 ICMP 数据报和 IP 数据报头部中的 TTL 值。[/notice]
TTL(Time To Live)是一个 IP 数据报的生存时间,当每个 IP 数据报经过路由器的时候都回把 TTL 值减去1或者减去在路由器中停留的时间,但是大多数数据报在路由器中停留的时间都小于 1 秒种,因此实际上就是在 TTL 值减去了 1。这样,TTL 值就相当于一个路由器的计数器。
当路由器接收到一个 TTL 为 0 或者 1 的 IP 数据报的时候,路由器就不再转发这个数据了,而直接丢弃,并且发送一个 ICMP “超时” 信息给源主机。Tracert 程序的关键在于,这个回显的 ICMP 报文的 IP 报头的信源地址就是这个路由器的 IP 地址。如果到达了目的主机,我们并不能知道,于是 Tracert 还同时发送一个 UDP 信息给目的主机,并且选择一个很大的值作为 UDP 的端口,使主机的任何一个应用程序都不使用这个端口。所以当达到目的主机的时候,UDP 模块就产生一个 “端口不可到达” 的错误,这样就能判断是否是到达目的地了。