我们知道tcp 会维护syn队列和accept 队列,当一个连接完成三次握手后,将其从syn队列移到accept队列,等待应用调用accept接受连接。而tcp有超时重传机制,重传的时间以0.3毫秒为基数倍增,默认重试5次后发送reset报文复位,经历的时长大概19s
所以当大量的报文不能被接受时会导致大量的包重传,消耗带宽,从而导致更多的timeout,客户端看到的问题是服务不可用
可以tcpdump观察交换的报文段
tcpdump 过滤表达式使用man pcap-filter
语法
tcpdump -i eno16777736 -nn port 55533
tcpdump -i eno16777736 -nn 'tcp[14:2] = 0 and tcp[0:2] = 80 and tcp[13]&2 != 0'
tcp[14:2] = 0
从tcp头部偏移量为14开始的2个字节 的值为0, 也就是window size=0
tcp[0:2] = 80
源端口=80
tcp[13]&2 != 0
tcp[13]标志位字节, 表示设置了sync标示的报文
参考文档
https://blog.cloudflare.com/syn-packet-handling-in-the-wild/
Posted in: Linux
Comments are closed.