Total Pageviews

Wednesday, 25 July 2012

如何排查网络问题

   要用户判断自己能访问什么网站, 不能访问什么网站, 这很容易. 要判断服务器能否能为其他用户所访问则不那么直接, 我推荐各位使用webkaka.com 的网站测速功能进行测试.

 如果大部分国内节点的检测结果是正常, "内容下载速度(KB/s)" 较快, 则可能少数国内节点无法访问目标服务器, 出现了网络问题.

如果出现的问题属于客户端问题, 请向专业的维护人员求助; 如果出现的问题属于服务器问题, 请尽快联系站长; 如果是网络问题, 请按照下文进行排查.

网络是分层的
但是网络是分层的, 我们每天使用的互联网各层之间的分离是如此透明, 导致用户在浏览网站时根本不知道"用浏览器访问一个网页" 这个行为背后到底发生了些什么. 所以在排查网络问题的时候, 也应该用分层的思想来进行排查, 仅仅提出"为什么我上不了某个网站" 这个疑问对于解决问题毫无助益.

按照TCP/IP 参考模型, 网络由低到高可以分成连接层, 网络层, 传输层和应用层 这四层. 在排查网络问题的过程中, 一般只需要通过应用层和传输层就能发现问题的原因, 网络层的ICMP 协议常用于判断连接性, 只有在很特殊的情况下才需要深入到网络层的IP 协议 (如某些长度的packet 不能通过某些路由器).

关于TCP/IP 参考模型, 可以读一读wikipedia 上的词条 http://en.wikipedia.org/wiki/Internet_protocol_suite , 这个网页也可以作为网络协议速查表使用.

访问一个网页的背后
要知道浏览器为什么不能访问某个网络资源, 首先要明白浏览器访问某个网络资源时, 究竟发生了些什么. 从用户输入网址到浏览器开始获取资源, 这个过程可以简化成如下步骤:

    客户端进行DNS 查询, 获得目标服务器的ip 地址;
    客户端与目标ip 上的目标端口建立TCP 连接(三次握手);
    客户端向目标服务器发送HTTP 请求;
    目标服务器返回数据

而浏览网页时可能发生的网络问题, 就发生在这些步骤里, 通常为:

    客户端无法建立到DNS 服务器的连接 (传输层, 通常为UDP 连接, 也可能为TCP连接);
    DNS 服务器没有返回正确的查询结果 (应用层);
    客户端无法建立到目标ip 上目标端口的连接 (传输层, TCP连接);
    客户端无法建立到目标服务器的HTTP 连接 (应用层);

把脉

如同所有的医生, 你需要各种器械来进行诊断, 以判断一个问题到底发生在哪一层, 然后才能对症下药. 针对各层, 我推荐如下诊断工具:
 层       协议       Windows       *nix 
 网络层       ICMP       ping       ping 
 网络层       ICMP       tracert       traceroute 
 网络层       ICMP       mturoute       - 
 传输层       TCP       tcping       - 
 传输层       TCP       tracetcp       - 
 传输层       UDP       ftrace       - 
 应用层       DNS       nslookup       - 
 应用层       HTTP       wget       wget 
 应用层       HTTP       firebug       firebug 

*注: ping 系用于检测连通性, trace 系用于寻找问题节点; firebug 是Firefox 的扩展, Chrome 和ie 的开发者工具(F12) 与之功能类似; 本文仅描述思路, 关于这些工具如何使用, 请读者自行Google。

在排查时建议从高层向底层逐层排查, 

如果 "正在解析主机 urdomain.com" 的结果不是这个样子, 则DNS 查询结果出错, 需要对DNS 服务器进行排查 ( nslookup urdomain.com ).

如果客户端无法建立连接目标服务器的TCP 连接, 需要用tcping 和tracetcp 进行排查.
附: 本文提到的部分工具的项目地址

tcping http://www.elifulkerson.com/projects/tcping.php
mturoute http://www.elifulkerson.com/projects/mturoute.php
tracetcp http://tracetcp.sourceforge.net/
ftrace http://www.r1ch.net/stuff/ftrace/
wget http://gnuwin32.sourceforge.net/packages/wget.htm
firebug http://getfirebug.com/