Wireshark抓包分析TCP重传

1.Wireshark抓包分析


tcpdump先抓包,然后用wireshark或者tshark分析

tcpdump使用

两端同时抓包分析,更方便定位问题
tcpdump  -i eth0 host 100.69.xxx or 100.70.xxx and dst portrange 90-93  and tcp -s200 -B 409600 -n -tt  -X -w xxx.pcap

tcpdump -n  -i  eth0 -tt  'tcp[tcpflags] & tcp-rst != 0' -w xxx.pcap

wireshark使用:Tcpdump、Wireshark学习

tshark使用

抓包分析过滤

将Seq和Ack的初始值都置成0,即用“相对值”来代替“真实值”。可以在 Edit -> Preferences -> Protocols -> TCP 菜单中勾上Relative Sequence Numbers来启用
新版:右键Edit -> Protocol Preferences -> 勾上Relative Sequence Numbers 

TCP包中的“win=”代表接收窗口的大小,即表示这个包的发送方当前还有多少缓存区可以接收数据。当Wireshark在一个包中发现“win=0”时,就会给它打上“TCP zerowindow”的标志,表示缓存区已满,不能再接受数据了。

Wireshark 提示的[TCP window Full]和[TCP zerowindow]意义不同, 但是有很多人会混淆。前者表示这个包的发送方意识到“在途字节数”已经达到对方所声明的接收窗口,不能再发了;而后者表示这个包的发送方意识到自己的缓存区已经满了,无法接收更多数据。

查看自己接收缓冲区是否满
tcp.analysis.zero_window

查看对方缓冲区是否满
tcp.analysis.window_full

过滤重传数据包:
tcp.analysis.retransmission
tcp.analysis.fast_retransmission

wireshark把第一次重传包分类为out of order 类型,可以通过tcp.analysis.out_of_order过滤,如果第二次重传,分类为fast retransmission

过滤出包,再用Follow TCP Streamy就可以把失败过程显示出来

过滤出所有超过200毫秒的tcp连接确认
tcp.analysis.ack_rtt > 0.2 and tcp.len ==0

frame.number >= 10 && frame.number < 15

tcp.seq = xxx

握手请求被对方拒绝
(tcp.flags.reset == 1) && (tcp.seq == 1)

过滤出重传的握手请求
(tcp.flags.syn == 1) && (tcp.analysis.retransmission)

查看SYN总数量的统计:Analyze -> Expert Info -> Chats

tshrak分析tcp重传:
tshark -n -q -r <file_name> -z io,stat,0,tcp.analysis.retransmission,"tcp.analysis. retransmission and ip.src==<IP_A>","tcp.analysis.retransmission and ip.src==<IP_B>"

tshark -n -q -r chegva.pcap -z io,stat,0,tcp.analysis.retransmission,"tcp.analysis.retransmission and ip.src==100.70.11.11 and ip.dst==100.69.11.11","tcp.analysis.retransmission and ip.src==100.69.11.11 and ip.dst==100.70.11.11"
	
shark -n -q -r chegva.pcap -z io,stat,0,tcp.analysis.ack_rtt,"MAX(tcp.analysis.ack_rtt)tcp.analysis.ack_rtt and ip.src==100.70.11.11 and ip.dst==100.69.11.11","MAX(tcp.analysis.ack_rtt)tcp.analysis.ack_rtt and ip.src==100.69.11.11 and ip.dst==100.70.11.11","AVG(tcp.analysis.ack_rtt)tcp.analysis.ack_rtt and ip.src==100.70.11.11 and ip.dst==100.69.11.11","AVG(tcp.analysis.ack_rtt)tcp.analysis.ack_rtt and ip.src==100.69.11.11 and ip.dst==100.70.11.11"

tshark -n -q -r chegva.pcap -z io,stat,0,tcp.analysis.ack_rtt,"tcp.analysis.ack_rtt > 0.06 and tcp.analysis.ack_rtt < 0.12 and ip.src==100.70.11.11 and ip.dst==100.69.11.11","tcp.analysis.ack_rtt > 0.06 and tcp.analysis.ack_rtt < 0.12 and ip.src==100.69.11.11 and ip.dst==100.70.11.11"

当你不知道某个特征所对应的 tshark 命令是什么的时候,可以尝试从 Wireshark中把它找出来,然后右键点击该特征,选择“Prepare a filter” -> “Selected”, 就可以在过滤栏生成表达式

ss查看tcp内部连接情况: ss -eipnt  xxx

添加rto:
ip route add 10.10.10.10/32 via 172.16.1.1 rto_min 20

修改rto:
ip route change 10.10.0.0/16 dev eth0 rto_min 60
ip route change 10.10.0.0/16 via 10.20.10.1 dev eth0 rto_min 60ms

Wireshark抓包分析TCP重传Wireshark抓包分析TCP重传Wireshark抓包分析TCP重传

2. Wireshark界面的操作分析


三板斧之一:查看统计、属性信息

【统计->捕获文件属性】 Statistics -> Summary,新版wireshark:Statistics -> Capture File Properties

查看文件属性信息,如平均速度、包大小、包数等等,判断流量高低峰、是否过载

三板斧之二:查看分析专家信息

【分析->专家信息】 Wireshark ->Analyze -> Expert Infos -> Notes,新版:Wireshark ->Analyze -> Expert information

查看抓包的统计信息,查看是否有Notes、Warnings、errors之类的信息,看看是否有相关警告和错误,判断网络质量、重传乱序等

三板斧之三:查看服务响应时间

【统计->服务响应时间】 statistics -> Service Response Time -> xxxxx(如:ONC-RPC -> Program:NFS)

查看各项操作的服务响应时间,判断是否过载

将seq使用相对值来替代真实值

Edit->Preferences->Protocols->TCP,勾选 Relative Sequence Numbers

启用之前就是相对值了。

查看TCP StreamGraph

Statistics -> TCP StreamGraph -> TCP Sequence Graph(Stevens)

查看数据传输情况,如传输的是否均匀、是否有TCP Zero Windows之类的

3. Wireshark字段含义&提示信息


字段含义就是wireshark的一些提示信息,也就是wireshark抓包的一些info信息,这些提示信息都是Info这一栏中体现。

1. [Packer size limited during caputre]

如果某个包被标记提示[Packer size limited during caputre],说明这个包没有抓全,可以进一步查看下面的frame信息。一般这个情况是抓包的姿势不对。某些操作系统中,tcpdump默认只抓取每个帧的前96个字节,因此tcpdump抓包的时候,可以通过 -s参数指定要抓取的字节数

2. [TCP ACKed unseen segment]

如果wireshark发现被Ack的那个包没有抓到,就会提示[TCP ACKed unseen segment],不过这个提示大部分情况都可以忽略。因为大都情况下,刚开始抓包的时候,都是只抓到了后面的Ack而没有抓到前面的ACK

3. [TCP Previous segment not captured]

TCP数据传输中,除了三次握手和四次握手之外,同一台机器发出的数据段应该是连续的,即后一个包的Seq等于前一个包的Seq+Len,正确情况都应该是这样;如果发现后一个包的Seq大于前一个包的Seq+Len,那么就说明中间丢了一段数据,如果丢失的数据在整个网络包中都找不到,wireshark就会提示[TCP Previous segment not captured]

出现这种情况的两个可能性:

  • 数据包真的丢了

  • 数据包并没有真丢,只是抓包工具漏掉了

    • 如果确认Ack包中包含了没有抓到的包,那就是抓包工具漏掉了,否则就是真丢了

4. [TCP Out-of-Order]

TCP数据传输中,除了三次握手和四次握手之外,同一台机器发出的数据段应该是连续的,即后一个包的Seq等于前一个包的Seq+Len,正确情况都应该是这样;或者说后一个包的Seq应该会大于等于前一个包的Seq+Len,如果wireshark发现后一个包的Seq小于前一个包的Seq+Len,那么就认为是乱序了,就会提示[TCP Out-of-Order]

一般而言,小跨度的乱序影响不大,如果是大跨度的乱序则会导致快速重传。举例如下,如果一个包的顺序是1、2、3、4、5被打乱成2、1、3、4、5则属于小跨度乱序,影响不大;如果被打乱成2、3、4、5、1,则会触发足够多的Dup ACK,从而导致1号包的重传。

5. [TCP Dup ACK]

当乱序或者丢包发生时,接收方就会收到一些Seq号比期望值大的包,TCP协议每收到一个这种包就会ACK一次期望的Seq值,通过这个方式告知发送方,因此就产生了一些重复的Ack。Wireshark抓到这些重复的Ack就会提示[TCP Dup ACK].

6. [TCP Fast Retransmission]

当发送方连续收到3个或者以上[TCP Dup ACK]时,就意识到之前发的包可能丢了,于是根据RFC的规定就会开始快速重传。[TCP Dup ACK]是接收方回应给发送方的,因此发送方就能够感知到并当连续收到3个以上的时候就开启快速重传。

快重传算法规定,发送方只要一连收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计数器时间到期。

7. [TCP Retransmission]

如果一个包真的丢了,又没有后续包可以在接收方触发[Dup Ack],那么就不会开启快速重传,这种情况发送方只能等到超时后再发送重传,超时重传的包就会被wireshark标记并提示[TCP Retransmission]

TCP 超时与重传应该是 TCP 最复杂的部分之一,超时重传是 TCP 保证可靠传输的基础。当 TCP 在发送数据时,数据和 ack 都有可能会丢失,因此,TCP 通过在发送时设置一个定时器来解决这种问题。如果定时器溢出还没有收到确认,它就重传数据。关键之处就在于超时和重传的策略,需要考虑两方面:

  • 超时时间设置

  • 重传的频率(次数)

在 Linux 较高的内核版本中,比如 3.15 中,已经有了至少 9 个定时器:超时重传定时器,持续定时器,ER延迟定时器,PTO定时器,ACK延迟定时器,SYNACK定时器,保活定时器,FIN_WAIT2定时器,TIME_WAIT定时器。

8. [TCP zerowindow]

TCP包中“win=xxx”代表接收窗口的大小,表示这个包的发送方当前还有多少缓冲区可以接受数据。当wireshark发行一个包中的“win=0”时,就会标记提示[TCP zerowindow],表示缓冲区已经满了,无法再接收数据了。

一般的,在缓冲区满之前,窗口大小应该是逐渐减小的过程。

9. [TCP window Full]

如果一个包的发送方已经把对方所声明的接收窗口大小耗尽了,就会被wireshark标记为[TCP window Full]。比如某一端在握手时声明自己的接收窗口只有65535,也就意味着对端最多只能给他发送65535字节的数据而无需确认,即“在途字节数”最多只能是65535,当wireshark计算出对端已经有65535字节未被确认时,就会发生这个提示。

[TCP window Full]和上面的[TCP zerowindow]比较容易混淆,前者表示这个包的发送方暂时没有办法再发送数据了;后者表示这个包的发送方没有办法再接收数据了;两者都会意味着要暂停数据传输

10. [TCP segment of reassembled PDU]

只有在Edit->Preferences->Protocols->TCP菜单里启用了Allow sub dissector to reassemble TCP streams后,才有可能收到这个提示。这个表示可以把属于同一个应用层PDU的TCP包虚拟的集中起来

11. [Continuation to #]

只有在Edit->Preferences->Protocols->TCP菜单里关闭了Allow sub dissector to reassemble TCP streams后,才有可能收到这个提示。

12. [Time-to-live-exceeded(Fragment reasembly time execeeded)]

(Fragment reasembly time execeeded)表示这个包的发送方之前收到了一些分片,但是由于某些原因导致迟迟无法组装起来。

比如传输过程中有一些分片被丢包了,那么接收方就无法组装起来,然后就通过这个ICMP的方式告知发送方

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

作者:吴德宝AllenWu链接:https://juejin.im/post/5be52e68e51d453b6e027ea2


有以下情况会发送RST包

1.connect一个不存在的端口;

2.向一个已经关掉的连接send数据;

3.向一个已经崩溃的对端发送数据(连接之前已经被建立);

4.close(sockfd)时,直接丢弃接收缓冲区未读取的数据,并给对方发一个RST。这个是由SO_LINGER选项来控制的;

5.a重启,收到b的保活探针,a发rst,通知b。

TCP socket在任何状态下,只要收到RST包,即可进入CLOSED初始状态。

原文链接:https://blog.csdn.net/yusiguyuan/article/details/21446309


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/3572.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注