如果有大量的TCP连接请求到来,服务器会做什么呢?

进入连接队列

一个连接有两个状态,一种是连接尚未完成但是已经接收到SYN,一种是连接已经完成三次握手, 内部操作系统通常会使用两个不同的队列分别对应上述两种不同情况。

Linux下:

当一个连接请求到达,将检查SYN_RCVD状态的连接数,有一个参数:net.ipv4.tcp_max_syn_backlog(默认为1000),如果连接数超过了这一数值,那么进入的连接将会被拒绝(一种是不回复,一种是回复RST(但是发送重置可能会让客户端误以为服务器不存在))。

对于处于侦听状态的连接,Linux系统会有一个连接队列(固定长度),这里存放握手但是未被应用程序接受的连接,队列满了之后,系统会延迟对SYN的响应,尽可能的接受更多的连接,此外第三次握手携带的数据也会被暂存在这里队列里。