如果你喜欢小编往期内容,关注一下小编公众号 – 微信公众号,或者私信回复"802.11"获取Wi-Fi学习方法和资料,也可以和小编交流一下经验~
本章开篇之前,我们先介绍下经典的网络协议体系架构,不管是7层架构还是5层架构,传输层都必不可少,其中最终的两个协议代表就是TCP&UDP,在应用上网过程中,所有的数据包都会经过这两种形式的传输,例如浏览器页面刷新会通过TCP连接收发数据,音视频流会通过UDP进行传输,而我们在实际上网过程中,所有的上网问题可以归结为两种:
(1)丢包;
(2)socket连接中断;
图片
本文重点,本文主要通过以下几方面教会你如何应对网络问题:
(1)连接中断中主动断开与异常断开如何区分;
(2)RST是什么;
(3)如何应对RST问题;
(4)有什么方法可以排查RST问题
接下来带着问题开始整理笔记;
一、如何区分TCP连接是主动断开还是异常断开
主动断开:active RST,根据协议来看,如果断开一个预期的TCP连接,RST seq会使用ack的seq填充到RST-ack字段中,如下截图:
图片
RST对应发起位置如下:
图片
函数内部调用逻辑如下:
tcp_send_active_reset()
-> skb = alloc_skb(MAX_TCP_HEADER, priority);
-> tcp_init_nondata_skb(skb, tcp_acceptable_seq(sk), TCPHDR_ACK | TCPHDR_RST);
-> tcp_transmit_skb()
根据代码的实现,总结以下几种情况会触发主动RST:
(1)数据还没有READ完,但是主动调用了tcp close;
(2)调用close的时候,通过setsockopt设置了SOCK_LINGER字段,
(3)低内存场景,系统内存不够TCP包使用,如果发生内存问题在kernel log中可以看到如下关键字:
too many orphaned sockets
out of memory – consider tuning tcp_mem
在debug时,可以通过调整如下参数扩大内存:
XXX:/proc/sys/net/ipv4 # cat tcp_mem
181779 242375 363558
//案例
echo 3196000> /sys/devices/system/