网络通信故障排查
网络通信故障排查常用命令
1. ifconfig命令
主要用于查看当前系统的网卡和IP地址信息,通过此命令,可以查看以下信息:
- 本机当前激活的网卡列表
- 每个网卡的IPV4地址
- 每个网卡的IPV6地址
- 子网掩码
- 广播地址
可以看到本机当前有两块激活的网卡:eth0和lo
ifconfig
命令默认只展示激活的网卡,可以通过ifconfig -a
命令,查看本机下所有的网卡信息(激活和未激活)
ifconfig 网卡名 up
命令可以激活网卡
ifconfig 网卡名 down
命令可以禁用网卡
可通过ifconfig 网卡 add IPAddress
命令将IP地址绑定到指定的网卡
ifconfig eth0 add 198.140.1.14
可通过ifconfig 网卡 del IPAddress
命令从指定网卡上解绑对应的IP地址
示例:
ifconfig lo add 198.120.1.14
ifconfig
可以看到,在上述的操作中,网卡lo
已经绑定了地址127.0.0.1,还可以通过ifconfig
指令绑定新的IP地址,此时就可以使用新的IP地址访问原来的网络了。
2. ping命令
ping
命令一般用于侦测本机到目标主机的网络是否通畅, ping
命令是通过发送ICMP数据包实现的;
ping 198.120.75.20
同时,ping命令的目前也可以是域名,通过ping这个域名,会获取到域名解析后的IP地址
ping www.baidu.com
可以看到域名www.baidu.com解析后的IP地址为36.154.44.95
3.telnet命令
telnet是较为常用的网络调试命令之一, 如果一个服务程序开启了对外监听服务,则可以使用telnet ip port
的方式进行连接,如果链接的时候不指定端口号,则会使用默认的端口号32.
例如可使用telnet链接百度服务
telnet wwww.baidu.com 80
使用示例:
如果有一个svn服务器,为了检测svn服务能否正常对外服务,则首先可通过ping
命令验证到达这个IP地址的网络是否通畅(即物理链路是否通畅);如果物理链路通常,则使用telnet去链接对应的svn服务器,默认svn服务器使用3690端口,如果能成功连上,则说明这个svn服务器正常开启且能够对外提供服务;
可以使用telnet实现邮件发送功能;首先通过telnet链接邮箱服务器,进行登录验证,即可按照特定的格式发送邮件信息;
4. netstat命令
netstat命令用于查看网络的链接状态;常见的参数选项如下所示:
- -a 表示显示所有选项,netstat默认不显示listen相关的选项
- -t 仅仅显示tcp相关的选项
- -u 仅仅显示udp相关的选项
- -l 仅显示处于listen状态的相关选项
- -p 显示建立相关链接的程序名
- -n 不显示别名,将能显示数字的全部转换为数字显示 如127.0.0.1默认会显示为别名localhost,80端口会被显示为http
- -r 显示路由信息,路由表
- -s 按照各个协议进行统计
- -e 显示扩展信息
- -c 每格固定的时间执行netstat
5. lsof命令
lsof命令用于列出Linux下各个进程打开的文件描述符类型,在Linux下所有宇资源句柄相关的内容都被同意抽象为文件描述符;例如文件句柄,或者socket, 如下所示:
lsof | more
lsof输出的内容较多,可通过过滤来查看指定的内容:
lsof -i | grep myapp
也可按照进程过滤查看:
lsof -p pid
lsof只能查看当前用户有权限查看的fd;
socket也是一种文件描述符,如果需要显示当前系统网络链接情况,则可使用命令lsof -i
,可以形象的展示系统当前的出入链接情况;如果需要不显示ip地址和端口的别名,则需要分别添加-P,-n参数来实现;
lsof -Pin
可使用如下命令查看某个端口是否被占用:
lsof -i:port
恢复被删除的文件:
Linux下某个正在被进程使用的文件被删除了,可以对其尝试恢复。可进入/proc/pid/fd/
目录下查看,找到对应的被删除文件,执行如下命令即可恢复:
cat file > newfile
file为目录/proc/pid/fd/
下的被删除文件,newfile为指定恢复后的文件名
6. nc命令
nc即为netcat命令,常用于模拟一个服务器程序被客户端链接,也可以模拟一个客户端程序来链接其他的服务器;链接上之后可以进行数据收发;
nc命令默认使用TCP,加上参数-u可使用udp
nc可用于模拟服务端程序,被其客户端链接,通过添加参数-l,可在某个IP地址端口上开启监听服务,以便让其他客户端链接,可在命令中加上-v参数,显示详细的信息;
nc -lv 127.0.0.1 6500
也可以模拟客户端去链接其他服务器,此时不需要加-l参数;在客户端链接服务器的时候,一般都是操作系统为客户端分配一个随机的端口号连接到服务器,在使用nc命令模拟客户端的时候,可以通过-p参数指定客户端的端口号;
nc -v -p 5000 www.baidu.com 80
可使用nc模拟服务端和客户端进行相互通信,也可以进行文件传输,文件传输的方法如下所示:
- 首先开启服务端监听,指定需要存储的文件路径:
nc -v -l 127.0.0.1 6500 > file.txt
开启对6500端口的监听,等到接受文件数据存储到文件file.txt
- 开启客户端,发送文件testFile.txt
nc -v 127.0.0.1 6500 < testFile.txt
7. curl命令
与windows下的PostMan一样,curl命令是Linux下模拟发送http请求的命令;
http请求的常用方式有GET和POST,可使用参数—X指定请求的方式
- -X GET GET请求
- -X POST POST请求
如果是POST请求方式,还需要增加-d
参数,指定POST的数据;
如果在发送HTTP请求的时候,需要制定一些HTTP请求头的信息,则可以使用-H
参数来进行指定:
- -F 模拟表单上传功能
- -H 设置请求的头部信息
- -A 可设置请求时的user-agent字段的值(--user-agent)
- -e 可设置请求时的refer字段的值(--referer)
- -i 在请求的应答结果中包含HTTP头部信息(--include)
- -I 在请求的应答结果仅显示HTTP头部信息(--head)
curl --include www.baidu.com
例如,需要表单上传文件,表单一共有两个字段,uploadVideo,title,且需要设置HTTP头信息:
curl -X POST https://www.testsite.com/api/upload
-F "uploadVideo=@D:/video/car.mp4"
-F "title=car"
-H "Content-Type:multipart/form-data"
8. curl命令
tcpdump
是Linux提供的一个非常强大的抓包工具,对于排查网络问题非常有用;
tcpdump使用必须有sudo权限
常用参数:
- -i 指定需要捕获的网卡名(ifconfig可获得),如果需要捕获所有网卡,则网卡名指定为any
- -X 以ASCII和十六进制的形式输出捕获的内容,减去链路层的包头信息
- -XX 以ASCII和十六进制的形式输出捕获的内容,包括链路层的包头信息
- -vv 显示详细的抓包数据
- -vvv 显示更详细的抓包数据
- -w 将抓取的数据包的原始信息写入指定的文件
此外,tcpdump命令还支持各种数据包过滤的表达式:
# 抓取特定网卡eth0特定端口的数据
tcpdump -i eth0 'port 8888'
# 仅抓取经过8888端口的数据包 (tcp:8888 udp:8888)
tcpdump -i any 'port 8888'
# 仅抓取经过tcp:8888端口的数据包
tcpdump -i any 'tcp port 8888'
# 仅显示源端口是tcp:8888的数据包
tcpdump -i any 'tcp src port 8888'
# 仅显示源端口是tcp:8888或者目标端口是udp:9999
tcpdump -i any 'tcp src port 8888 or udp dst port 9999'
# 仅显示源地址是127.0.0.1且源端口是tcp:9999的数据包
tcpdump -i any 'src host 127.0.0.1 and tcp src port 9999' -XX -nn -vv
可以使用nc模拟建立客户端和服务端通信,然后通过tcpdump进行抓包:
# 终端1 建立服务端开始监听
nc -l -u -v 127.0.0.1 12345
# 终端2 开始抓包
tcpdump -i any `udp port 12345` -X -nn -vv
# 终端3 建立客户端,链接服务端并发送消息
nc -u -v 127.0.0.1 12345