TCP/IP(一) - 看到RST可以确定TCP是异常断线?

如果你喜欢小编往期内容,关注一下小编公众号 – 微信公众号,或者私信回复"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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值