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
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