linux协议栈劫持,Linux系统优化之TCP协议栈优化-基本篇1

因为在做爬虫分布式系统的过程中,涉及到了一些linux系统优化方面的知识,所以来总结一下,我们会对linux的不同模块做相关的基本优化,这篇文章主要讲述的是关于tcp协议栈的参数优化。

1.机器环境

Linux EOS01 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

CentOS release 6.4 (Final)

2.具体实施

2.1 由于每台机器的文件描述符都是处于默认的1024的标准值,对于高并发的系统来说,很容易达到瓶颈,因此我们需要重定文件描述符数量,可以采用ansible对各个服务器批量设置。

vi /etc/security/limits.conf

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

2.2 关于我们对于系统tcp协议栈的参数设置

vi /etc/sysctl.conf

net.ipv4.tcp_fin_timeout=10

net.ipv4.tcp_syncookies=1

#开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接

net.ipv4.tcp_tw_reuse=1

#启用timewait 快速回收

net.ipv4.tcp_tw_recycle=1

net.ipv4.ip_local_port_range=1024 65000

net.ipv4.tcp_max_syn_backlog=8192

net.ipv4.tcp_max_tw_buckets=5000

net.ipv4.tcp_timestamps = 0

#每300秒 探测一次tcp连接是否空闲,一共探测2次,每次间隔15秒

net.ipv4.tcp_keepalive_intvl = 15

net.ipv4.tcp_keepalive_probes = 2

net.ipv4.tcp_keepalive_time = 300

然后执行 /sbin/sysctl -p 让参数生效

具体的参数含义可以参考如下:

1. fs.file-max

最大可以打开的文件描述符数量,注意是整个系统。

在服务器中,我们知道每创建一个连接,系统就会打开一个文件描述符,所以,文件描述符打开的最大数量也决定了我们的最大连接数

select在高并发情况下被取代的原因也是文件描述符打开的最大值,虽然它可以修改但一般不建议这么做,详情可见unp select部分。

2.net.ipv4.tcp_max_syn_backlog

Tcp syn队列的最大长度,在进行系统调用connect时会发生Tcp的三次握手,server内核会为Tcp维护两个队列,Syn队列和Accept队列,Syn队列是指存放完成第一次握手的连接,Accept队列是存放完成整个Tcp三次握手的连接,修改net.ipv4.tcp_max_syn_backlog使之增大可以接受更多的网络连接。

注意此参数过大可能遭遇到Syn flood攻击,即对方发送多个Syn报文端填充满Syn队列,使server无法继续接受其他连接

我们看下 man 手册上是如何说的:

The behavior of the backlog argument on TCP sockets changed with Linux 2.2. Now it specifies the queue length for com‐ pletely established sockets waiting to be accepted, instead of the number of incomplete connection requests. The maximum length of the queue for incomplete sockets can be set using /proc/sys/net/ipv4/tcp_max_syn_backlog. When syncookies are enabled there is no logical maximum length and this setting is ignored. See tcp(7) for more information. If the backlog argument is greater than the value in /proc/sys/net/core/somaxconn, then it is silently truncated to that value; the default value in this file is 128. In kernels before 2.4.25, this limit was a hard coded value, SOMAXCONN, with the value 128.

自 Linux 内核 2.2 版本以后,backlog 为已完成连接队列的最大值,未完成连接队列大小以 /proc/sys/net/ipv4/tcp_max_syn_backlog 确定,但是已连接队列大小受 SOMAXCONN 限制,为 min(backlog, SOMAXCONN)

3.net.ipv4.tcp_syncookies

修改此参数可以有效的防范上面所说的syn flood攻击

原理:在Tcp服务器收到Tcp Syn包并返回Tcp Syn+ack包时,不专门分配一个数据区,而是根据这个Syn包计算出一个cookie值。在收到Tcp ack包时,Tcp服务器在根据那个cookie值检查这个Tcp ack包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。

默认为0,1表示开启

4.net.ipv4.tcp_keepalive_time

Tcp keepalive心跳包机制,用于检测连接是否已断开,我们可以修改默认时间来间断心跳包发送的频率。

keepalive一般是服务器对客户端进行发送查看客户端是否在线,因为服务器为客户端分配一定的资源,但是Tcp 的keepalive机制很有争议,因为它们可耗费一定的带宽。

Tcp keepalive详情见Tcp/ip详解卷1 第23章

5.net.ipv4.tcp_tw_reuse

我的上一篇文章中写到了time_wait状态,大量处于time_wait状态是很浪费资源的,它们占用server的描述符等。

修改此参数,允许重用处于time_wait的socket。

默认为0,1表示开启

6.net.ipv4.tcp_tw_recycle

也是针对time_wait状态的,该参数表示快速回收处于time_wait的socket。

默认为0,1表示开启

7.net.ipv4.tcp_fin_timeout

修改time_wait状的存在时间,默认的2MSL

注意:time_wait存在且生存时间为2MSL是有原因的,见我上一篇博客为什么会有time_wait状态的存在,所以修改它有一定的风险,还是根据具体的情况来分析。

8.net.ipv4.tcp_max_tw_buckets

所允许存在time_wait状态的最大数值,超过则立刻被清楚并且警告。

9.net.ipv4.ip_local_port_range

表示对外连接的端口范围。

10.somaxconn

前面说了Syn队列的最大长度限制,somaxconn参数决定Accept队列长度,在listen函数调用时backlog参数即决定Accept队列的长度,该参数太小也会限制最大并发连接数,因为同一时间完成3次握手的连接数量太小,server处理连接速度也就越慢。服务器端调用accept函数实际上就是从已连接Accept队列中取走完成三次握手的连接。

Accept队列和Syn队列是listen函数完成创建维护的。

/proc/sys/net/core/somaxconn修改

3. 参考资料

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

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

相关文章

datapumpdir oracle_oracle_datapump创建外部表案例

一、datapump创建外部表,数据来源于内部实体表 --首先创建 scott.countries实体表,用于做实验 SQLgt; create table scott.cou一、datapump创建外部表,数据来源于内部实体表--首先创建 scott.countries实体表,用于做实验SQL> c…

linux 百度地图离线sdk,Android开放百度地图集成

1、创建应用 获取AK (我理解为Application key)通过百度账号登录百度地图开放平台,进入API控制台 http://lbsyun.baidu.com/apiconsole/key 创建自己的应用,输入应用名称 ,选择Android SDK 应用类型,选择需要的服务(默认全选) 输入…

activiti7流程设计器_基于容器和微服务应用的架构:容器设计原则

微服务提供了巨大的好处,但也带来了巨大的新挑战。在创建基于微服务的应用程序时,微服务体系结构模式是最基本的支柱。在本指南的前面,您学习了关于容器和Docker的基本概念。这是开始使用容器所需的最低信息。尽管,即使容器是微服…

opencv 图像 抠图 算法_图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting

一、序言陆陆续续的如果累计起来,我估计至少有二十来位左右的朋友加我QQ,向我咨询有关抠图方面的算法,可惜的是,我对这方面之前一直是没有研究过的。除了利用和Photoshop中的魔棒一样的技术或者Photoshop中的选区菜单中的色彩范围…

女生做产品经理好吗_女生天生就是产品经理,不服来战!

关注🔝蓝字,获取求职干货信息大家好,姗姗来迟~这个梗会不会被扣工资前两天,小米的资深产品经理Alina老师征集用户需求:关于产品经理的直播课,大家想听什么呀?姗姗一直很好奇:一个对逻…

c语言文件读写r 的作用,C语言 读写二进制文件

查找了比较多的资源, 发现没有办法把text 文件转成binary文件仅作为记录,不过这个例子可以去除换行符。#include #include #define N 255int main(){char a[N];FILE *fp1,*fp2;fp1fopen("test_seq.fa","r");fp2fopen("testSeq.…

verlay虚拟化技术_FPGA虚拟化:突破次元壁的技术

原标题:FPGA虚拟化:突破次元壁的技术来源:内容来自「老石谈芯」,作者 老石,谢谢。1利用FPGA虚拟化突破时空限制在传统的FPGA开发模型中,使用者通常使用硬件描述语言(HDL)对应用场景进行建模,然后…

tcp报文格式_34.TCP取样器

阅读文本大概需要3分钟。1、TCP取样器的作用TCP取样器作用就是通过TCP/IP协议来连接服务器,然后发送数据和接收数据。2、TCP取样器详解TCPClient classname:TCP报文格式类名,默认前缀org.apache.jmeter.protocol.tcp.sampler.① TCPClientImp…

c语言程序设计字符处理周信东,“电子科技大学出版社(周信东主编)”的C语言程序设计实验-整理代码-.doc...

“电子科技大学出版社(周信东主编)”的C语言程序设计实验-整理代码-.doc-前言-/*非常感谢度?娘以及各位?网上C语言?高手的支持?,才能让敝人?完成此文档?的整理。本文档集合?了本人、度娘、众网友的力?量,其中代码的?正确率约为?90%(不正确的有…

pythonwx功能_python中wx模块的具体使用方法

wx包中的方法都是以大写字母开头的,而这和Python的习惯是相反的。 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口。这里介绍wxPython : 根据自己的操作系统下载相应版本。 安装&am…

c语言函数的使用步骤,c语言打开文件函数使用方法

ANSI C规定文件打开用函数fopen,关闭为fclose。1、调用方式通常为:FILE *fp;fpfopen(文件名, 打开方式);2、参数说明:文件名: 形如"myfile.dat"、"F:\data\myfile.dat"等等;打开方式:"r"(只读) 为输入打开一个文本文件"w"(…

fpga如何约束走线_FPGA时序约束实战篇之多周期路径约束

多周期路径约束多周期路径,我们一般按照以下4个步骤来约束:1. 带有使能的数据首先来看带有使能的数据,在本工程中的Tming Report中,也提示了同一个时钟域之间的几个路径建立时间不满足要求其实这几个路径都是带有使能的路径&#…

uml 类图_UML-类图

概念Class diagram is UML structure diagram which shows structure of the designed system at the level of classes and interfaces, shows their features, constraints and relationships - associations, generalizations, dependencies, etc.类图是用于描述类、接口这一…

牙齿间隙变大怎么办_牙齿之间的间隙越来越大怎么办?

无论我们是否发现牙齿与牙齿之间有很大的裂缝问题,这不仅影响到面部的美观,而且对正常的饮食、咀嚼疲劳也有一定的影响。随着我国生活条件的改善,人们对生活质量的要求也越来越高,同时也开始关注自己的口腔状况,牙齿问…

python读取文件中的内容_python 读取文件夹中的文件内容

看thinking in java的时候发现有个题的答案不确定结果, 于是下载答案看下,结果是这个样子的,这样要怎么才能找到相对应的答案?于是我就着手写了一个快速遍历的脚本(我这里只是单纯的找了出来, 没有把找到的文件单独拿出…

C语言编程日志,用C语言打印日志(Log)

用C语言打印日志(Log)直接上源代码。log.h 文件:/** log.h **/#ifndef __LOG_H__#define __LOG_H__#include "stdio.h"#include "string.h"#include "stdlib.h"#include "time.h"#include "stdarg.h"#include &q…

binlog数据库不写入binlog_京东智联云MySQL数据库如何保障数据的可靠性?

MySQL作为当前最流行的关系型数据库,在各个行业的系统中扮演着最重要的角色。随着大家对数据价值认可的逐步加深,数据的可靠性是最常被问到的一个问题。MySQL是如何保证数据可靠性的?京东智联云RDS-MySQL又做了哪些优化和新特性来保证用户数据…

在职高学C语言程序设计,中职学校C语言程序设计教学方法.doc

中职学校C语言程序设计教学方法中职学校C语言程序设计的教学方法摘 要:计算机专业中,C语言是一门基础的程序设计课,但学习《C语言程序设计》相对职高学生来说难度较大,但它却是很实用的一门课程,同时又是我省计算机对口…

js和python哪个好_Python与Node.JS:哪一个比较适合您的项目?

在进行新项目时选择正确的编程语言可能是程序员经常做出的比较艰巨的决定之一。这个挑战背后的原因是,每个新项目都会遇到一个独特的问题,并且在编程世界中,没有任何行业的大师。 不同的编程语言都有其长处和短处,这使其适用于某些…

typescript的类型描述_一文学懂TypeScript的类型

你将学到什么阅读本文后,你应该能够理解以下代码的含义:interface Array{concat(...items: Array): T[];reduce(callback: (state: U, element: T, index: number, array: T[]) >U,firstState?: U): U;}如果你认为这段代码非常神秘 —— 那么我同意你…