backlog
在 TCP 的三次握手中,backlog 用于处理从 SYN RECEIVED 到 ESTABLISHED 状态之间的套接字。
其中具有 SYN 队列和 accept 队列:
SYN 队列长度由系统调整。当服务器端收到一个 SYN 包时,将其放入 SYN 队列并返回 ACK+SYN。队满则抛弃,客户端超时后重发。accept 队列长度由步伐调整(也就是我们通过 SO_BACKLOG 设置的长度)。当服务器端收到之前本身发送的 SYN 的 ACK 时,会将套接字放入这里。大多数时间这里的数据可以很快的被步伐通过 accept() 取出。队满时抛弃到来的 ACK 包(虽然客户端已经进入了 ESTABLISHED 状态,但由于 tcp 的慢启动,并不会造成太大影响),客户端重发到一定次数仍未被放入 accept 队列时会被发送 RST 包。同时在 Linux 中,这里队满时会对 SYN 队列的接收速率举行控制。
net.ipv4.tcp_tw_reuse
这个选项主要用在具有大量短连接的应用。
问题:
在具有大量短连接时,服务器端上具有太多属于同一个客户端的处于 TIME_WAIT 状态的连接,而导致该客户端不能建立新的连接。
处理方法:
在 Linux 中,TCP 的 TIME_WAIT 时间默认为 1 分钟,而 TIME_WAIT 被设计出来的主要目标有两个:
避免新的连接收到旧的连接的重发数据包确保长途端不是在 LAST_ACK 状态
在开启这个选项后,如果 TIME_WAIT 状态的连接过多,会使用在 TCP 可选头部中的时间戳选项,来和之前存储的时间戳对比,若该大,则从 TIME_WAIT 状态的存活连接中随机选取一个并分配给该 TCP 连接。
对于需要解决问题 1,由于旧的连接的重发包具有过期的时间戳,所以会被抛弃;
对于问题 2 ,当处于 LAST_ACK 的一端收到新的 TCP 连接的 SYN 包后,会将其抛弃,然后重发 FIN 包,处于 SYN_SEND 状态的一端收到这种错误的包后会发送 RST 包,然后再发送 SYN 包重试。
原文链接:https://www.cnblogs.com/enoc/p/rocketmq-so-no-san.html
欢迎光临 创意电子 (https://wxcydz.cc/) | Powered by Discuz! X3.4 |