wireshark网络分析笔记

原址

本文是阅读《wireshark网络分析就这么简单》和《wireshark网络分析的艺术》做的一些笔记。

技巧篇

1、如只要分析ip头或tcp头,可减少每个抓包数据的大小,通过设置limit each packet to的值即可(capture->options->双击抓包网卡)

2、设置包的颜色 view —> Coloring Rules

3、edit—>preferences 在此窗口单击 protocols -> tcp。比如经常要对sequence number做加减运算,不妨选中relative sequence numbers

4、保存时选择displayed要慎重考虑,最好就保存抓取的所有包,查看的时候过滤

5、可通过ctrl+f搜索关键字,比如怀疑包中有”error”一词,选中”string”单选按钮,然后在filter中输入”error”进行搜索

6、wireshark提示 
- [packet size limited during capture] 标记这个包没有抓全 
- [tcp previous segment not captured]网络包没有抓到:一种是真的丢包了,一种是抓包工具没有抓到。看对方回复的确认ack就能判断 
- [tcp asked unseen segment] 几乎可以忽略,只抓到了后面的ack,没有抓到前面的数据包 
- [tcp out-of-order]乱序 
- [tcp dup ack]发生乱序或丢包了 
- [tcp fast retransmission] 发送方收到3个或以上tcp dup ack,进入快速重传 
- [tcp retransmission]发生丢包,又没有后续包触发dup ack 
- [tcp zerowindow] win= 表示发送方当前还有多少缓冲区可以接收数据 
- [tcp window full] 发送方已经把接收方的窗口耗尽了,不能再发送数据了 
- [tcp segment of a reassembled pdu] 这是启用了 edit—>preferences—>protocols—>tcp 菜单里的allow sub dissector to reassemble tcp streams,在最后一个包把所有的包虚拟的集中起来,方便复制整个应用层的edu (copy—>bytes—>printable text only) 
- [continuation to #]则是上面选项没启用 
- [time-to-live exceeded]未收全包 无法组装

7、查看包的详细信息中的seq/ack analysis —> bytes in flight 表示的是拥塞窗口。如处于拥塞避免阶段,则是累加一个mss;如果是慢启动阶段,那就是成倍增加。

8、性能问题分析 
- statistics->summary (查看统计信息,比如平均流量) 
- statistics->service Response Time->ONC-RPC->program:NFS Version:3—>create stat(衡量服务器性能) 
- analyze—>expert info composite (查看重传统计、连接的建立、重置统计等等) 
- statistics->tcp stream graph->tcp sequence graph (生成统计图,考虑选择时间的长度)

9、wireshark对应的命令行工具tshark,例: 
tshark -r tcpdump.log -R “ip.addr == 192.168.1.134” -w tcpdump.log.filtered 
更多见官方文档

10、查看三次握手的mac地址是否是正确的,有可能网络的拓扑结构出现问题。比如发出去的包进过网关,回来的包没有过网关。

11、tcp.analysis.ack_rtt > 0.2 and tcp.len == 0 过滤是否存在延迟包

12、握手失败一般分两种类型,要么被拒绝,要么是丢包了。 
表达式1: (tcp.flags.reset == 1) && (tcp.seq == 1) 
表达式2: (tcp.flags.syn == 1) && (tcp.analysis.retransmission)

13、包在服务器上抓的,网络上又存在延时,顺序可能跟客户端上看到的不一样。比如四次挥手协议。因此在两端抓包排查问题更好。

14、计算网络拥塞点:发生拥塞时的在途字节数即是该时刻的网络拥塞点。 
找出重传包,再根据其seq找出原始包(tcp.seq == ),根据公式:在途字节数=seq+len-ack

15、只见重传包,不见原始包,可能原因: 
- 这个包是在接收端抓的,看不到已经丢失在路上的数据包是正常的 
- 开始抓包的时候,原始包已经传完了 
- wireshark出了bug,把一个正常包标记成重传包了 
- 如果是在发送端抓的,要考虑是否启用了LSO(large segment offload);该功能对于大于mss的数据包不由tcp层分段(减少cpu功耗),转由网卡处理分包操作,在发送端抓的包则是未经分段的大包(包含丢失了的分段包,tcp.seq < 丢包的seq确认下)

16、可以用netstat命令查看当前的网络连接状态

17、留意包的ttl值,可确认包经过了多少跳。

18、 
在option字段中的window scale字段声明一个shift count,把它作为2的指数,再乘以tcp头重定义的接收窗口,就得到真正的tcp接收窗口了。 
wireshark必须要抓到三次握手,才能计算这个win值。有些时候防火墙识别不了window scale,对方也就无法获得shift count,导致严重的性能问题。


涉及的网络知识

1、了解各协议层的数据包大小 
[mac头14字节][ip头20字节][tcp头20字节][数据(mss)] 
mss:最大传输数据大小 
mtu:mss+包头(ip头+tcp头) 
如发送的数据包大于路径mtu,发生了丢包现象,查看数据包是否设置了可分片。

2、标志位 
- syn:携带这个标志的包表示正在发起连接请求。因为连接是双向的,所以建立连接时,双方都要发一个syn 
- fin:携带这个标志的包表示正在请求终止连接。因为连接是双向的,所以彻底关闭一个连接时,双方都要发一个fin 
- rst: 用于重置一个混乱的连接,或者拒绝一个无效的连接 
- seq表示包的序号 
- ack表示期待接收的下一个序列号 
- len表示数据长度,不包括tcp头

3、为什么握手需要三次而不是二次? 
比如客户发起的第一个syn请求包跑在了一条延迟严重的路径上了,迟迟没有到达服务器,客户只能当作请求丢失了,重新发送请求。由于第二次走了正确的路径,很快建立了连接。然后之前发的第一个请求包最终到达了服务器,服务器不知道是旧的无效请求,按照惯例回复了,如果只有二次握手,那这个无效的连接就建立了,而在三次握手的机制下,客户端收到服务器的回复时,知道这个连接不是自己想要的,就可以发送一个拒绝包,服务器接收这个包后,也就放弃了这个连接。

4、超时重传时拥塞窗口的变化 
超时重传图
可见,超时重传对传输性能有严重影响。一、在RTO阶段不能传数据;二、拥塞窗口的急剧减小。

5、 
当发送方收到3个或以上的重复确认(dup ack)时,意识到相应的包丢了,从而立即重传。这个过程称为快速重传。 
为什么要3个呢,因为有可能包会乱序,乱序的包也会触发重复的ack。 
快速重传对性能影响小一些,因为它没有等待时间,而且拥塞窗口减少的幅度没那么大。

6、提高网络性能方法 
- 没有拥塞时,发送窗口越大,性能越好。所以在带宽没有限制的条件下,应该尽量增大接收窗口,比如启用scale option(windows上刻参考KB224829) 
- 如果经常发生拥塞,那限制发送窗口反而能提高性能,因为即便万分之一的重传对性能的影响都很大。在很多操作系统上可以通过限制接收窗口的方法来减少发送窗口 
- sack和newreno有利于提高重传效率

接收方不时回复“tcp window=0”给发送方,导致发送方只能停下来等待。 
win这个值显示的是接收窗口,对于发送窗口没有简单的方法确定。 
发送方的发送窗口是受接收方的接收窗口的网络影响的。 
发送窗口决定一口气能发多少字节,而mss决定了这些字节要分多少个包发完。

7、 
延迟确认表示发送端收到接收端回应包时,还没有可发送的数据,则等待个200ms(比如),以便等待之后一起有数据发送。这么做时为了减少网络中的确认包,但有时也可能影响性能(比如的确没有后续要发送的数据包了)。 
nagle算法,是在没有收到确认包的时候,发送方这边一直收集小数据,等待收到确认包后就一起发送。但它也没有直接提高性能?,启用它的作用只是提高效率,减轻网络负担。

8、dns 
- a记录:从域名解析到ip地址 
- PTR记录:从ip地址解析到域名; 可用nslookup工具查看 
- SRV记录 
- CNAME记录:别名; 好处:方便修改ip

工作方式:递归查询和迭代查询。 
递归查询:一层一层询问上去,再一层一层返回 
迭代查询:一直由询问方直接一个个询问过去

9、ftp 
主动模式由ftp服务器主动发起连接请求,如果客户端的防火墙阻挡了连接请求,传输就失败了。这个时候可以使用被动模式。由客户端主动发起连接请求。

10、 
重放攻击:kdc把解密得到的时间和当前时间做对比,如果相差过大就可以判断是重放攻击。假如采用与时间无关的字符来加密,则无法避开重放攻击,这就是我们必须在域中同步所有机器时间的原因。

11、 
- tcp可以累积确认接收包 
- udp没有重传机制,如对于一个请求的多个数据包中的一个包丢了,则要重新发送整个请求的数据包。 
- tcp的分段机制可以把数据拆小封装在多个包里,避免了被网络层分片。重传tcp包的效率可比重传分片高多了。 
- tcp可以避免被发送方分片,是因为它主动把数据分成小段再交给网络层。最大的分段大小称为mss,它相当于把mtu刨去ip头和tcp头之后的大小,所以一个mss恰好能装进一个mtu中。 
- udp则没有mss的概念,拿到应用层的数据后,就打上udp头交给网络层了,如超过mtu大小,则会进行分片。而分片如果很多,接收方一直无法把这些包组装起来,就有可能耗尽内存。分片和重组都会影响性能。 
- tcp通过三次握手适配接收方的mtu;但假如路径上有个交换机的mtu比发送方和接收方都小,还是会出问题。可用ping命令检查网络环境的mtu,查看是否允许分片。

12、单个连接无法占满整个物理链路,可适当增加一些连接数来占满链路来解决。但当连接数多到足以占满整个链路时,再增加就没有意义了,甚至可能带来负面效果。 
tcp window full说明带宽没有被完全利用,应该增加发送窗口或者连接数来补充。


最后书中喜欢的一段话:

写作能强迫思考,对于真正有技术含量的东西,你会在写作过程中加深理解,从此就不会忘掉;而技术含量不高的东西,你写个开头自然会停笔,从此忘掉也无所谓。不仅技术上如此,其它学科也一样,年轻的时候阅读国学经典,每篇都让人觉得顿悟了人生。但如果试着把感受写成文章,就会发现所谓的顿悟只是一碗心灵鸡汤。