tcp抓包返回fin_网络抓包简介及案例应用介绍

本文介绍了如何利用网络抓包工具诊断和解决问题,重点讲解了TCP的三次握手和四次挥手,以及在Linux下使用tcpdump和wireshark进行抓包和分析。通过一个NFS挂载错误的案例,展示了如何通过抓包找出‘FIN’标志的含义,最终定位并解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础知识

在庞大的系统中,出现问题一般是根据日志来定位问题。

但是很多系统日志比较模糊,没有明确什么地方有问题。

这个时候用网络抓包就能很清晰的看到什么组件没用返回,或者返回了什么信息,比日志更可靠。

我们一般通过抓包来定位系统的问题。这里涉及到一些抓包相关的基础知识。

OSI七层模型

OSI7层模型定义计算机内部通信的标准。

OSI七层模型,OSI为(Open System interconnect)的缩写,自上而下分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

67e186f3ed19ba61413c0e3215b205df.png

这里提这个模型的,主要是需要了解我们应用转发的顺序,业务数据包都是从上到下进行封装转发。即

应用层 ->表示层 ->会话层->传输层->网络层->数据链路层->物理层

比如telnet是应用层协议,下到传输层是TCP/UDP,到网络层是IP。

相应的,建立链接是从下往上进行的。即

物理层-> 数据链路层 -> 网络层 -> 传输层 -> 会话层 -> 表示层 -> 应用层

我们应用中大部分的协议都是一个应用层协议,比如http、ftp、nfs、snmp等。

记住一点:定位问题中,需要知道应用层的协议是啥。

TCP 三次握手&四次挥手

这里相关资料比较多,主要贴2张图,阐述一下关键的信息:

  • 三次握手

建立连接之前,需要进行3次握手。保证链接的安全。

bd53824a17e8806e0a0b181f283fb985.png

- 第一次:客户端发送初始序号x和syn=1请求标志

- 第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1

- 第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1
  • 四次挥手 断开链接需要四次挥手

782d918421a5d3dce2e7aa839ebf4306.png

- 第一次挥手:客户端发出释放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的数据流。打开一个网络包之后,页面如下:

9790641b719ae2cae6db1c8ca77fdb80.png

案例

【现象】客户端挂载nfs文件服务报错 【分析】后端的nfs服务是正常的,网络链路也是通的,端口也放开了。但是挂载还是报错,提示

mount.nfs4: 10.16.240.13:/share failed, reason given by server: Nosuch file or directory

在客户端开启抓包,然后执行挂载命令,然后用wireshark打开网络包

419f8b1775d3f69554373520602c58b1.png

可以看到有很多tcp的包,也有很多nfs协议的包,info部分为数据包的概要信息。 

按照前文说的,nfs是应用层协议,tcp是传输层的协议。首先要建立tcp链接,然后再进行业务的操作。

数据包的info里面有一些关键字,具体说明如下

SYN表示建立连接

FIN表示关闭连接

ACK表示响应

PSH表示有 DATA数据传输

RST表示连接重置。

这里因为是nfs的挂载,直接找到mount相关的请求,然后右键 追踪流,tcp流

ca27c130905539dc2ffbd075af420ed8.gif

可以看到整个tcp的链接建立过程以及报错信息

d63cf190e6eab34313aa280cbf53e38e.png

  • 建立链接,有syn -- syn + ack -- syn的握手过程,表示链接正常,即网络通信正常;
  • 可以看到客户使用nfs v3的协议挂载的报错的地方,看到挂载的是/路径,按照服务端的规则,需要指定具体的文件系统

aa76c9e748e98932b75da7fbb51b90ca.png

57322ffef31c5ac2dfeb8898545c6d36.png

所以客户端报错no such file or directory

重新按照服务端的配置来挂载,即可。

  • 后文 使用nfs v4挂载后,抓包发现错误为版本不匹配升级客户端nfs util后解决。
  • 27e1783fb12df17fd8e71181b1171093.png

  通过上诉案例,可以看到很多复杂的问题,通过抓包都能够看到具体的原因。但是 抓包需要清楚的知道网络调用的关系,知道上游和下游的预期返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值