wireshark.(前称Etherea是一个网络封包分析软件,可以分析网络丢包,重传等问题。
下面介绍常见的TCP层的常用FLAGS。
标志位 描述
SYN 建立联机
ACK 确认
PSH 有DATA数据传输
FIN 关闭连接
RST 重置链接
一般地,只是单个的一个SYN,它表示的只是建立连接。当出现SYN和ACK可能同时为1,我们认为客户端与服务器建立了一个连接。而当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。
抓包异常数据解读
- [TCP Previous segmenrtnot captured]丢包 在TCP传输过程中,同一台主机发出的数据段应该是连续的,即后一个包的Seq号等于前一个包的Seq + Len (三次握手和四次挥手是例外)当后Seq>前Seq +Len,就知道中间缺失了一段数据。 [TCP Out-of-Order]乱序 wireshark在获取包序号26时发现seq=18981,而包序号25的数据Pseq = 20441.所以wireshark认为数据包顺序错了
2.[TCP Dup ACK x#y]
当乱序或者丢包发生时,接收方会收到一些Seq号比期望值大的包。
3、[TCP Spurious Retransmission]丢包重传
4、[TCP Fast Retransmission]快速重传
当发送方收到3个或以上[TCP Dup ACK],就意识到之前发的包可能丢了,于是快速重传它(这是RFC的规定)。
5、[TCP Retransmission]超时重传
如果一个包真的丢了,又没有后续包可以在接收方触发[Dup Ack],就不会快速重传,只能超时重传。
6、几种TCP连接中出现RST的情况
1 .端口未打开
服务器程序端口未打开而客户端来连接。这种情况是最为常见和好理解的一种了。去telnet一个未打开的TCP的端口可能会出现这种错误。
2.请求超时
查看2次包的时间间隔
3.服务端关闭的socket
4.防护墙拒绝了请求
5.移动链路
移动网络下,国内是有5分钟后就回收信令,也就是IM产品,如果心跳>5分钟后服务器再给客户端发消息,就会收到rst。也要查移动网络下保持< 5min心跳
1、过滤http握手的空报文
使用wireshark打开pcap包,通过条件过滤数据长度为0的包,命令如下:
tcp.len > 0
2、过滤重复数据包
使用cmd命令窗口,进入wireshark安装目录,找到editcap.exe程序。执行editcap.exe -d命令,指定源文件(d:\input.pcap)和目标文件(d:\output.pcap),命令如下:
C:\Program Files\Wireshark>editcap.exe -d d:\input.pcap d:\output.pcap
3、过滤TCP重传数据包
使用wireshark打开pcap包,通过条件过滤tcp.analysis.retransmission的包,命令如下:
http && !(tcp.analysis.retransmission)
4、过滤TCP解析错误数据包
使用wireshark打开pcap包,通过条件过滤TCP重传,乱序,丢包,重复响应的包,命令如下:
tcp.analysis.flags && !tcp.analysis.window_update
5、常规过滤
过滤源ip、目的ip
ip.dst==192.168.101.8 #查找目的地址为192.168.101.8的包
ip.src==1.1.1.1 #查找源地址为1.1.1.1 的包
端口过滤
tcp.port==80 #把源端口和目的端口为80的都过滤出来
tcp.dstport==80 #只过滤目的端口为80的
tcp.srcport==80 #只过滤源端口为80的包
协议过滤
arp #ARP协议
icmp || icmpv6 #ICMP协议
smb || nbss || nbns || nbipx || ipxsap || netbios #Server Message Block类协议
http || tcp.port == 80 || http2 #HTTP协议,这是很简陋的识别方法
tcp.flags & 0x02 || tcp.flags.fin == 1 #TCP连接的起始和关闭报文
hsrp || eigrp || ospf || bgp || cdp || vrrp || carp || gvrp || igmp || ismp #路由类协议
eth.fcs_bad==1 || ip.checksum_bad==1 || tcp.checksum_bad==1 || udp.checksum_bad==1 || sctp.checksum_bad==1 || mstp.checksum_bad==1 || cdp.checksum_bad==1 || edp.checksum_bad==1 || wlan.fcs_bad==1 #条件中的各类协议的checksum异常
! ip.dst == 224.0.0.0/4 && ip.ttl < 5 && !pim) || (ip.dst == 224.0.0.0/24 && ip.dst != 224.0.0.251 && ip.ttl != 1 && !(vrrp || carp) #TTL异常报文
tcp.flags.reset eq 1 #TCP流被RESET报文
icmp.type eq 3 || icmp.type eq 4 || icmp.type eq 5 || icmp.type eq 11 || icmpv6.type eq 1 || icmpv6.type eq 2 || icmpv6.type eq 3 || icmpv6.type eq
4 #ICMP协议错误,协议的type字段值错误报文
http模式过滤
http.request.method=="GET" #过滤get请求的包
http.request.method=="POST" #过滤post请求的包
两个过滤条件连接符and的使用
ip.src==192.168.101.8 and http #过滤ip为192.168.101.8并且为http协议