tcp丢包的排查

news2025/1/20 5:51:35

丢包的排查:

     参考资料:1https://blog.csdn.net/maimang1001/article/details/121786580

              2https://blog.csdn.net/m0_67645544/article/details/124574099

1、 网卡丢包

a)   ifconfig

 

b)   查看网卡丢包统计(虚拟机看不到网卡信息)ethtool –S eth0

  

网卡(NIC)读取到数据帧后,写入网卡内部的数据缓冲区(Ring Buffer),再生成中断,触发内核从Ring Buffer中读取数据,如果该数据缓冲区不够用,新来的包就会被丢弃,上述两图中就会有显示。

 

查看eth0网卡Ring Buffer最大值和当前设置

              ethtool –g eth0

修改Ring Buffer大小

              ethtool –G eth0 rx 4096 tx 4096

2、 netdev_max_backlog溢出

netdev_max_backlog 是内核从NIC(网卡)收到包后,交由协议栈处理之前的缓冲队列。每个CPU核都有一个backlog队列,当这个队列不够用溢出时,数据包将被丢弃。

cat /proc/net/softnet_stat 查看是否发生了netdev_max_backlog溢出,其中:    每一行代表每一个CPU核的状态统计,

第一列代表中断处理程序收到的包总数,

第二列即代表由于 netdev_max_backlog 队列溢出而被丢弃的包总数

netdev_max_backlog 的默认值是 1000,修改大小方法为:

/etc/sysctl.conf里加上net.core.netdev_max_backlog=2000

再执行sysctl –p

3、 路由丢包

netsata –s|grep route 查看路由丢包

ip r 命令查看ip对应路由表

rp_filter反向路由过滤丢包:反向路由过滤机制是Linux通过反向路由查询,检查收到的数据包源IP是否可路由(Loose mode)、是否最佳路由(Strict mode),如果没有通过验证,则丢弃数据包,设计的目的是防范IP地址欺骗攻击。

rp_filter 提供三种模式供配置:

              0 - 不验证

              1 - RFC3704定义的严格模式:对每个收到的数据包,查询反向路由,如果数据包入口和反向路由出口不一致,则不通过

              2 - RFC3704定义的松散模式:对每个收到的数据包,查询反向路由,如果任何接口都不可达,则不通过

可通过修改/proc/sys/net/ipv4/conf/eth0/rp_filter值配置此项

4、 防火墙拦截

检查是否是防火墙引起的丢包, 可以停掉iptables和firewalld, 查看命令systemctl status iptables.service / systemctl status firewalld.service

停止命令 systemctl stop iptables.service / systemctl stop firewalld.service

5、连接跟踪表溢出

kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并把每条记录保存到 table 里(这个 table 在内存里,可以通过 /proc/net/ip_conntrack 查看当前已经记录的总数),如果网络状况繁忙,比如高连接,高并发连接等会导致逐步占用这个 table 可用空间,一般这个 table 很大不容易占满并且可以自己清理,table 的记录会一直呆在 table 里占用空间直到源 IP 发一个 RST 包,但是如果出现被攻击、错误的网络配置、有问题的路由/路由器、有问题的网卡等情况的时候,就会导致源 IP 发的这个 RST 包收不到,这样就积累在 table 里,越积累越多直到占满。无论,哪种情况导致table变满,满了以后就会丢包,出现外部无法连接服务器的情况。内核会报如下错误信息:kernel: ip_conntrack: table full, dropping packet;

查看当前连接跟踪数 :

cat /proc/sys/net/netfilter/nf_conntrack_max

修改如下值:

net.netfilter.nf_conntrack_max = 262144 #可以增大跟踪的条数

net.netfilter.nf_conntrack_tcp_timeout_established = 432000 #减小跟踪有效时间

6、 tcp连接跟踪安全检查

丢包原因:由于连接没有断开,但服务端或者client之前出现过发包异常等情况(报文没有经过连接跟踪模块更新窗口计数),没有更新合法的 window 范围,导致后续报文安全检查被丢包;协议栈用 nf_conntrack_tcp_be_liberal 来控制这个选项,默认是1-不开启:

  • 1:关闭,只有不在tcp窗口内的rst包被标志为无效;
  • 0:开启; 所有不在tcp窗口中的包都被标志为无效;

7、 系统网络内存不足

系统内存不足,创建新分片队列失败,netstat -s |grep reassembles查看是否丢包

增大系统网络内存修改项:

net.core.rmem_default

net.core.rmem_max

net.core.wmem_default

8、 TIME_WAIT过多

服务端在高并发的情况, 主动关闭连接, 会出现大量的socket处于timewait状态,timewait数目超过tcp_max_tw_buckets(默认是65536)值后,新来的连接直接进入close状态。

解决方法:

a、tw_reuse,tw_recycle 必须在客户端和服务端 timestamps 开启时才管用(默认打开)

    b、tw_reuse 只对客户端起作用,开启后客户端在1s内回收;

c、tw_recycle 对客户端和服务器同时起作用,开启后在 3.5*RTO 内回收,RTO 200ms~ 120s具体时间视网络状况。内网状况比 tw_reuse 稍快,公网尤其移动网络大多要比 tw_reuse 慢,优点就是能够回收服务端的 TIME_WAIT 数量;在服务端,如果网络路径会经过NAT节点,不要启用 net.ipv4.tcp_tw_recycle,会导致时间戳混乱,引起其他丢包问题;

d、调整 tcp_max_tw_buckets 大小

9、时间戳异常

    服务端开启快速回收机制后, net.ipv4.tcp_tw_recycle为1(前提tcp_timestamps为1),NAT环境里的多个客户端连接服务端时, 因为时间戳校验导致会导致SYN包被丢弃。通过命令netstat –s|grep rejects查看确认丢包。

    tcp_timestamps开启后,linux内核会开启 PAWS 机制。PAWS是为了防止TCP序列号绕回,会维护最近一次收到数据包的时间戳(Recent TSval),如果接下来的数据包时间戳小于这个,即不是递增的时间戳,就会直接丢弃这个数据包。这种情况下是用「IP + 端口」四元组区分连接。

    而开启timewait快速回收后,PAWS检查是针对IP做区分,这样同一个NAT环境里的不同客户端连接都会被检查同一时间戳

10tcp全连接队列长度不够

    tcp连接,linux内核维护一个半队列和一个全连接队列,

半连接队列中存放等待完成3次握手的连接,这些连接的状态为Syn_RECV ,该队列长度为max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog)

全连接队列存放完成3次握手等待accpet的连接,此时的状态已经是ESTABLISHED,这个队列的长度min(backlog, somaxconn),backlog 的值则应该是由 int listen(int sockfd, int backlog) 中的第二个参数指定,somaxconn由net.core.somaxconn决定

可以通过命令netstat –s|grep listen 查看是否丢包

写文章-CSDN创作中心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【论文阅读】CatSQL: Towards Real World Natural Language to SQL Applications

【论文阅读】CatSQL: Towards Real World Natural Language to SQL Applications 文章目录 【论文阅读】CatSQL: Towards Real World Natural Language to SQL Applications1. 来源2. 介绍3. 方法介绍3.1 CatSQL模板3.2 CatSQL 查询生成3.2.1 GraPPa嵌入网络3.2.2 使用CAT解码器…

Keil Debug 逻辑分析仪使用

Keil Debug 逻辑分析仪使用 基础配置 更改对应的bebug窗口参数 两边的 Dialog DLL 更改为:DARMSTM.DLL两边的 Parameter (这里的根据单片机型号更改)更改为:-pSTM32F103VE 选择左边的 Use Simulator 选项。 打开Debug和其中的逻…

安卓基础巩固(二):四大组件:Activity、Service、Broadcast、Content Provider

文章目录 Activity生命周期onCreate和onStart的区别onPause和onStop的区别生命周期的变化 Activity的启动IntentBundle Activity携带参数返回Activity启动模式任务(task),返回栈(back stack)Activity的四种启动模式sta…

CHB-麻省理工学院头皮脑电图数据库

数据库介绍 该数据库在波士顿儿童医院收集,包括患有顽固性癫痫发作的儿科受试者的脑电图记录。受试者在停用抗癫痫药物后被监测长达几天,以表征他们的癫痫发作并评估他们手术干预的候选资格。 数据库链接:https://physionet.org/content/chb…

Vue中的Ajax

目录: 1. Vue脚手架配置代理2.GitHub用户搜索案例3.vue-resource4.slot插槽 1.Vue脚手架配置代理 vue脚手架配置代理服务器: 方法一:在vue.config.js中添加如下配置: devServer:{proxy:"http://localhost:5000" …

sqlmap结合dnslog快速注入

目录 修改数据库secure_file_priv的属性值 配置dns服务器 sqlmap结合dnslog注入 实验环境: 攻击机:kail(ip:192.168.125.212) dns服务器:win server_2008 r2(ip:192.168.125.191&…

使用rollup打包vue3+ts+vite组件并发布至npm

创建项目(我使用的是yarn) 使用vite创建vue3ts项目,这里不演示,自行创建 创建打包区域 src下创建rollup文件夹;cmd控制台进入至rollup;执行yarn --init,根据自己需求生成package.json文件&…

KY222 打印日期

1.题目&#xff1a; 2.分析&#xff1a; 见代码。 3.我的代码&#xff1a; #include <iostream> using namespace std;class Date { public:Date(int year 1): _year(year) {}inline int GetMonthDay(int year, int month) {static int arr[13] { 0, 31, 28, 31, 3…

CE做业(6)

1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 &#xff08;1&#xff09;剩余空间 取出剩余空间 &#xff08;1&#xff09;剩余空间 &#xff08;2&#xff09;判断是否<20 #…

自动化测试 selenium

目录 一、了解自动化测试和selenium 1. 什么是自动化测试&#xff1f;为什么要使用自动化测试&#xff1f; 2. 为什么使用selenium&#xff1f; 3. 环境部署 4. 什么是驱动&#xff1f;驱动的工作原理 5. selenium 的依赖代码 二、selenium 的基础语法 1. 元素的定位 …

二叉树的序列化(serialization)与反序列化(de-serialization)

目录 1. 概要 2. 用一维数组表示二叉树 3. python实现 3.1 二叉树节点的表示 3.2 串行化的python实现 3.3 反串行化的python实现 3.4 测试 1. 概要 本文简要介绍二叉树的序列化处理和反序列化处理及对应的python实现。 二叉树通常为了方便而以一维数组&#xff08;比如…

mysql 库的操作

文章目录 mysql 库的操作1. 创建数据库创建数据库案例 2. 字符集和校验规则查看系统默认的字符集合校验规则查看数据库支持的字符集查看数据库支持的字符集较验规则校验规则对数据库的影响 3. 操作数据库查看数据库显示创建语句修改数据库删除数据库查看数据库连接情况 mysql 库…

强化学习:值迭代和策略迭代

值迭代 通过上一章的学习&#xff0c;我们知道了贝尔曼最优方程的求解实际上分两部分&#xff0c;一是给定一个初始值 v k v_k vk​ 找到最优策略 π k 1 π_{k1} πk1​ &#xff0c;二是更新 v k 1 v_{k1} vk1​   下面&#xff0c;我们将详细剖析这个算法&#xff0…

Java字节流battle字符流

目录 Java字节流&#xff08;Byte Stream&#xff09; FileInputStream和FileOutputStream Java字符流&#xff08;Character Stream&#xff09; FileReader和FileWriter 如何在使用是区分什么时候用输出什么时候用输入 Write方法 close方法 Java中的close方法本身抛出…

基本定时器工作模式

计数和定时 BasicTimer支持8位或16位向上计数模式。当计数值大于等于比较寄存器&#xff08;CMPH、CMPL&#xff09;&#xff0c;会产生计数中断标志&#xff0c;并从自动重载寄存器&#xff08;LOADH、LOADL&#xff09;加载新的比较值。这样可以实时调整每个计数周期的计数长…

python自动化测试-最常用的自动化测试框架

在开始学习python自动化测试之前&#xff0c;先了解目前市场上的自动化测试框架有哪些&#xff1f; 随着技术的不断迭代更新&#xff0c;优胜劣汰也同样发展下来。从一开始工具型自动化&#xff0c;到现在的框架型&#xff1b;从一开始的能用&#xff0c;到现在的不仅能用&…

Qt6.5 grpc组件使用 + golang grpc server示例

1. 资料 1) Protobuf 开发文档 https://protobuf.dev/ 2) protobuf安装指南 https://grpc.io/docs/protoc-installation/ 3) protoc 下载 https://github.com/protocolbuffers/protobuf/releases/tag/v23.1 2. Qt grpc 组件 & 工具 1) Qt6.5 安装目录下 xx\Qt\6.5.…

实验7 多用户界面、菜单以及对话框程序设计

实验内容 1.设计一个具有两个页面的程序&#xff0c;第一个页面显示一张封面的图片&#xff0c;第二个页面显示“欢迎进入本系统”,这两个页面之间能相互切换。    2.设计一个具有3个选项的菜单程序&#xff0c;当单击每个选项时&#xff0c;分别跳转到3个不同的页面。 3.设…

快速搭建一个 Kubernetes+Crane 环境,以及如何基于 Crane 优化你的集群和应用初体验

文章目录 一、活动介绍二、环境搭建三、安装本地的 Kind 集群和 Crane 组件四、界面截图五、主要功能六、整体架构七、Crane的优势八、总结参考文献 一、活动介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目&#xff0c;遵循 FinOps 标准&#xff0c;…

零基础如何入门网络安全?一般人还真不行

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…