Wireshark——从此我就喜欢上了它,就像是学武之人得到了一把称手好剑

在之前的工作中,常常遇到一些应用层无法解决的问题;连接被中断,重置,应用层程序只报了连接超时的错,问题究竟是出在服务器端,还是边界,无从得知。用了一段时间的Wireshark抓包,终于发现一些线索。意识到Wireshark的强大之处,利用假期时间,读了《Wireshark网络分析就这么简单》受益匪浅。

我是带着看一下Wireshark怎么用参透TCP协议两个目的去阅读该书的。

​ 本以为该书是简单的使用手册,却发现更像是实战,是对问题定位的思路与排查过程的记录,非常能引起作为技术人的我的共鸣。特别是其中一章,用了深入浅出的语言讲解了TCP协议的相关知识,填补了我对这一块知识的空缺(常见的TCP协议面试题都可在这一章中找到答案)。除此之外,该书一直强行安利《TCP/IP协议卷》,激起我强烈的阅读TCP/IP协议卷一的兴趣。 摘抄了三句书中的句子,这三句足以表达看完该书之后的欣喜之情。

假如真的能遇到棘手的难题,我建议用Wireshark分析。一旦用它解决了第一个问题,恭喜你,很快就会中毒上瘾的。你可能碰到什么问题都想抓个包分析,就像小时候刚学会骑车一样,到小区门口打个酱油都要骑车去。

从此我就喜欢上了Wireshark,就像是学武之人得到了一把称手好剑。

在网络时代,有些人就算从来没有机会见面,甚至不知道年龄和种族,也可以是最好的老师。

下面知识点,是在两次阅读后,得出的心得体会,解决问题思路总结,关于TCP层知识点总结。

一、关于抓包

Wireshark界面:含列表、包头、包内容体

1、传输层协议无非TCP/UDP,我们可以从流中看出协议定义的交互过程,这是学习某种协议的最好方式,这让我联想到前几天研究RTMP协议(一种基于TCP的视频协议),也是通过抓包看到其作用过程。

2、断定问题思路、从源IP、目标IP可以看到是否是配置问题,曾经遇到的一个问题就是因为配置写错,导致数据一直写到一个错误的MQ里面去,是组里的大牛通过抓包,才一眼看到了问题。从包头,可以看到异常包信息,其中有包重置,包重传,窗口降为0等等。

3、抓包时,我们可以限制包的大小,可只抓包头,定位问题一般与包体无关,专家建议限制大小为80,解决了我之前对大文件传输包抓取的恐惧

tcpdump -Ann -s 80 host XXX.XXX.XXX.XX  

4、分析时,IP过滤,端口过滤,协议过滤

分析时:

  • 使用专家分析
    在这里插入图片描述

  • 查看响应时间统计表

  • 查看TCP流统计图

二、关于网络分层

书中讲解了网络分层,最大的感受是,OSI7层已经被丢弃了,常用TCP/IP 4层描述问题。至于这个知识点有研究过,就不再累述。
在这里插入图片描述

三、关于TCP协议

1、常见的状态字

MTU:最大传输单元

MSS:最大段长度

MTU=MSS+TCP头长度+IP头长度

Seq:表示该数据段的序号

  • TCP提供有序的传输,故需要标上一个序号

  • 增长方式:一个Seq号的大小是根据上一个数据段的Seq号和长度相加而来的

在这里插入图片描述
Len:该数据段的长度,不包括TCP头。头部本身携带信息很多,不要以为len=0就没意义

ACK:确认号,接受方向发送方确认已经收到哪些字节。TCP的响应是可以累积的

SYN:携带这个标志的包表示正在发起连接请求

FIN:携带这个标志的包表示正在请求终止连接

RST:用于重置一个混乱的链接,或拒绝一个无效的请求

2、三次握手的过程

在这里插入图片描述

客户端:“我能跟您建立链接吗?我的初始发送序号是X。如果你答应就Ack=X+1”

服务器端:“收到啦,Ack=X+1。我也想跟你建立链接。我的初始发送号是Y,你如果答应连接就Ack=Y+1”

客户端:“收到啦,Ack=Y+1”

3、四次挥手过程

客户端:“我希望断开链接(请注意FIN标志)”

服务器:“知道了,断开吧”

服务器:“我这边的链接也想断开”

客户端:“知道了,断开把”

4、滑动窗口机制

TCP窗口快递员的工作策略,快递员送快递,运输的数量有限,目标的接受容量有限,需要解决一次运输多少的问题,一口气能发送的数据量就是传说中TCP发送窗口

交互时,可以把自己的接受窗口告诉对方,过程如下:

客户端:“当前我的接受窗口是2920”

服务器:“(好,那我的发送窗口就定位2920)先给你1460字节”

服务器:“再给你1460字节。(哎呀!我的发送窗口2920用完了,不能再发了)”

客户端:“你发过来的2920字节已经处理完毕,所以现在我的接受窗口又恢复到2920”

服务器:“(好,那我的发送窗口就定位2920)先给你1460字节”

服务器:“再给你1460字节。(哎呀!我的发送窗口2920用完了,不能再发了)”

一些注意点

  • 发送窗口!=接受窗口,只会向对方申明自己的接受窗口

  • 滑动窗口机制,说的就是这两个窗口的关系

  • 假如接受方处理数据的速度跟不上接收数据的速度,缓存就会被占满,从而导致接受窗口为0 ,曾经我在抓过的包上面,看过,断定服务器负载到极限
    在这里插入图片描述

  • 我们是无法从包里看出发送窗口的大小的,且发送窗口的大小是靠严格的算法算出来的。

  • 发送窗口决定了一口气能发多少字节,而MSS决定了这些字节要分多少个包发完,在一个窗口发出n个包,不一定就能接受到n个确认包,是因为服务器端有延迟确认机制~。

  • TCP Window Scale:作用是向对方声明一个Shift count,我们把它作为2的指数,再乘以TCP头中定义的接受窗口,就得到真正的TCP接受窗口。解决了TCP头定义的接受窗口最大为65535的问题。

  • wireshark 显示的win=XXX是根据Window Scale结果计算出来的。

5、关于重传

5.1、相关概念

拥塞点:能导致网络拥塞的数据量

拥塞窗口:网络对发送窗口的限制,就是通过拥塞窗口实现的

5.2、发送窗口的变化过程

  • (1)链接刚刚建立的时候,发送方对网络状况一无所知。如果一口气发太多数据就可能遭遇拥塞,所以发送方把拥塞窗口的初始值定的很小。RFC建议是2、3、4个MSS

  • (2)如果发出去的包都得到确认,表明还没达到拥塞点,可以增大拥塞窗口。这时,发生拥塞概率低,使用2的倍数增长,这个过程称为慢启动,这个过程赠速快,但是基数低,传输速度还是比较慢

  • (3)慢启动过程持续一段时间后,拥塞窗口达到一个较大的值。这时候传输速度比较快,触碰阻塞点的概率大,减少传输速度了。RFC建议是在每个往返时间增加1个。这个过程称为拥塞避免。临界窗口取值很有讲究,需要一定的算法。
    在这里插入图片描述

5.3、超时重传

拥塞之后,发出去的包不像往常一样的到确认了,发送方等待一段时间后,还收不到,认定包丢失。这个时候称为超时重传,从发出原始包到重传改包的这段时间称为RTO
在这里插入图片描述

  • 重传之后的拥塞窗口需要调整,RFC:建议把拥塞窗口降到1,然后再次进去慢启动过程。

关于临界窗口

  • Richard Stevens:把临界窗口值定位上次发生阻塞时的发送窗口的一半。

  • RFC 5681:发生拥塞时没有被确认的数据量的1/2(更加科学)

超时重传对传输性能的严重影响:

  • RTO阶段不能传输数据

  • 拥塞窗口急剧减少

5.4、快速重传

快速重传:除丢失的包外,后续有包能正常到达。当后续的包到达接收方时,接收方会发现其Seq号比期望的大,所以它每收到一个包就Ack一次期望的Seq号,以此来提醒发送方重传。当发送方收到3个或以上重复确认(Dup Ack)时,就意识到相应的包已经丢失了,从而立即重传它。这个过程称为快速重传。之所以称为快速,是因为它不像超时重传一样需要等待一段时间。

凑满3个的原因:因为网络包有时会乱序,乱序的包一样会触发重复的Ack。由于一般乱序的距离不会相差太大,所以限定成3个或以上可以在很大程度避免因乱序而触发快速重传。
在这里插入图片描述

快速重传后拥塞窗口的调整:RFC 5681认为临界窗口值应该设为发生阻塞时还没被确认的数据量的1/2。然后将拥塞窗口设置为临时窗口值加3个MSS,继续保留在拥塞避免阶段。这个过程称为快速恢复
在这里插入图片描述

5.5、快速重传之后的策略

更复杂的情况,丢的包并不只一个。对于发送方来说,只能通过Ack2知道2号包丢失了,但并不知道还有哪些包丢失。在重传了2号包之后,接下来应该传哪一个呢?
在这里插入图片描述

  • 方案1:将3、4、5、6、7、8都重传一次(效率低,早期的协议就是这样处理的)

  • 方案2:NewReno:接受方收到重传过来的2号包之后,会回复一个Ack3,因此发送方可以推理出3号包也丢了,把它重传一遍。当接收方收到重传的3号包之后,因为丢包的窟窿都补满了,所以回复一个Ack9,从此发送方就可以传新的包(当丢包量很大的时候,就需要花费多个RTT(往返时间)来重传所有丢失的包)

  • 方案3:SACK:接收方在Ack2号包的时候,顺便把收到的包号告诉发送方。因为发送方对丢包的细节了解,在快速重传2号包之后,它可以接着传3号,然后再传9号包。

6、关于TCP的抓包结论

  • 没有拥塞时,发送窗口越大,性能越好,所以在带宽没有限制的条件下,应该尽量增大接受窗口。

  • 如果经常发生拥塞,那限制发送窗口反而能提高性能,因为即便万分之一的重传对性能的影响都很大。在很多操作系统上可以通过限制接受窗口的方法来减小发送窗口。

  • 超时重传对性能影响最大,因为有一段时间没有传输任何数据,且拥塞窗口会被设成1个MSS,所以要尽量避免超时重传。

  • 快速重传对性能的影响小一些,因为它没有等待时间,而且拥塞窗口减小的幅度没那么大。

  • SACK和NewReno有利于提高重传效率,提高传输性能。

7、与TCP相关的其他算法

丢包对极小文件的影响比大文件严重,因为读写一个小文件需要包数很少,所以丢包时往往凑不满3个DupAck,只能等待超时重传了,而大文件有较大可能触发快速重传。

7.1、延迟确认与Nagle算法

  • 延迟确认:如果收到一个包之后暂时没什么数据要发给对方,那就延迟一段时间再确认。假如在这段时间恰好有数据要发送,那确认信息和数据就可以在一个包里发出去了。

延迟确认没有直接提高性能,它只是减少了部分确认包,减轻了网络负担。有时候延迟确认反而会影响性能。

  • Nagle算法:在发出去的数据还没有被确认之前,假如又有小数据生成,那就把小数据收集起来,凑满一个MSS或者等收到确认后再发送。

Nagle算法也没有直接提高性能,启用它的作用只是提高传输效率,减轻网络负担。

7.2、对于临界窗口设置的算法

Westwood:先推算出有多少包已经被送达接受方(根据Ack来推算),从而更精确地估算发生拥塞时的带宽,最后再根据带宽来确定新的拥塞窗口。

Vegas:通过监控网络状态来调整发包速度,从而实现真正的“拥塞避免”。当网络状况良好时,数据包的RTT(往返时间)比较稳定,这时候就可以增大拥塞窗口;当网络开始繁忙时,数据包开始排队,RTT就会变大,这时候就需要减小拥塞窗口了。

Vegas像是一个谦让的君子。如果路上每位司机的车品都很好则整体交通状况良好;而如果一位车品很好的司机跟一群车品很差的司机一起开车,则可能被频繁加塞,最后成了开得最慢的一个。

四、关于UDP

1、UDP优点

  • 在UDP协议头中,只有端口号、包长度和检验码等少量信息,总共就8个字节

  • 由于UDP协议头长度还不到TCP头的一半,所以在同样大小的包里,UDP携带的净数据比TCP包多一些。

  • 由于UDP没有Seq号和Ack号等概念,无法维持一个链接,所以省去了建立链接的负担。

2、UDP缺点

  • UDP不像TCP一样在乎双方MTU的大小。它拿到应用层的数据后,直接打上UDP头就交给下一层了。在超过MTU的情况下,发送方的网络层负责分片,接受方收到分片后再组装起来,这个过程会消耗资源,降低性能。

  • UDP没有重传机制,所以丢包由应用层处理。

  • 分片机制存在弱点,会成为黑客攻击目标

五、如果需要脚本化分析包

可以使用tshark

如果这篇文章对您有帮助,我希望得到您的鼓励
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值