前言
这篇博客来一起学习一下如何分析网络问题。
嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏,一起讨论一起学习。现在关注就是老粉啦!
网络配置
ip指令使用
分析网络问题的第一步,是查看网络接口配置和状态,最常用的就是ifconfig
或ip
指令。ip
指令整合了ifconfig
和route
两个命令,不过ip
指令更强。
ip(选项)(对象)
Usage: ip [ OPTIONS ] OBJECT { COMMAND | help }
ip [ -force ] -batch filename
OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
netns | l2tp | macsec | tcp_metrics | token }
-V:显示指令版本信息;
-s:输出更详细的信息;
-f:强制使用指定的协议族;
-4:指定使用的网络层协议是IPv4协议;
-6:指定使用的网络层协议是IPv6协议;
-0:输出信息每条记录输出一行,即使内容较多也不换行显示;
-r:显示主机时,不使用IP地址,而使用主机的域名。
查看网络配置和状态
以网络接口eth0为例,使用以下指令查看配置和状态
ip -s addr show dev etho
可以看到在控制台输出了一系列网络接口的状态信息,我们来分析一下这些信息:
- 第一行中,是网络接口的状态标志,ip指令输出中看到
LOWER_UP
就代表物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果看不见该信息,那可能是网线断开了。 - 同样第一行中,可以看到MTU(最大传输单元)大小,紧接在<>之后,MTU默认大小是1500,根据网络架构不同,需要调大或调小MTU的值。
- 往下就可以看到网络接口的IP地址、子网以及MAC地址
- 之后是网络首发的字节数、包数、错误数以及丢包情况,主要是RX和TX行中的errors、dropped、overrun、mcast、carrier、collsns等指标不为0时,通常代表出现了网络I/O问题。
errors:表示发生错误的数据包数,比如校验错误,帧同步错误等;
dropped:表示丢弃的数据包数,即数据包已经收到了Ring Buffer,但因为内存不足等原因丢包;
overrun:表示超限数据包数,即I/O速度过快,导致Ring Buffer中的数据包来不及处理(队列满)而导致的丢包
carrier:表示发生carrier错误的数据包数,比如双攻模式不匹配、物理电缆出现问题等
collsns:表示碰撞数据包数
其他指令
1. ip命令是Linux下管理网络接口的主要工具之一,可以用于设置IP地址、路由表、网络接口等。
2. ip命令的常见操作包括查看网络接口信息、设置IP地址、设置网络接口等。
3. 查看网络接口信息的操作:
- ip addr:显示所有网络接口的详细信息,包括接口名称、MAC地址、IPv4地址、IPv6地址等。
- ip link:显示所有网络接口的名称和状态信息。
4. 设置IP地址的操作:
- ip addr add IP地址/掩码 dev 网络接口名:给指定网络接口添加IP地址。
- ip addr del IP地址/掩码 dev 网络接口名:删除指定网络接口的IP地址。
- ip -4 addr add IP地址/掩码 dev 网络接口名:给指定网络接口添加IPv4地址。
- ip -6 addr add IPv6地址/掩码 dev 网络接口名:给指定网络接口添加IPv6地址。
5. 设置网络接口的操作:
- ip link set 网络接口名 up/down:设置指定网络接口的状态为up或down。
- ip link set 网络接口名 name 新名称:给指定网络接口修改名称。
- ip link set 网络接口名 mtu MTU值:设置指定网络接口的最大传输单元大小。
- ip route add 目标地址/掩码 via 网关 dev 网络接口名:添加路由规则,指定目标地址走指定的网关。
6. 其他常用操作:
- ip neigh:显示ARP缓存表。
- ip route:显示和管理路由表。
- ip rule:显示和管理路由策略。
套接字信息
套接字是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。
ifconfig和ip值显示网络接口收发数据包的统计信息,但在实际的性能问题中,网络协议栈中的统计信息也需要关注,可以使用netstat或ss查看套接字、网络栈、网络接口以及路由表的信息。其中ss比netstat提供了更好的性能(速度更快)
一些可选项:
head -n 3 表示只显示前3行
-l 表示只显示监听套接字
-t 表示只显示TCP套接字
-n 表示显示数字地址和端口(而不是名字)
-p 表示显示进程信息
ss -ltnp | head -n 3
如图,该指令显示了套接字状态、接收队列、发送队列、本地地址、远端地址、进程PID、进程名称等。
要尤其关注的是接收队列(Recv-Q)和发送队列(Send-Q),通常应该是0,如果不是0证明有包堆砌,在不同套接字状态下,含义不同。
套接字处于连接(Established)状态时
- Recv-Q表示套接字缓冲还没有被应用程序取走的字节数(接收队列长度)
- Send-Q表示还没有被远端主机确认的字节数(发送队列长度)
套接字处于监听(Listening)状态时
- Recv-Q表示套接字缓冲还没有被应用程序取走的字节数(接收队列长度)
- Send-Q表示还没有被远端主机确认的字节数(发送队列长度)
所谓全连接,是指服务器收到了客户端的ACK,完成了TCP的三次握手,然后就会把这个链接挪到全连接队列中,这些全连接中的套接字,还需要被accept()系统调用取走,服务器才可以开始真正处理客户端的请求。
全连接意外还有半连接,半连接是还没有完成TCP三次握手的连接,连接只进行了一半,服务器收到了客户端的SYN包后,就会把这个连接放入半连接队列中,再向客户端发送SYN+ACK。
协议栈统计信息
协议栈信息
在网络中,为了完成通信,必须使用多层上的多种协议。这些协议按照层次顺序组合在一起,构成了协议栈(Protocol STack)
协议栈形象的反映了一个网络中文件传输的过程:由上层协议到底层协议,再由底层协议到上层协议。使用最广泛的是英特网协议栈,由上到下的协议分别是:应用层(HTTP,TELNET,DNS,EMAIL等),运输层(TCP,UDP),网络层(IP),链路层(WI-FI,以太网,令牌环,FDDI等),物理层。
ss -s
ss的其他常用指令
附带ss的常用指令
ss -s:查看所有的连接信息(很好很强大)
ss -ant:查看所有的tcp连接详细信息
ss -antl:查看所有的tcp连接并且状态为LISTEN的连接
ss -ant state established:查看所有tcp,并且状态为entablished的连接
ss -ant sport eq 22:查看所有tcp并且端口为22的连接
网络吞吐
查看网络接口统计信息
查看系统当前的网络吞吐量和PPS,可以使用sar。给sar增加-n可以查看网络的统计信息,如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP等。
当然,使用的话需要先安装sysstat包:
sudo apt sysstat
使用如下指令得到网络接口统计信息:
sar -n DEV 1
输出指标较多,含义如下:
- rxpck/s 和 txpck/s 分别是接收和发送的PPS,单位是包/s
- rxkB/s 和 txkB/s分别是接收和发送的吞吐量,单位是KB/s
- rxcmp/s 和 txcmp/s分别是接收和发送的压缩数据包数,单位是包/s
- %ifutil 是网络接口的使用率,即半双工模式下为(rxkB/s+txkB/s)/Bandwidth,而全双工模式下位max(rxkB/s+txkB/s)/Bandwidth
查看带宽
Bandwidth可以用ethtool来查询,单位为Gb/s或者Mb/s,小写的b表示比特:
可以看到,我们查看到了ens33是一个千兆网卡
连通性和延时
测试远程主机的连通性和延时,可以用ping指令,比如开发板需要连接我的ubuntu主机,就可以用ping指令检查连通性和延时。
ping 192.168.50.169
ping的输出,可以分为两部分
- 第一部分,是每个ICMP请求的信息,包括ICMP序列号(icmp_seq)、TTL(生存时间)以及往返延时
- 第二部分是三次ICMP请求的汇总
如上的结果中 8 packets transmitted, 8 packets received, 0% packet loss
表示发送了8个网络包,收到了8个响应,没有丢包发生,说明到ubuntu主机是连通的。
平均往返延时(TRR)是0.868ms(最后一行的三个数分别是最小延时,平均延时,最大延时),也就是从发送ICMP开始,到接收到ubuntu主机回复的确定,历时0.868ms。