网卡#

查看网卡接口基本信息

netstat {-i | --interface} | column -t
Iface    MTU        RX-OK    RX-ERR  RX-DRP  RX-OVR  TX-OK    TX-ERR  TX-DRP  TX-OVR  Flg
docker0  1500       0        0       0       0       0        0       0       0       BMU
ens33    1500       316789   0       0       0       105365   0       0       0       BMRU
ens37    1500       631      0       0       0       44       0       0       0       BMRU
lo       65536      3725115  0       0       0       3725115  0       0       0       LRU

网卡 ring buffer

ethtool {-g|--show-ring} ens33
Ring parameters for ens33:
Pre-set maximums:
RX:		4096
RX Mini:	0
RX Jumbo:	0
TX:		4096
Current hardware settings:
RX:		256
RX Mini:	0
RX Jumbo:	0
TX:		256

其它查看网卡信息的命令

ethtool -S ens33
cat /proc/net/dev
column -t /proc/net/dev
ifconfig ens33
ip -s link show ens33

内核#

TCP三次握手

tcp三次握手

半连接队列#

半连接队列,也称 SYN 队列,服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连接队列,并向客户端响应 SYN+ACK,客户端会返回 ACK,服务端收到第三次握手的 ACK 后,内核会把连接从半连接队列移除,然后创建新的完全的连接,并将其添加到 accept 队列

查看TCP半连接队列长度

netstat -ant|grep SYN_RECV | wc -l

可以使用hping3工具模拟SYN攻击

查看半连接溢出情况累计值,可以隔几秒执行查看

netstat -s | grep -i "listen"
    9 SYNs to LISTEN sockets dropped

半连接队列需要查看内核源码来确定长度,一般和以下参数相关:

  • 是否开启 tcp_syncookies
  • somaxconn
  • backlog,应用配置
  • max_syn_backlog

全连接队列#

全连接队列,也称 accept 队列,等待进程调用 accept 函数时把连接取出,服务端可以使用 ss 命令,来查看 TCP 全连接队列的情况,需要注意 ss 命令获取的 Recv-Q/Send-Q 在「LISTEN 状态」和「非 LISTEN 状态」所表达的含义是不同。

LISTEN 状态:

  • Recv-Q:当前全连接队列的大小,也就是当前已完成三次握手并等待服务端 accept() 的 TCP 连接;
  • Send-Q:当前全连接最大队列长度;

非LISTEN 状态:

  • Recv-Q:已收到但未被应用进程读取的字节数;
  • Send-Q:已发送但未收到确认的字节数;

队列长度和以下参数相关:

  • somaxconn
  • backlog,应用配置 查看连接溢出情况
netstat -s | grep overflowed