目录:

《TCP洪水攻击(SYN Flood)的诊断和处理》

《TCP/IP协议中backlog参数》

TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢?

  backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队列大小。

  半连接状态为:服务器处于Listen状态时收到客户端SYN报文时放入半连接队列中,即SYN queue(服务器端口状态为:SYN_RCVD)。

  全连接状态为:TCP的连接状态从服务器(SYN+ACK)响应客户端后,到客户端的ACK报文到达服务器之前,则一直保留在半连接状态中;当服务器接收到客户端的ACK报文后,该条目将从半连接队列搬到全连接队列尾部,即 accept queue (服务器端口状态为:ESTABLISHED)。

  在Linux内核2.2之后,分离为两个backlog来分别限制半连接(SYN_RCVD状态)队列大小和全连接(ESTABLISHED状态)队列大小。

  半连接队列:SYN queue 队列长度由 /proc/sys/net/ipv4/tcp_max_syn_backlog 指定,默认为2048。

  全连接队列:Accept queue 队列长度由 /proc/sys/net/core/somaxconn 和使用listen函数时传入的参数,二者取最小值。默认为128。

在Linux内核2.4.25之前,是写死在代码常量 SOMAXCONN ,在Linux内核2.4.25之后,在配置文件 /proc/sys/net/core/somaxconn 中直接修改,或者在 /etc/sysctl.conf 中配置 net.core.somaxconn = 128 。

  可以通过ss命令来显示

[root@localhost ~]# ss -l
State       Recv-Q Send-Q                                     Local Address:Port                                         Peer Address:Port
LISTEN      0      128                                                    *:http                                                    *:*
LISTEN      0      128                                                   :::ssh                                                    :::*
LISTEN      0      128                                                    *:ssh                                                     *:*
LISTEN      0      100                                                  ::1:smtp                                                   :::*
LISTEN      0      100                                            127.0.0.1:smtp                                                    *:*       

  在LISTEN状态,其中 Send-Q 即为Accept queue的最大值,Recv-Q 则表示Accept queue中等待被服务器accept()。

队列溢出

另外,客户端connect()返回不代表TCP连接建立成功,有可能此时accept queue 已满,系统会直接丢弃后续ACK请求;客户端误以为连接已建立,开始调用等待至超时;服务器则等待ACK超时,会重传SYN+ACK 给客户端,重传次数受限 net.ipv4.tcp_synack_retries ,默认为5,表示重发5次,每次等待30~40秒,即半连接默认时间大约为180秒,该参数可以在tcp被洪水攻击是临时启用这个参数。

注:accept queue溢出,即便SYN queue没有溢出,新连接请求的SYN也可能被drop。  

查看SYN queue 溢出

[root@localhost ~]# netstat -s | grep LISTEN
102324 SYNs to LISTEN sockets dropped

查看Accept queue 溢出

[root@localhost ~]# netstat -s | grep TCPBacklogDrop
TCPBacklogDrop: 2334

案例1

Nginx作为7层反向代理,客户端HTTP请求 – NGINX – 透明代理,透明代理接口存在大量慢请求;

思路

抓包,客户端同nginx通信,nginx立即返回ACK(1ms),但是3s后才返回响应数据;

Nginx同后端通信,发送SYN请求等待3s后端才响应;

结论

Backlog设置过小,导致accept queue溢出,SYN被丢弃导致3s重传;

将backlog从50增加到512,somaxconn=512;

案例2

Testserver随机生成RAR/ZIP文件,testclient访问testserver获取生成文件,所有调用采用block方式;

运行一段时间后程序永久阻塞,strace先生testclient阻塞在recvmsg;

思路

抓包观察3次握手协议,服务器返回SYN+ACK,客户端响应ACK,可服务器再次发送同样的SYN+ACK;

客户端响应的ACK丢包,而net.ipv4.tcp_synack_retries = 1;

结论

三次握手最后一步失败,server保持SYN_RECV状态等待接收ACK,client发送ACK状态变为ESTABLISHED,其认为connect()成功故接着调用recvmsg();

Syn+ack被设置为只重传一次,若这次重传仍失败,则客户端永久阻塞;

其他案例

Backlog过大,连接积压在accept queue,nginx由于连接超时而断开,PHP accept返回时连接已被客户端close,故报告PHP write Broken pipe;

Backlog过小,accept queue溢出,握手第3步的ACK被丢弃,但client认为连接成功并发送数据,造成所谓慢请求;

参考资料:

TCP SOCKET中backlog参数的用途是什么?

TCP/IP协议中backlog分析与设置以及TCP状态变化

TCP3次握手和backlog溢出

TCP queue 的一些问题

TCP洪水攻击(SYN Flood)的诊断和处理

TCP之三:TCP/IP协议中backlog参数(队列参数)相关推荐

  1. backlog配置_TCP/IP协议中backlog参数

    TCP建立连接是要进行三次握手,但是否完成三次握手后,服务器就处理(accept)呢? backlog其实是一个连接队列,在Linux内核2.2之前,backlog大小包括半连接状态和全连接状态两种队 ...

  2. tcp/ip协议中消息传输对帧消息的操作

    2019独角兽企业重金招聘Python工程师标准>>> 接口:Framer.java: package com.tcpip;import java.io.IOException; i ...

  3. TCP/IP协议中的一些常用端口简单讲解

    (源自http://bbs.360.cn/3232114/17010996.html) 那么TCP/IP协议中的端口指的是什么呢?如果把IP地址比作一间房子 ,端口就是出入这间房子的门.真正的房子只有 ...

  4. TCP/IP协议中的端口

    本文所述端口都是逻辑意义上的端口,是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等. 我们这里将要介绍的就是逻辑意义上的端口. ...

  5. 在tcp/ip协议中以BigEndian方式的编码与解码

    2019独角兽企业重金招聘Python工程师标准>>> package com.tcpip;/*** 在tcp/ip协议中以BigEndian方式的编码与解码* @author ** ...

  6. TPC/IP协议中与IP相关的知识点简介

    TPC/IP协议中与IP相关的知识点简介 简介 TCP/IP参考模型作为实现网络连接性和互操作性的关键,它使得网络上不同的计算机具有互操作能力,并且在较差的网络环境下可维持主机之间的连接 其协议结构分 ...

  7. TCP/IP协议中分包与重组原理介绍、分片偏移量的计算方法、IPv4报文格式

    目录 一.什么是IP分片 二,为什么要进行IP分片 三.IP分片原理及分析 标志字段的作用 下面是标志位在IP首部中的格式以及各个标志的意义: TTL Protocol 协议号 分片包文示例: 分片偏 ...

  8. TCP/IP协议中常用端口表

    表 7.1常用端口号列表 端口号 协议 关键词 描述 7 TCP/UDP ECHO 回送 9 TCP/UDP DISCARD 丢弃 15 TCP/UDP - 网络状态程序 20 TCP FTP-DAT ...

  9. flag push tcp 作用_TCP/IP协议到底在讲什么?

    题主,你之所以不知道那套书在讲什么,是因为你还没有认识到网络协议有什么用,怎么用,以什么形式在使用,网络协议的概念很简单,就几句话,你只知道网络协议的概念,只知道很多大神都推荐这套书,都强调网络协议的 ...

最新文章

  1. R语言入门系列-软件下载,环境搭建,数据导入导出
  2. 信息系统项目管理师在线考试
  3. Netty实战 IM即时通讯系统(十)实现客户端和服务端收发消息
  4. 【物联网】 AR9344开发环境的搭建和编译固件
  5. spring 全局异常处理
  6. 【软件测试】Homework 1 Briefly describe an error
  7. 输入卡号生成银行卡图片python_python 模拟贷个卡号生成规则过程解析
  8. No Bootable Device 问题解决(由于误删ESP分区导致)
  9. 小米盒子3显示无网络连接服务器,小米盒子不显示无线网络连不上 - 卡饭网
  10. Android真机连接局域网PC服务器的方法
  11. 2021年高处安装、维护、拆除模拟考试题库及高处安装、维护、拆除作业考试题库
  12. 戴尔电脑插上耳机之后仍然外放
  13. 苹果项目关闭服务器,苹果自动续费怎么取消?手把手教你快速关闭
  14. 观小林coding图解网络总结
  15. linux mount u盘 exfat,CentOS 挂载 exfat 和 FAT32格式的U盘
  16. 反脆弱 : 如何在复杂世界越变越强
  17. go - rune类型
  18. 使用反应路由器V4以编程方式导航
  19. 数据结构与算法JAVA语言描述第六章部分课后习题参考答案
  20. 武理计算机专业物联网怎么样,计算机物联网专业怎么样呢?

热门文章

  1. Android中 ExpandableList的使用2
  2. redis的基础配置
  3. 问题四:C++中inline是干嘛用的
  4. 解决: Mysql安装时mysqld.exe报`应用程序无法正常启动(0xc000007b)`的问题
  5. 物联网卡使用过程中的注意事项
  6. 数据库的几个基本概念
  7. 数据结构之广义表的相关知识点
  8. c 子类对象 访问父类对象受保护成员_看了这个,你就会搞对象了
  9. 机器学习 - [源码实现决策树小专题]决策树学习中如何进行分类预测
  10. Nodejs 文件 与 路径 相关用法实例解析