当我阅读How TCP backlog works in Linux时,我在评论中看到以下问题而没有解释。这是一个简单的测试套接字服务器。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import socket
HOST = ''
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while 1:
pass
首先,在我的macOS上运行服务器并使用nc
连接到服务器,行为是:
nc
连接nc
连接挂起并重新发送SYN数据包。这与预期的一样。
由于:
历史上,BSD派生的TCP实现使用第一种方法。该选择意味着当达到最大积压时,系统将不再发送回SYN / ACK数据包以响应SYN数据包。通常,TCP实现只会丢弃SYN数据包(而不是使用RST数据包进行响应),以便客户端重试。
然后在Linux机器上运行它来做同样的事情,行为是:
以某种方式建立第二个连接。
问题是,为什么服务器可以在Linux上接受2个连接而在macOS上只接受1个。
Steffen Ullrich将其标记为另一个问题:listen() ignores the backlog argument?。
backlog参数提供了一个实现提示,该实现将用于限制套接字侦听队列中未完成连接的数量。
看来是真的。但与此同时,python doc说:
socket.listen(积压) 侦听对套接字的连接。 backlog参数指定排队连接的最大数量,并且应该至少为0;最大值取决于系统(通常为5),最小值强制为0。
那么也许python实现只是使用backlog作为提示?积压不是服务器将保持的连接数,但有些func(backlog)
是后面的数字。有人能解释一下吗?为什么最大值通常是5?
PS:
当设置backlog = 2时,第四个连接将挂起。 当设置backlog = 5时,第六个连接将挂起。