服务器来不及接受请求导致行为

3月 26, 2019 |

我们知道tcp 会维护syn队列和accept 队列,当一个连接完成三次握手后,将其从syn队列移到accept队列,等待应用调用accept接受连接。而tcp有超时重传机制,重传的时间以0.3毫秒为基数倍增,默认重试5次后发送reset报文复位,经历的时长大概19s

所以当大量的报文不能被接受时会导致大量的包重传,消耗带宽,从而导致更多的timeout,客户端看到的问题是服务不可用

可以tcpdump观察交换的报文段
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.