这是从我开始经营 RP 主机 以来,被问及的最多的一个问题。
本文将以诊断「为何我没法访问一个网站」的方式,讲述 Web 服务的大体工做流程。html
一般来说,所谓访问一个网站,咱们输入给浏览器的是相似于这样的一个地址:nginx
http://jysperm.me/note/1519
用术语来说,这是一个 URI, 一个 URI 有两个部分,一是协议,二是定位符。
好比『mailto:jysperm@gmail.com』这是一个邮箱的标识符,其中『mailto』是协议,『jysperm@gmail.com』是定位符。
再好比『urn:isbn:9787115281487』这是一本书(HTTP 权威指南)的标识符。git
用来表示网页的 URI 有一个比较特殊的名字叫 URL, 它大体分红这几个部分:github
除此以外还可能会有相似于『?id=1519』的查询字符串。浏览器
这样的一个 URL, 即可以定位到一个网页。安全
首先咱们要找到为咱们提供服务的服务器,即 URL 中的主机名,在这里是 jysperm.me.服务器
TCP/IP 网络中经过 IP 地址来惟一地定位一台主机,更确切地说,每一块网卡,会有一个惟一的 IP 地址。
IP 地址形如 117.121.25.186, 它自己是存在必定结构性的,好比 117.121.25.186 和 117.121.25.187,就有很是大的可能性二者的物理距离很近。
这样的结构性方便于计算机之间互相联络,但不便于人类记忆,因而咱们用由字母组成的域名来表示主机。网络
咱们经过一个叫 DNS 的系统,来将域名翻译成 IP 地址,DNS 系统自己说简单也简单,说复杂也复杂,在这里咱们只讲述如何使用,而不研究其原理。curl
若是浏览器给你的提示是相似于『没法找到 jysperm.me』或者『没法链接到 jysperm.me』,那么有很大可能性是 DNS 查找失败或者出错。
咱们可使用 nslookup 这个命令来手动进行 DNS 查询工具
> nslookup jysperm.me Server: 8.8.8.8 Address: 8.8.8.8#53 Non-authoritative answer: Name: jysperm.me Address: 117.121.25.186
能够看到,咱们向 8.8.8.8(Google 的免费公众 DNS), 查询 jysperm.me 这个域名,它返回给咱们的结果是 117.121.25.186.
这里是 8.8.8.8 是系统的默认 DNS 服务器,咱们还能够本身来指定 DNS 查询服务器:
> nslookup jysperm.me 114.114.114.114 Server: 114.114.114.114 Address: 114.114.114.114#53 Non-authoritative answer: Name: jysperm.me Address: 117.121.25.186
这里使用了国内的 114.114.114.114 进行查询,返回的结果是同样的。
在某些网络封锁比较严重的国家,DNS 查询的结果可能会被篡改,由于 DNS 自己几乎没有任何安全措施,因此查询到的结果可能并非可靠的。
知道了服务器的 IP 地址,下一步是创建 TCP 链接。这一步最常遇到的问题有:
首先 IP 层面,要向一台主机发送数据,这个主机必须是『可达的』,换句话说就是对方必须在线。
最简单的,咱们能够用 ping 命令验证一个主机是否在线:
$ ping 117.121.25.186 PING 117.121.25.186 (117.121.25.186): 56 data bytes 64 bytes from 117.121.25.186: icmp_seq=0 ttl=128 time=138.651 ms 64 bytes from 117.121.25.186: icmp_seq=1 ttl=128 time=71.345 ms 64 bytes from 117.121.25.186: icmp_seq=2 ttl=128 time=286.960 ms
ping 使用的是 ICMP ECHO 指令,就比如你跟对方打招呼,问它是否在线,若是对方回应了,就说明它在线。可是,并不是全部服务器都会回应 ICMP ECHO.
若是发现 ping 命令没有回应,相似于下面的状况:
> ping 59.24.3.173 PING 59.24.3.173 (59.24.3.173): 56 data bytes Request timeout for icmp_seq 0 Request timeout for icmp_seq 1 Request timeout for icmp_seq 2
那么就说明你和服务器直接没有创建连通的链接,可是,链接是在那里断开的呢?这时咱们能够用 traceroute 来探测数据包所走过的路径:
> traceroute www.qq.com traceroute to www.qq.com (180.96.86.192), 64 hops max, 52 byte packets 1 * * * 2 100.64.0.1 (100.64.0.1) 10.224 ms 5.379 ms 6.794 ms 3 218.4.12.229 (218.4.12.229) 8.342 ms 6.817 ms 8.169 ms 4 218.94.165.2 (218.94.165.2) 8.128 ms 8.259 ms 7.173 ms 5 61.155.133.121 (61.155.133.121) 11.152 ms 9.288 ms 9.990 ms 6 202.102.69.254 (202.102.69.254) 11.464 ms 12.463 ms 11.027 ms 7 180.96.51.94 (180.96.51.94) 13.674 ms 13.192 ms 12.364 ms 8 180.96.48.202 (180.96.48.202) 13.564 ms 11.213 ms 13.945 ms 9 * * *
traceroute 依赖于 ICMP, 并不是全部服务器都开启了 ICMP, 所以会有一些路径点被显示为星号。
咱们再来看另外一个不可达的例子:
> traceroute twitter.com traceroute to twitter.com (59.24.3.173), 64 hops max, 52 byte packets 1 * * * 2 100.64.0.1 (100.64.0.1) 4.694 ms 4.502 ms 8.044 ms 3 218.4.12.237 (218.4.12.237) 8.874 ms 5.177 ms 8.133 ms 4 218.4.13.49 (218.4.13.49) 15.205 ms 11.400 ms 12.011 ms 5 202.97.55.41 (202.97.55.41) 14.011 ms 15.794 ms 16.518 ms 6 202.97.50.254 (202.97.50.254) 12.207 ms 12.614 ms 13.165 ms 7 202.97.35.78 (202.97.35.78) 12.246 ms 202.97.35.22 (202.97.35.22) 13.337 ms 202.97.34.126 (202.97.34.126) 13.701 ms 8 202.97.60.33 (202.97.60.33) 58.292 ms 12.432 ms 18.093 ms 12 * * *
能够看到,最后一个能够追踪到的路径点是 202.97.60.33, 经过一些 IP 库能够查到,这个地址属于「广东省广州市 互联网交换中心」,能够打个电话问问他们那边出了什么状况。
访问一个网页会发起不止一个请求,除了网页自己还会加载一些例如样式,图片,脚本之类的资源,甚至不少时候还会加载来自其余网站的资源,经过 Chrome 的开发人员工具中的「Network」选项卡,能够看到加载一个页面所发起的全部请求。
这是一个正常的网站, 全部的资源都加载成功了:
再看下面这张图,其中一个资源没有加载完成,致使整个页面都没法完成,这时咱们就能够经过上面的方法单独排查这一个请求。
经过浏览器来检查一个资源究竟能不能下载在一些复杂状况下并不可靠,由于浏览器会为你的请求加上大量的参数,并且在获得资源后,还会进行渲染。
所以为了「纯粹」地下载一个资源,咱们能够用 curl:
> curl http://pomotodo.com -I HTTP/1.1 302 Moved Temporarily Server: nginx Date: Fri, 01 Aug 2014 03:51:35 GMT Content-Type: text/html Content-Length: 154 Connection: keep-alive Location: https://pomotodo.com/
能够看到 http://pomotodo.com 并不是像咱们看到的那样显示了一个页面,而是发起了一个到 SSL 版本地址的重定向,SSL 能够保证传输的私密性,目前国内只有很小一部分有节操的网站在使用。
等到全部资源都加载完了,可是页面仍是没有内容,或者乱七八糟怎么办?
在正确地获得全部资源后,浏览器会执行网站提供的脚本,来对资源进行加工,以便像网站制做者指望的那样来展示页面。
在这个过程当中,脚本须要使用浏览器提供的 API 来进行渲染,而不一样的浏览器所支持的 API 是有差别的,所以一些制做不是很精良的网站会在不一样的浏览器中呈现不一样的效果,甚至直接出错。
在此建议你们选择一个现代而强大的浏览器,好比 Chrome, 这样能够保证浏览器支持网页所须要的功能。