TCP backlog在Linux

时间:2017-05-29 07:39:30

标签: linux sockets networking tcp

当我阅读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

Mac os

首先,在我的macOS上运行服务器并使用nc连接到服务器,行为是:

  1. 接受第一个nc连接
  2. 第二个nc连接挂起并重新发送SYN数据包。
  3. 这与预期的一样。

    Mac OS

    由于:

      

    历史上,BSD派生的TCP实现使用第一种方法。该选择意味着当达到最大积压时,系统将不再发送回SYN / ACK数据包以响应SYN数据包。通常,TCP实现只会丢弃SYN数据包(而不是使用RST数据包进行响应),以便客户端重试。

    Centos 7(Linux)

    然后在Linux机器上运行它来做同样的事情,行为是:

    1. 接受第一个连接。
    2. 接受第二次连接
    3. 第三个连接挂起并重新发送ACK数据包,服务器同时重新发送SYN / ACK。
    4. 以某种方式建立第二个连接。

      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时,第六个连接将挂起。

0 个答案:

没有答案