以下内容纯属虚构,切勿轻易相信!


  • 众所周知,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的,那么我们如果想要实现以下场景:

  1. 一个服务器,加载的是nginx服务,他正在接收请求,请求越来越多,他处理不过来了,所以将多余的请求扔到了一个队列中(队列上限8192);

    • net.core.netdev_max_backlog = 8192
  2. 但是这时候又来了一大批奇怪的请求,服务器怎么回应,这些请求源都不响应,且这些请求量也很大,故而服务器将其扔到了另一个队列(队列上限8192);
    • net.core.somaxconn = 8192
    • net.ipv4.tcp_max_syn_backlog = 8192
    • listen 80 default backlog = 8192
  3. 为了防止这些垃圾请求过于占用资源,服务器规定回应报文(ack+syn)的次数为2
    • net.ipv4.tcp_synack_retries = 2

到目前为止,三次握手已经走了一半,继续路程~

内核参数优化之2-1 tcp/ip 标志位报文解析的更多相关文章

  1. TCP/IP 标志位 SYN ACK RST UTG PSH FIN

    三次握手:发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个 SYN=1,ACK=1标志的数据包给发送端,告诉它,可以 ...

  2. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

  3. TCP/IP及内核参数优化调优

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等.如下配置是写在sysctl.conf ...

  4. TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等.如下配置是写在sysctl.conf ...

  5. TCP三次握手与Linux的TCP内核参数优化

    感谢各位技术大佬的资料分享,这里我把我理解的内容做一个整理 一:TCP的三次握手 1.TCP简述 TCP是一个面向连接的协议,在连接双方发送数据之前,首先需要建立一条连接.TCP建立连接可以简单称为: ...

  6. 内核参数优化/etc/sysctl.conf

    net.nf_conntrack_max = 65536000net.netfilter.nf_conntrack_tcp_timeout_established = 1200net.ipv4.tcp ...

  7. Linux(Centos )的网络内核参数优化来提高服务器并发处理能力【转】

    简介 提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器.但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题 ...

  8. Linux 内核参数 优化

    Linux 内核参数 优化 目录 Linux 内核参数 优化 1.编辑内核配置文件 2.参数及简单说明 3.客户端的典型状态转移参数 4.TCP重传参数 5.实现Nginx高并发的内核参数优化 生效配 ...

  9. Linux新系统的安全优化和内核参数优化

    拿到一个新的linux系统需要做的安全和内核优化,主要是为了提升系统安全和提升性能,满足后续的应用需要.这里简单记录一下拿到一个新的系统需要做的一些事情,仅此抛砖引玉,具体可根据自己实际情况进行设置. ...

随机推荐

  1. iOS中定时器NSTimer的使用-备用

    1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelect ...

  2. 关于c语言不定参数的研究

    一. 学习过程 编写程序如下: 编译连接并用debug加载,观察main函数的内容: Showchar函数的内容: 观察发现,main函数要传递两个参数‘a’和2,在汇编代码中是先将2赋给ax,再将a ...

  3. pm2 安装使用

    pm2 是全新开发的进程守护服务, 同时集成了负载均衡功能. 以及开机启动, 自动重启有问题进程. 还可以查看各服务进程状态. 使用方法参照:https://github.com/Unitech/pm ...

  4. Ubuntu下Git服务端搭建

    1安装git $ sudo add-apt-repository ppa:git-core/ppa $ sudo apt-get update $ sudo apt-get install git 测 ...

  5. MCS-51单片机的指令时序

    时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍.状态.机器周期和指令周期,接下来我们分别加以说明. 节拍与状态:    我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示), ...

  6. qt-solutions提供了8个开源项目

    其实这是官方提供的源代码,至于为什么会另建项目,而没有整合到QT项目里去,我猜可能有2个原因: 1. 这几个项目本身不完善,并且也不是QT项目的核心,因此没有必要花精力去完善 2. 一定程度上可以维护 ...

  7. [译] 新手和老手都将受益的JavaScript小技巧

    这篇文章会分享一些鲜为人知但却很强大的JavaScript技巧, 各个级别的JavaScript开发者都会从中受益.   1. 用数组的length属性清空数组   我们知道在JS中对象类型是按引用传 ...

  8. mongodb sort limit和skip用法

    > db.mediaCollection.find().skip().toArray() [ { "_id" : ObjectId("5353463193efef0 ...

  9. 在Spring中使用异步事件实现同步事务

    结合Scala+Spring,我们将采取一个很简单的场景:下订单,然后发送一封电子邮件. 编制一个服务: @Serviceclass OrderService @Autowired() (orderD ...

  10. 加上固件密码,Mac更安全

    在Mac OS X中,管理员密码非常重要,在修改系统参数或安装软件时都要求输入密码,这避免了绝大部分的破坏性误操作和恶意程序(尽管Mac上恶意程序本来就少的可怜). 但是对Mac OS X比较熟悉的人 ...