内核参数优化之2-1 tcp/ip 标志位报文解析
以下内容纯属虚构,切勿轻易相信!
- 众所周知,tcp/ip三次握手和四次挥手,均由
syn/ack/fin
三个标志位报文决定,但是这三个标志位报文,并不是说在构建连接的时候只发送一次的,因为协议不知道网络状况. 故而就存在了以下参数,可以调节发送次数 - net.ipv4.tcp_syn_retries
- 这个参数从字面上来看就是syn标志位报文的重试次数,什么时候发送syn标志位呢?三次握手中,请求端第一次构建连接的时候,默认是5次,但是对于一个处于网络状况好的请 求端,5次显然是多了,因此,我们来个2
- net.ipv4.tcp_synack_retries = 5
- 这个参数从字面上来看是
syn+ack
标志位报文的重试次数,什么时候发送syn+ack
标志位呢?三次握手中,响应端为了应答请求端的syn
标志位报文,同时请求构建的时候,默认是5次,和上面一样,网络环境好,就来个2. - 这里还牵扯到一个东西,ddos攻击里面有一个就是针对
syn+ack
报文的攻击,也就是说,如果有疯子一直大量发送syn标志位,但是服务器需要发送syn+ack
来响应,但是那个疯子却不回复ack
标志位,导致服务器需要一直重试到次数结束. - 且服务器的
syn
等待队列是有上限的,因为大量疯子的syn
报文占用了,那么服务器就接收不到正常的syn报文请求了.这里还有一个响应端syn
等待队列的参数
- 这个参数从字面上来看是
- net.ipv4.tcp_max_syn_backlog 疑问项?
- 这个参数就是定义响应端的
SYN_RCVD
状态队列,默认是1024,根据服务器性能和负载情况,可以调高此数值,比如8192 - 假设被ddos syn flood了,
syn
等待队列也溢出了,该怎么搞?可以启用net.ipv4.tcp_syncookies
- 到这里,可能有人发现,设定了这个参数,但是服务器在并发测试的时候,发现
SYN_RCVD
的状态还是128或者512(内核小于2.6.20),其原因如下:- 服务器的被请求源于服务的监听端口,重启服务,即重新调用listen函数
- 在内核大于2.6.20的时候,
listen
函数会在调用的时候读取内核参数net.core.somaxconn
的值,它的默认值是128,来确定backlog
的大小 - 在内核小于2.6.20的时候,
listen
函数有一个固定值TCP_SYNQ_HSIZE
这个单向链表数组,它的默认值是512,你可以修改这个值,确保这个值*16 <= net.ipv4.tcp_max_syn_backlog,这个链表的位置在$KERNEL/include/net/tcp.h
- 但是不管你如何修改上面的参数,如果你不修改服务中
listen
的显性参数backlog
,那么服务依然会限制 - nginx中是这么修改的
listen 80 default backlog = 8192
- php-fpm中是这么修改的
listen.backlog = 8192
- 这个参数就是定义响应端的
- net.core.netdev_max_backlog 疑问项?
- 如果说
tcp_max_syn_backlog
是针对syn
半开连接的话,这个参数就是针对一个整体的,意思就是说当内核处理不过来的时候,多余的就先扔到队列中
- 如果说
- net.ipv4.tcp_syncookies
- 这个参数的作用是当
syn
等待队列溢出的时候,就给请求端发送syncookies
,直接绕过三次握手,构建连接.但这违反了tcp/ip
协议,可能会影响其他服务,所以如果不确定是攻击,而是正常负载,则不要开启
- 这个参数的作用是当
OK,假设我们内核是大于2.6.20的,那么我们如果想要实现以下场景:
- 一个服务器,加载的是nginx服务,他正在接收请求,请求越来越多,他处理不过来了,所以将多余的请求扔到了一个队列中(队列上限8192);
- net.core.netdev_max_backlog = 8192
- 但是这时候又来了一大批奇怪的请求,服务器怎么回应,这些请求源都不响应,且这些请求量也很大,故而服务器将其扔到了另一个队列(队列上限8192);
- net.core.somaxconn = 8192
- net.ipv4.tcp_max_syn_backlog = 8192
- listen 80 default backlog = 8192
- 为了防止这些垃圾请求过于占用资源,服务器规定回应报文(ack+syn)的次数为2
- net.ipv4.tcp_synack_retries = 2
到目前为止,三次握手已经走了一半,继续路程~
内核参数优化之2-1 tcp/ip 标志位报文解析的更多相关文章
- TCP/IP 标志位 SYN ACK RST UTG PSH FIN
三次握手:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个 SYN=1,ACK=1标志的数据包给发送端,告诉它,可以 ...
- linux下TCP/IP及内核参数优化调优(转)
Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...
- TCP/IP及内核参数优化调优
Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等.如下配置是写在sysctl.conf ...
- TCP/IP及内核参数优化调优(转)
Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等.如下配置是写在sysctl.conf ...
- TCP三次握手与Linux的TCP内核参数优化
感谢各位技术大佬的资料分享,这里我把我理解的内容做一个整理 一:TCP的三次握手 1.TCP简述 TCP是一个面向连接的协议,在连接双方发送数据之前,首先需要建立一条连接.TCP建立连接可以简单称为: ...
- 内核参数优化/etc/sysctl.conf
net.nf_conntrack_max = 65536000net.netfilter.nf_conntrack_tcp_timeout_established = 1200net.ipv4.tcp ...
- Linux(Centos )的网络内核参数优化来提高服务器并发处理能力【转】
简介 提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器.但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题 ...
- Linux 内核参数 优化
Linux 内核参数 优化 目录 Linux 内核参数 优化 1.编辑内核配置文件 2.参数及简单说明 3.客户端的典型状态转移参数 4.TCP重传参数 5.实现Nginx高并发的内核参数优化 生效配 ...
- Linux新系统的安全优化和内核参数优化
拿到一个新的linux系统需要做的安全和内核优化,主要是为了提升系统安全和提升性能,满足后续的应用需要.这里简单记录一下拿到一个新的系统需要做的一些事情,仅此抛砖引玉,具体可根据自己实际情况进行设置. ...
随机推荐
- USB 0xC0000012 错误详解
0xC0000012Bus Hound 6.01 capture on Windows Vista Service Pack 1 (x86). Complements of www.perisoft. ...
- 模糊语意变数、规则和模糊运算--AForge.NET框架的使用(二)
原文:模糊语意变数.规则和模糊运算--AForge.NET框架的使用(二) 语意变数(Linguistic Variable) 语意变数存储了数个语意量(标签),每个语意量包含一个识别名和模糊集合.在 ...
- 【转】Linux 中断学习之小试牛刀篇
原文网址:http://www.linuxidc.com/Linux/2011-02/32129.htm 前言 在前面分析了中断的基本原理后,就可以写一个内核中断程序来体验以下,也可以借此程序继续深入 ...
- WIN7笔记本显示连接不可用
如图所示,找不到任何无线网络 解决方法: 不小心把无线关掉而已,笔记本键盘上F5~F12找看看有没有无线标志,有的话要先按下 Fn键不放,再按下那个有无线标志的Fn键.
- Android输入法界面管理(打开/关闭/状态获取)
最近做一个带发表情的聊天界面,需要管理系统输入法的状态, 一.打开输入法窗口: InputMethodManager inputMethodManager = (InputMethodManager) ...
- C++与lua交互
项目开发的脚本层用的是Lua,引擎用的是C++.但是经理不给开放引擎层的代码.刚好最近项目空闲,安排了学习C++跟Lua的通信. 一.C++与Lua数据交互 数据交互主要是通过C API来实现 首先, ...
- UML[1] UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)(转)
转自:http://blog.csdn.net/zhaoxu0312/article/details/7212152 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是 ...
- Myeclipse自动生成javabean的get和set方法
用Myeclipse开发java web程序,写javabean的时候,如果字段很多的话,写get和set方法是一件很无语和浪费时间的事情,所以Myeclipse提供了一个自动生成这些方法的功能. 首 ...
- (转)Maven实战(二)构建简单Maven项目
上一节讲了maven的安装和配置,这一节我们来学习一下创建一个简单的Maven项目 1. 用Maven 命令创建一个简单的Maven项目 在cmd中运行如下命令: mvn archetype:gene ...
- 【80端口占用】win7下80端口被(Pid=4)占用的解决方法
亲测可用 通过cmd命令查询占用进程的pid netstat -ano 如果要是tomcat等一般程序占用了端口,一般pid比较大,直接找到相应的pid结束掉进程就行啦. 但是如果pid是4,代表sy ...