学会使用这些常见的网络诊断工具,助力你的网络编程之路

Posted 看,未来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学会使用这些常见的网络诊断工具,助力你的网络编程之路相关的知识,希望对你有一定的参考价值。

工具使用

在网络服务端学习以及开发过程中,我们总会碰到这样或那样的问题。学会对这些问题进行诊断和分析,其实需要不断地积累经验。

那么今天要积攒的经验,就是那些Linux平台为我们准备的工具。那些可以使我们事半功倍的工具!


ping

我想这个命令都知道吧,不知道的我也不说啥了,现在可以知道了,用于在网络上用来完成对网络连通性的探测。

来我们ping一下新浪网,或者也可以去ping一下百度:www.baidu.com

$ ping www.sina.com.cn
PING www.sina.com.cn (202.102.94.124) 56(84) bytes of data.
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=1 ttl=63 time=8.64 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=2 ttl=63 time=11.3 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=3 ttl=63 time=8.66 ms
64 bytes from www.sina.com.cn (202.102.94.124): icmp_seq=4 ttl=63 time=13.7 ms
^C
--- www.sina.com.cn ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 6005ms

TTL(time to live),反映了两个 IP 地址之间传输的时间。
ping还会反馈一些统计信息,碧如最小时间、平均时间等。


ping的底层原理

ping是基于ICMP协议开发的,而ICMP协议是一种基于IP协议的控制协议,网际控制协议。

报文格式如下:

当我们发起 ping 命令时,ping 程序实际上会组装成如图的一个 IP 报文。报文的目的地址为 ping 的目标地址,源地址就是发送 ping 命令时的主机地址,同时按照 ICMP 报文格式填上数据,在可选数据上可以填上发送时的时间戳


ifconfig

emmm,这篇比较基础哈。
用来显示当前系统中的所有网络设备,通俗一点的说,就是网卡列表。

一般我用这个命令也就是来找一下我的IP的。

inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
inet6 addr: fe80::54:adff:feea:602e/64 Scope:Link

这段呐,是IPV4地址和IPV6地址。

IPV4地址还顺带给了广播地址和子网掩码。


Link encap:Ethernet  HWaddr 一串

这里表明这是一个以太网设备,Mac地址是。。。


netstat 和 lsof

在平时的工作中,我们最常碰到的问题就是某某进程对应的网络状况如何?是不是连接被打爆了?还是有大量的 TIME_WAIT 连接?

netstat 可以帮助我们了解当前的网络连接状况,比如我想知道当前所有的连接详情,就可以使用下面这行命令:

netstat -alepn

对于 TCP 类型来说,最大的好处是可以清楚地看到一条 TCP 连接的四元组(源地址、源端口、目的地地址和目的端口)。

看个例子:

tcp        0      0 127.0.0.1:2379          127.0.0.1:52464         ESTABLISHED 0          27710       3496/etcd

它表达的意思是本地 127.0.0.1 的端口 52464 连上本地 127.0.0.1 的端口 2379,状态为 ESTABLISHED,本地进程为 etcd,进程为 3496。

这在实战分析的时候非常有用,比如你可以很方便地知道,在某个时候是不是有很多 TIME_WAIT 的 TCP 连接,导致端口号被占用光,以致新的连接分配不了。


当然,我们也可以只对 UNIX 套接字进行筛查:

netstat Socket -x -alepn

UNIX 套接字的结果稍有不同,最关键的信息是 Path,这个信息显示了本地套接字监听的文件路径,比如:

unix  3      [ ]         STREAM     CONNECTED     23209    1400/dockerd        /var/run/docker.sock

这其实就是大名鼎鼎的 Docker 在本地套接字的监听路径。/var/run/docker.sock 是本地套接字监听地址,dockerd 是进程名称,1400 是进程号。

netstat 命令可以选择的参数非常之多,这里只关注了几个简单的场景,你可以通过帮助命令或者查阅文档获得更多的信息。

这里要插一点:
这些所谓的文档,都是英文版的,所以,英文阅读能力决定了你能走多远


lsof 的常见用途之一是帮助我们找出在指定的 IP 地址或者端口上打开套接字的进程。Isof 和 netstst 可以结合起来一起使用。

lsof /var/run/docker.sock

下面这张图显示了是 dockerd 打开了这个本地文件套接字:


lsof 还有一个非常常见的用途。如果我们启动了一个服务器程序,发现这个服务器需要绑定的端口地址已经被占用,内核报出“该地址已在使用”的出错信息,我们可以使用 lsof 找出正在使用该端口的那个进程。比如下面这个代码,就帮我们找到了使用 80 端口的那个进程,从而帮助我们定位问题。

lsof -i :80

(80端口是HTTP的。。)


tcpdump

抓包工具,说真的,以前没有体验过。

tcpdump 具有非常强大的过滤和匹配功能。

比如说指定网卡:

tcpdump -i eth0

再比如说指定来源:

tcpdump src host hostname

来个例子:
抓的包是 TCP,且端口是 80,包来自 IP 地址为 XXX:XX:X:X 的主机地址。

tcpdump 'tcp and port 80 and src host XXX:XX:X:X' 

tcpdump 在开启抓包的时候,会自动创建一个类型为 AF_PACKET 的网络套接口,并向系统内核注册。当网卡接收到一个网络报文之后,它会遍历系统中所有已经被注册的网络协议,包括其中已经注册了的 AF_PACKET 网络协议。系统内核接下来就会将网卡收到的报文发送给该协议的回调函数进行一次处理,回调函数可以把接收到的报文完完整整地复制一份,假装是自己接收到的报文,然后交给 tcpdump 程序,进行各种条件的过滤和判断,再对报文进行解析输出。

tcpdump 的输出格式:

释义:
1、时间戳
2、类似 192.168.33.11.41388 > 192.168.33.11.6443 这样的,显示的是源地址(192.168.33.11.41388)到目的地址(192.168.33.11.6443);
3、Flags [ ] 是包的标志,比较常见的包格式如下:

[S]:SYN,表示开始连接
[.]:没有标记,一般是确认
[P]:PSH,表示数据推送
[F]:FIN,表示结束连接
[R] :RST,表示重启连接

4、其它

seq:包序号,就是 TCP 的确认分组
cksum:校验码
win:滑动窗口大小
length:承载的数据(payload)长度 length,如果没有数据则为 0

此外,tcpdump 还可以对每条 TCP 报文的细节进行显示,让我们可以看到每条报文的详细字节信息。这在对报文进行排查的时候很有用。

cpdump 这个工具还可以对 UDP 包进行抓包处理哦!


iftop

iftop命令可以查网络io大户,至于其他的,可以自己了解了解,都挺有意思的。


以上是关于学会使用这些常见的网络诊断工具,助力你的网络编程之路的主要内容,如果未能解决你的问题,请参考以下文章

网络管理员需要的维修工具

AD复制故障

网络管理员需要掌握啥知识

Linux系统诊断必备技能之二:tcpdump抓包工具详解

网络相关的命令工具研究报告

Python集成网络诊断小工具(含有ping,tracert,tcping等小工具)