抓包发现tcp会话中老是出现重复的ack和大量的tcp重传——SACK(Selective Acknowledgment, 选择性确认)技术
最近在学习wireshark 看到一个挺有用的一个知识点,我的云服务器到我的客户机哪里总是出现tcp重传的问题,而且数量还挺大,又有带宽足够大所
最近在学习wireshark 看到一个挺有用的一个知识点,我的云服务器到我的客户机哪里总是出现tcp重传的问题,而且数量还挺大,又有带宽足够大所以业务上面看起来并没有感到什么异常情况,但是随着业务流量的逐渐增大,渐渐的这个问题见开始明显了,出现了卡慢的情况,通过wireshark抓包的时候发现,一个传输文件的会话中数据包的顺序有点乱,一般情况下客户端连续发送1,2,3,4,5,6,7,8个数据包的时候到达服务器的顺序也是1,2,3,4,5,6,7,8。但是由于公网的不可确定可能会有网络拥塞等等的情况, 因此会导致数据包乱序从而服务器收到的数据包顺序可能为1,3,2,4,5,7,6,8 这样的话数据包就会错乱,如果数据包的顺序在连续3个以上(例如:1,6,4,8,2,3,7,5)这样的话服务器就会告诉客户端我没有正常收到2号包服务器返回的ack就会有多次的发送,客户端一看受到这么多的ack都在催促我发送2好包就会以为这个包丢了,之后客户端就会产生tcp的重传机制。但实际上服务器在多等一会就可以确认数据包都已经收到了,这样就不用让客户机在重传了。这种情况在流量小的情况下还好问题并不明显,但是当有好几个人或者传送一个数据非常大的数据包的时候,情况就不这么乐观了,大量的tcp重传会导致白白占用你的网络资源。。。。
那么这个问题该怎么解决呢?
答案:SACK(Selective Acknowledgment, 选择性确认)技术
TCP_sack开启
#vim /etc/sysctl.conf
net.ipv4.tcp_sack = 1
#sysctl -p
SACK(Selective Acknowledgment, 选择性确认)技术,使TCP只重新发送丢失的包,不用发送后续所有的包,而且提供相应机制使接收方能告诉发送方哪些数据丢失,哪些数据重发了,哪些数 据已经提前收到等。