在我们处理的所有的上网问题可以归结为以下两种:
(1) 丢包
(2) socket 连接中断
本文重点,本文主要通过以下几方面教会你如何应对网络问题:
(1)连接中断中主动断开与异常断开如何区分;
(2)RST是什么;
(3)如何应对RST问题;
(4)有什么方法可以排查RST问题;
一、如何区分TCP连接是主动断开还是异常断开
主动断开:active RST,根据协议来看,如果断开一个预期的TCP连接,RST seq会使用ack的seq填充到RST-ack字段中,如下截图
RST对应发起位置如下:
根据代码的实现,总结以下几种情况会触发主动RST:
(1)数据还没有READ完,但是主动调用了tcp close;
(2)调用close的时候,通过setsockopt设置了SOCK_LINGER字段,
(3)低内存场景,系统内存不够TCP包使用,如果发生内存问题在kernel log中可以看