tcpdump命令只能抓到3次挥手

本文探讨了TCP连接断开过程中的现象,通常认为需要四次挥手,但在实际捕获的数据包中仅发现三次交互。通过深入分析TCP状态转换及数据包字段,揭示了这一现象背后的原因。

        用了个两个Linux系统一个是服务器端,一个是客户端,并用tcpdump命令抓取数据包,查看两台机器用tcp协议进行连接和断开时的ip数据包,在查看连接建立的过程中是有3次握手,这个是正常的,但是再看连接断开时,却发现了问题,并没有传说中的4次挥手,反而只有3个数据包,无论是在客户端,还是服务器端,抓到的断开数据包只有三个,难道是tcp协议和实现还不一样吗?网上扑天盖地的全是4次挥手,而且大家都好像确信抓到4个数据包,难道在我这里出现了问题,还是我的抓取方式有问题,百思不得其解啊。。。

 

     

        最后原因找来找去,查到的认为可能的原因是服务器收到FIN数据包后, 调用close函数时, 清空socket缓存里的数据包,其中也包括服务器发出的ACK包,而且速度太快了,数据包存在时间太短了,结果导到这个数据包没有被tcpdump抓到,但是如果是这个原因的话,那应该在客户端会抓到断开的4个数据包,但是我在客户端和服务端都只抓到3个连接断开的数据包,后来分析TCP状态图,结合TCP包的数据字段分析终于找到原因了.

        可以看到TCP状态图中,客户端发送FIN 数据包给服务器就由ESTABLISHED状态进入到FIN_WAIT_1状态,如果此时收到服务器发送过来的FIN+ACK消息,将直接进入TIME_WAIT状态,这个时候客户端不用进入FIN_WAIT_2状态,断开连接的过程只用3个数据包就可以完成了。

        我们再来分析下tcpdump打印的数据包,看看是否收到了服务端发送的FIN+ACK消息,如果收到了,就证明实际上断开连接收发三个数据包就能完成,先看看TCP头部字段的

数据结构:

    

  

       

        可以看到上图红框中数据 8011 转成2进制就是  1000000000010001 ,很明显看到ACK和FIN字段就被设置了,所以这条消息就是状态图中服务端发送的FIN + ACK消息,直接让客户端进入到TIME_WAIT状态,此时看到的断开连接的数据包只有3个,而不是4个,也就不并是传说中的 “4次挥手了”。

       大家如果也碰到这种类似的情况也可以一起讨论下原因。

 

 

在银河麒麟系统中,如果缺少 `tcpdump` 工具,仍可以通过其他方式实现网络数据包的捕获和分析。以下是几种可行的替代方案: ### 使用 `tcpdump` 以外的命令行工具 #### `tcpflow` `tcpflow` 是一个用于捕获和重组 TCP 流量的工具,能够将网络流量按会话拆分并保存为文件,便于后续分析。安装和使用方式如下: ```bash sudo apt install tcpflow tcpflow -i ens33 port 80 ``` 该命令会捕获通过 `ens33` 接口的 HTTP 流量,并将每个 TCP 会话保存为独立文件。 #### `tshark` `tshark` 是 Wireshark 的命令行版本,功能与图形界面版本一致,但更适合在无图形界面的服务器环境中使用。安装和使用方式如下: ```bash sudo apt install tshark tshark -i ens33 -f "tcp port 22" -w ssh_capture.pcap ``` 该命令会捕获 `ens33` 接口上与 SSH(端口 22)相关的流量,并将结果保存为 `ssh_capture.pcap` 文件,可使用 Wireshark 打开进行分析。 ### 使用内核模块和系统工具 #### `pktgen` 模块 `pktgen` 是 Linux 内核提供的一个网络数据包生成工具,虽然主要用于测试网络性能,但也可以用于捕获和分析特定流量。通过 `/proc` 文件系统进行配置,例如: ```bash echo "add_device eth0" > /proc/net/pktgen/kpktgend_0 echo "count 10000" > /proc/net/pktgen/eth0 echo "src_min 192.168.1.1" > /proc/net/pktgen/eth0 echo "dst_min 192.168.1.2" > /proc/net/pktgen/eth0 ``` 上述命令配置了 `eth0` 接口发送 10000 个数据包,源地址为 `192.168.1.1`,目标地址为 `192.168.1.2`。虽然主要用于生成流量,但结合 `tcpdump` 或 `tshark` 可以实现流量捕获和分析。 #### `nmap` 工具 `nmap` 是一款网络扫描和探测工具,虽然不直接用于抓包,但可以与 `tcpdump` 或 `tshark` 配合使用,进行特定目标的流量捕获。例如: ```bash nmap -sS -p 22 192.168.1.1 ``` 该命令会向 `192.168.1.1` 的 SSH 端口发送 TCP SYN 请求,结合 `tcpdump` 可以捕获到响应流量。 ### 使用图形化工具 #### Wireshark 如果银河麒麟系统支持图形界面,可以直接使用 Wireshark 进行抓包。启动 Wireshark 后选择需要监听的网络接口,点击“开始”即可进行抓包。Wireshark 提供了强大的过滤和分析功能,适合需要详细分析流量的场景。 #### `tcpdump` 替代方案 如果无法直接安装 `tcpdump`,但系统支持 Python,可以使用 `scapy` 库进行数据包捕获和分析。安装和使用方式如下: ```bash pip install scapy ``` ```python from scapy.all import sniff # 捕获前 10 个数据包 packets = sniff(count=10, iface="ens33") packets.summary() ``` 该脚本会捕获 `ens33` 接口上的前 10 个数据包,并输出简要信息。 ### 总结 在银河麒麟系统中,即使没有 `tcpdump` 命令,仍可通过 `tshark`、`tcpflow`、`scapy` 等工具实现数据包的捕获和分析。这些工具在功能上各有侧重,适用于不同的使用场景和需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值