考虑在端口上侦听传入TCP连接的服务器进程 .

内核为传入的TCP连接保留一个“挂起的连接队列”,这些连接尚未被服务器进程接受 . 在这个挂起状态,我希望完整的TCP握手已经完成(syn,syn ack,ack)?

但是,仅当服务器进程调用“accept”系统调用时,其中一个挂起的连接才会实际 Build 并从队列中弹出,从而允许向/从服务器进程发送和接收数据 .

我有两个具体的问题 .

  • 在服务器进程“接受”连接之前,内核是否接受传入的有效负载数据?此传入数据必须缓冲在“套接字接收缓冲区”中,等待服务器进程接受连接并最终读取数据 .

如果答案是否定的,那么内核如何在保持连接活动的同时拒绝有效载荷数据?通过将TCP接收窗口大小设置为零?

如果答案是肯定的,那么内核如何防止因膨胀套接字缓冲区而导致过度使用RAM?当然必须配置一些合理的接收缓冲区限制 .

  • 内核保持挂起的连接多长时间尚未被服务器进程接受?内核是否为挂起的TCP连接发送保持活动消息?