zoukankan      html  css  js  c++  java
  • TCP 队列溢出了

    一、TCP 队列

    1、syns queue:半连接队列

    TCP 三次握手(参考:TCP建立连接之三次握手),第一步,服务端接收到客户端发送的 syn 消息后,将连接信息放入 syns queue,此时,双方连接尚未建立,称之为半连接。

    2、accept queue:全连接队列

    TCP 三次握手,第三步,客户端接收到服务端发送的 syn + ack 消息后,向服务端发送 ack 消息,服务端接收到此消息后,将连接信息从 syns queue 拿出,放入 accept queue,此时,经过三次握手,连接已经建立,称之为全连接。

    二、队列溢出

    既然是队列,那就会存在队列被填满的情况,我们称之为队列溢出。

    1、syns queue 满

    假如某一时间段内,有大量的 syn 请求连接信息到达,如果后续连接建立处理不及时,或者有客户端方面恶意不处理后续连接,那么就会快速占满 syns queue,从而导致无法建立新的连接。

    2、accept queue 满

    完成三次握手,则会触发连接信息的队列转移,假如此时,accept queue 队列满,则会导致新建立的连接得不到维护保持,系统会根据设定的策略(tcp_abort_on_overflow)进行连接的直接抛弃(0)或者发送 RST 消息给客户端终止连接(1)(Connection reset by peer)。

    3、查看队列溢出

    命令:netstat -s | egrep "listen|LISTEN"

    结果:

    全连接队列溢出次数:
    6 times the listen queue of a socket overflowed

    半连接队列溢出次数:
    6 SYNs to LISTEN sockets dropped

    4、查看队列使用情况

    命令:ss -lnt

    结果:

    State Recv-Q Send-Q Local Address:Port Peer Address:Port
    LISTEN 0         128              *:22                   *:*
    LISTEN 0          50             *:9090                 *:*

    Send-Q:监听端口上全连接队列最大大小

    Recv-Q:全连接队列当前使用量

    三、关于连接错误

    connection reset:已关闭的连接上执行读操作触发。

    connection reset by peer:已关闭的连接上执行写操作触发。

    四、关于 RST 消息

    连接重置消息,用于连接的【异常关闭】。

    下面简单罗列集中可能触发 RST 连接关闭的情景:

    1、服务端接收到自身不存在端口的连接请求

    2、主动使用 RST 关闭,替代正常的四次挥手 FIN 消息关闭(参考:TCP连接性能指标之TCP关闭过程(四次挥手)),主要用于特殊优化提升效率使用。

    3、客户端或者服务端异常,无法继续正常的连接处理,发送 RST 终止连接操作。

    4、处理 TCP 游离包信息。

    5、长期未收到对方确认报文,经过一定时间或者重传尝试后,发送 RST 终止连接。

  • 相关阅读:
    linux c使用socket进行http 通信,并接收任意大小的http响应(四)
    linux c使用socket进行http 通信,并接收任意大小的http响应(三)
    Linux c读取系统内存使用信息
    linux c使用socket进行http 通信,并接收任意大小的http响应(二)
    linux c使用socket进行http 通信,并接收任意大小的http响应(一)
    Linux c读取任意大小文件的所有数据
    Linux c 从文件当中读取任意一行的数据
    如何抓取Android系统APP运行测试日志
    Linux下将Weblogic设置为开机启动
    Red hat/CentOS7关闭防火
  • 原文地址:https://www.cnblogs.com/niejunlei/p/13919726.html
Copyright © 2011-2022 走看看