《WireShark网络分析的艺术》笔记
一个问题
某些iSCSI存储阵列在出现网络拥塞时处理不当,会严重影响VMware的读写性能。这和它们的TCP实现方式有关。
解决方式:在VMware和存储阵列上关闭延迟确认(Delayed ACK)
介绍iSCSI:
简言之,这是一种将SCSI(Small Computer System Interface)和以太网技术结合起来的新型存储技术,实现了在网络中传输SCSI的命令和数据。
延迟确认的好处
如果在延迟的过程中正好有数据要发,正好在发数据时捎带确认信息,这样就能少一些确认包,从而节省宽带。
延迟确认的坏处
丢包重传延迟确认问题。假如客户端向服务端发送了1-9这9个包,但3,4,5丢了,而6,7,8,9顺利到达服务端,从而触发了4个ACK 3,这时客户端重传3号包并到达服务端,但由于服务端开启了延迟确认,所以会延迟一段时间后发送ACK 4。同样的,ACK 5也被延迟发送,这样会造成很大的性能问题。
如何估算网络拥塞点?
发生拥塞时的在途字节数就是该时刻的网络拥塞点。
先找到重传包的第一个,再根据该重传包的Seq值找到其原始包。最后计算该原始包发送时刻的在途字节数。
有时可能找不到原始包,这可能是该包被包含在一个大包里了,原因是LSO(Large Segment Offload)。
LSO:TCP层将大于MSS的数据直接传给网卡,让网卡来负责分段工作。
由于抓包是站在CPU的视角上看的,所以我们会看到一个大包,而不是被分段后的几个小包。
TCP与UDP
UDP不能把大块数据先进行分段,所以很容易被网络层分片,丢失一个片,所有的都需要重传。这也说明了UDP是不可靠的,它缺乏一个机制来确保数据被安全送达,所以只能由应用层来负责重传。
TCP只需重传丢失的那一个包,而不是所有包。在传输过程中应用层也不用负责重传事宜。
零散知识点
- TCP SACK可以在ACK时告知那些包已经收到。
- RFC并没有规定,每一个数据包都必须有一个对应的ACK。数据接收方也可以累积一些包才对发送方ACK一次
- 愚笨窗口症(Silly Window Syndrome):数据包中数据所占比例过小(IP头、TCP头比例过大),造成浪费。
- 纳格算法:
if 有新数据需要发送
if 数据量超过MSS
立即发送
else
if 之前发出去的数据尚未确认
把新数据缓存起来,凑够MSS或等确认到达再发送
else
立即发送
- 纳格算法和延迟确认一起用会影响性能。
- RFC最多传16个用户组。解决方法:把客户端的\etc\passwd和\etc\group文件复制到服务器上,需要用带用户组的时候就自己在服务器上查询,而不理会客户端通过RPC层传过来的信息。
- wireshark的提示:TCP window Full和TCP zerowindow。前者表示这个包的发送方暂时没办法发送数据了,后者表示这个包的发送方暂时没办法再接受数据了。
- 数据接收方抓的包的顺序是规整的,但数据发送方抓的包的顺序由于网络延迟很有可能是极度错乱的。
- 在途字节数(bytes in flight):表示那些已经发送出去,但未被确认的字节。如何计算?在途字节数=Seq + Len - Ack。其中Seq和Len是来自上一个数据发送方的包,Ack是来自上一个数据接收者的包。
- 不太科学的cwnd算法(cwnd += MSS * MSS / cwnd)和LSO一起使用会导致cwnd上升过慢,影响性能。
- 尽量保证网络中每个设备的MTU保持一致。
- 巨帧在经过路由器时,如果在网络层携带了DF(Dont fragmet)标志,就被丢弃;没有,就被分片。由携带了DF标志被路由器丢弃造成的丢包,重传是完全无效的。
- 只要很少的丢包重传就足以对性能造成很大影响,当重传率超过0.1%就得采取措施了,快速重传和超时重传的影响很不一样。
- TTL初始值一般为64,每经过一次路由,TTL减一。