基础知识
在庞大的系统中,出现问题一般是根据日志来定位问题。
但是很多系统日志比较模糊,没有明确什么地方有问题。
这个时候用网络抓包就能很清晰的看到什么组件没用返回,或者返回了什么信息,比日志更可靠。
我们一般通过抓包来定位系统的问题。这里涉及到一些抓包相关的基础知识。
OSI七层模型
OSI7层模型定义计算机内部通信的标准。
OSI七层模型,OSI为(Open System interconnect)的缩写,自上而下分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
这里提这个模型的,主要是需要了解我们应用转发的顺序,业务数据包都是从上到下进行封装转发。即
应用层 ->表示层 ->会话层->传输层->网络层->数据链路层->物理层
比如telnet是应用层协议,下到传输层是TCP/UDP,到网络层是IP。
相应的,建立链接是从下往上进行的。即
物理层-> 数据链路层 -> 网络层 -> 传输层 -> 会话层 -> 表示层 -> 应用层
我们应用中大部分的协议都是一个应用层协议,比如http、ftp、nfs、snmp等。
记住一点:定位问题中,需要知道应用层的协议是啥。
TCP 三次握手&四次挥手
这里相关资料比较多,主要贴2张图,阐述一下关键的信息:
- 三次握手
建立连接之前,需要进行3次握手。保证链接的安全。
- 第一次:客户端发送初始序号x和syn=1请求标志
- 第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1
- 第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1
- 四次挥手 断开链接需要四次挥手
- 第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态
- 第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
- 第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)
- 第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。
四次挥手时,当收到对方的 FIN 报文时,仅仅表示对方不再发送数据了但是还能接收数据,己方是否现在关闭发送数据通道,需要上层应用来决定,因此,己方 ACK 和 FIN 一般都会分开发送。
这里参考这个 https://www.cnblogs.com/jainszhang/p/10641728.html
在网络中,尤其业务的处理,都需要先建立连接,然后再来处理业务数据。
抓包工具
在进行抓包时,需要用到一些工具进行抓取。
在linux下,用tcpdump
就可以很方便的抓包了
常见的选项,这里列了重建的
-i 指定网卡,比如eth0,或者bond1,填写any表示所有的网卡
-c 抓取多少个网络包后退出
-w 抓包后存放到指定的文件,一般为pcap格式
-v 在控制台打印网络包信息,可以写多个v,如-vvv表示打印详细信息
-nne 这里是一个组合命令,表示不将域名转换为ip
port xx指定抓取xx端口的网络包
host xx指定抓取xx主机的网络包
如
tcpdump -i bond1 -nne -vvv host cmgt.tce.cloudpoc.test.cn -w host.pcap
分析包的工具
可以在linux下用tcpdump进行分析。但是这里推荐wireshark进行网络包的分析, 支持window和Mac。同样也可以在windows平台下进行抓包。
wireshark是一个强大的网络工具,很多技巧和方法可以设置, 大大提升效率。比如可以自定义数据包显示字段和格式,可以看到某一个http/tcp的数据流。打开一个网络包之后,页面如下:
案例
【现象】客户端挂载nfs文件服务报错 【分析】后端的nfs服务是正常的,网络链路也是通的,端口也放开了。但是挂载还是报错,提示
mount.nfs4: 10.16.240.13:/share failed, reason given by server: Nosuch file or directory
在客户端开启抓包,然后执行挂载命令,然后用wireshark打开网络包
可以看到有很多tcp的包,也有很多nfs协议的包,info部分为数据包的概要信息。
按照前文说的,nfs是应用层协议,tcp是传输层的协议。首先要建立tcp链接,然后再进行业务的操作。
数据包的info里面有一些关键字,具体说明如下
SYN表示建立连接
FIN表示关闭连接
ACK表示响应
PSH表示有 DATA数据传输
RST表示连接重置。
这里因为是nfs的挂载,直接找到mount相关的请求,然后右键 追踪流,tcp流
可以看到整个tcp的链接建立过程以及报错信息
- 建立链接,有syn -- syn + ack -- syn的握手过程,表示链接正常,即网络通信正常;
- 可以看到客户使用nfs v3的协议挂载的报错的地方,看到挂载的是/路径,按照服务端的规则,需要指定具体的文件系统
所以客户端报错no such file or directory
重新按照服务端的配置来挂载,即可。
- 后文 使用nfs v4挂载后,抓包发现错误为版本不匹配升级客户端nfs util后解决。
通过上诉案例,可以看到很多复杂的问题,通过抓包都能够看到具体的原因。但是 抓包需要清楚的知道网络调用的关系,知道上游和下游的预期返回。