linux Tcp总结

Tcp连接建立时的影响因素

在Client发出SYN后,如果过了1秒 ,还没有收到Server的响应,那么就会进行第一次重传;如果经过2s的时间还没有收到Server的响应,就会进行第二次重传;一直重传tcp_syn_retries次。

对于tcp_syn_retries为3而言,总共会重传3次,也就是说从第一次发出SYN包后,会一直等待(1 + 2 + 4 + 8)秒,如果还没有收到Server的响应,connect()就会产生ETIMEOUT的错误。

Server中积压的半连接较多,也有可能是因为有些恶意的Client在进行SYN Flood攻击。典型的SYN Flood攻击如下:Client高频地向Server发SYN包,并且这个SYN包的源IP地址不停地变换,那么Server每次接收到一个新的SYN后,都会给它分配一个半连接,Server的SYNACK根据之前的SYN包找到的是错误的Client IP, 所以也就无法收到Client的ACK包,导致无法正确建立TCP连接,这就会让Server的半连接队列耗尽,无法响应正常的SYN包。

解决:通过Tcp sync cookie。Server收到SYN包时,不去分配资源来保存Client的信息,而是根据这个SYN包计算出一个Cookie值,然后将Cookie记录到SYNACK包中发送出去。对于正常的连接,该Cookies值会随着Client的ACK报文被带回来。然后Server再根据这个Cookie检查这个ACK包的合法性,如果合法,才去创建新的TCP连接

连接释放的过程

当应用程序调用close()时,会向对端发送FIN包,然后会接收ACK;对端也会调用close()来发送FIN,然后本端也会向对端回ACK,

fin_wait_2状态,等待对端close发送fin 报文,关闭连接,如果连接得不到释放的话,就会等待对方fin报文。Linux为了防止这种资源的开销,设置了这个状态的超时时间tcp_fin_timeout,默认为60s,超过这个时间后就会自动销毁该连接。实际上可以调节为2s足够。

我们再来看TIME_WAIT状态,TIME_WAIT状态存在的意义是:最后发送的这个ACK包可能会被丢弃掉或者有延迟,这样对端就会再次发送FIN包。如果不维持TIME_WAIT这个状态,那么再次收到对端的FIN包后,本端就会回一个Reset包,这可能会产生一些异常。

数据传输时可以调节的参数

拥塞控制查看方法

重传率计算:retrans = (RetransSegs-last RetransSegs) / (OutSegs-last OutSegs) * 100 

tcpdump抓包原理

warning

1.如果网络包已经被网卡丢弃了,那么tcpdump是抓不到它的

2.,比如因为发送缓冲区满而被丢弃,tcpdump同样抓不到它

轻量级追踪方式是TCP Tracepoints。

tcpdump的能力范围简单地总结为:网卡以内的问题可以交给tcpdump来处理;对于网卡以外(包括网卡上)的问题,tcpdump可能就捉襟见肘了。这个时候,你需要在对端也使用tcpdump来抓包。

后面有空可以玩一下这些工具。

  • Kprobe是一个很通用的追踪工具,在低版本内核上,你可以使用这个方法来追踪TCP重传事件;
  • Tracepoint是一个更加轻量级也更加方便的追踪TCP重传的工具,但是需要你的内核版本为4.16+;
  • 如果你想要更简单些,那你可以直接使用tcpretrans这个工具。

Tcp如何高效利用本机cpu

首先先说说收包过程,网卡以DMA方式放入ringBuffer中,软中断把skb取走,然后把新的skb挂上去。其中指针数据是预先分配好的,而skb是动态分配的。

查看ringbuffer是256

满了,就网卡丢弃了。

网络包的处理分为硬中断和软中断。

硬中断:把poll_list添加到per-cpu的softnet_data的poll_list里面。

软中断:对softnet_data的poll_list进行变量。(内核线程ksoftirqd).

同时软中断线程和硬中断线程具有核亲密性,会在同一个核上处理。

可以通过中断号看对应亲和的核。

1000 第四个CPU, cpu3

所以我们可以加大ens33的网卡队列数,并且设置队列中断号上的smp_affinity,将硬中断打散到不同的cpu上。

还可以通过top观察

还可以通过dpdk可以绕过内核协议栈,更高效的节约指令,从根源上节省和提高cpu。

关于dpdk下次有机会聊聊。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3.10安装教程

Python3.10安装 Python的安装按照下面几步进行即可,比较简单。 下载Python安装文件,打开Python的下载页面,我这里选择安装的版本是3.10.11,根据自己电脑版本选择对应安装包 安装包下载完毕后,按照步骤开始安装。选择…

微信小程序rsa加密

没有使用npm下载依赖的方式,直接引入了rsa.js文件,rsa.js文件在后面,目录结构如下: 在index.js文件引用 import { proxyInstance, backendUrl } from ../../util/request.js; import JSEncrypt from ./rsa.js const key -----BE…

数据模型/数据建模的含义

我们可以从以下四个方面来了解 (1)、业务模型 (2)、构建表关系/表链接 (3)、数学模型 (4)、算法模型 业务模型 建立业务模型的重点是懂业务,即了解业务的整个过…

探寻闲鱼SellerId加解密算法

最近一直在研究闲鱼的加密算法,无他,因为阿里的加密可以算是天花板级别的,研究和学习起来才值得。 很多人可能发现了,通过抓包得到的闲鱼数据包,sellerId等等值是加密过的。这就导致了很多人通过抓包或者协议请求得到…

qt图形化界面开发DAY2

作业: 1> 思维导图 2> 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否…

第 5 课 编写简单的发布器 Publisher

文章目录 第 5 课 编写简单的发布器 Publisher 第 5 课 编写简单的发布器 Publisher 本节以创建一个velocity_publisher.py的(发布者)节点为例进行讲解。 输入指令“roscd beginner_hiwonder”,回车。进入beginner_hiwonder软件包。 roscd…

数据结构(c)冒泡排序

本文除了最下面的代码是我写的,其余是网上抄写的。 冒泡排序 什么是冒泡排序? 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交…

JAVA开发入门

文章目录 计算机基本概念DOS常用命令JAVA语言发展史JDK下载JAVA体系与特点JDK安装JAVA环境变量配置 计算机基本概念 计算机组成原理 计算机组装 计算机:电子计算机,俗称电脑。是一种能够按照程序运行,自动、高速处理海量数据的现代化智能电子…

如何申请IP地址证书

什么是IP地址证书? IP地址证书是一种用于验证网站服务器身份的数字证书,它可以确保网站与用户之间的通信安全。与传统的域名证书不同,IP地址证书直接针对服务器的IP地址进行认证,适用于没有独立域名的网站或需要对多个域名进行统…

《优化接口设计的思路》系列:第七篇—接口限流策略

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 第六篇—接口防抖(防重复提交)的一些方式 第七篇—接口限流策略 本文参考项目源码地址&#xff…

抖音流量基础

流量是什么 五维四率 人货场 赛马机制 如何赛马 赛马机制小结 流量来源渠道 曝光进入率 停留时长 互动率 转粉率 商品点击率 商品转化率 GPM 成交密度 抖音流量推荐机制 权重决定推流的“量” 什么是权重 权重的分类 小结 权重在轻抖查看 标签决定推流的“质” 什么是标签…

【NI 国产替代】PXIe‑6378,16路AI(16位,3.5 MS/s/ch),4路AO,48路DIO,PXI多功能I/O模块

PXIe,16路AI(16位,3.5 MS/s/ch),4路AO,48路DIO,PXI多功能I/O模块 PXIe‑6378是一款同步采样的多功能DAQ设备。 该模块提供了模拟 I/O、数字I/O、四个32位计数器和模拟和数字触发。 板载NI‑STC3…

从一到无穷大 #20 TimeUnion,适用于混合云的时序数据库?是玩具还是真实可用

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言论文块存储与对象存储统一数据模型高效的内存数据结构Elastic time-partitioned …

逸学Docker【java工程师基础】2.Docker镜像容器基本操作+安装MySQL镜像运行

基础的镜像操作 在这里我们的应用程序比如redis需要构建成镜像,它作为一个Docker文件就可以进行构建,构建完以后他是在本地的,我们可以推送到镜像服务器,逆向可以拉取到上传的镜像,或者说我们可以保存为压缩包进行相互…

高级分布式系统-第9讲 实时调度--静态调度与动态调度

静态调度 在静态调度中,任务组的调度表是通过离线计算得出的。在调度表的生成过程中,必须把所有任务的资源、优先级和同步要求考虑进去,并且确保所有的截止时间要求。这个调度表指明了各个任务的运行起始时间 ,一旦生成就不再变化…

Linux:/proc/kmsg 与 /proc/sys/kernel/printk_xxx

目录 前言一、/proc/kmsg1、简介2、如何修改内核日志缓冲区3、dmesgklogctl 函数(来源于 man 手册) 4、扩展阅读 二、 /proc/sys/kernel/printk_xxx三、/dev/kmsg 前言 本篇文章将为大家介绍与 Linux 内核日志相关的一些控制文件,共同学习&am…

C语言经典算法之希尔排序算法

目录 前言 一、代码实现 二、算法的时空复杂度 时间复杂度: 空间复杂度: 前言 建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。 2.建议读者学习算法的时候,自己手动一步一步地运行算法。 tips:本算…

prometheus常用exporter

一、node-exporter node_exporter:用于监控Linux系统的指标采集器。 未在k8s集群内的linux机器监控 GitHub - prometheus/node_exporter: Exporter for machine metrics 常用指标: •CPU • 内存 • 硬盘 • 网络流量 • 文件描述符 • 系统负载 •…

黑马程序员 Java设计模式学习笔记(一)

目录 一、设计模式概述 1.1、23种设计模式有哪些? 1.2、软件设计模式的概念 1.3、学习设计模式的必要性 1.4、设计模式分类 二、UML图 2.1、类图概述 2.2、类图的作用 2.3、类图表示法 类的表示方式 类与类之间关系的表示方式 关联关系 聚合关系 组合…

记录汇川:H5U于Factory IO测试13

主程序: 子程序: IO映射 子程序: 辅助出料 子程序: 模式选择 子程序: 示教程序 子程序: 手动程序 子程序: 统计程序 子程序: 异常报警 子程序: 自动程序: F…