如何排查网络问题

要用户判断自己能访问什么网站, 不能访问什么网站, 这很容易. 要判断服务器能否能为其他用户所访问则不那么直接, 我推荐各位使用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。

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

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

如果客户端无法建立连接目标服务器的TCP 连接, 需要用tcping 和tracetcp 进行排查.

Comments are closed.