backlog配置_关于backlog参数的疑惑

致敬 W.Richard Stevens

零. 背景知识

如果读者对以下知识点有基本的了解,读起来会很轻松,就像是在大学做物理实验。

Linux

C/Python/Java

TCP/IP

一. 系统调用listen

大多数同学第一次接触到backlog参数,是从listen函数开始的。

下面是关于listen函数的man手册摘要

int listen(int sockfd, int backlog);

...

The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.

If a connection request arrives when the queue is full, the client may receive an error with an indication of ECONNREFUSED or, if the underlying protocol supports retransmission, the request may be ignored so that a later reattempt at connection succeeds.

这段文档中有两个地方需要思考:

the queue of pending connections

可以有两种解释

a. 已经完成三次握手的连接(ESTABLISHED)

b. 已经完成三次握手的连接(ESTABLISHED) + 未完成三次握手的连接(SYN-RECEIVED)

这两种解释可能都是对的,因为不同的操作系统有不同的实现。

对现代Linux来说,这里的队列特指已经完成三次握手的连接

当队列已满的时候,直接返回reset是否合适(ECONNREFUSED)

这样处理有个坏处,就是客户端无法区别是未处理队列满了,还是访问了系统未监听的端口,

所以还是直接忽略这个SYN比较好。

本文档聚焦在第一个问题。

二. 内核参数

有两个内核参数,涉及到TCP三次握手的队列长度配置

net.core.somaxconn

[ESTABLISHED] 已完成连接队列

web 应用中 listen 函数的 backlog 默认会被我们内核参数net.core.somaxconn 限制到128

tcp_max_syn_backlog

[SYN-RECEIVED] 未完成连接队列

记录的那些尚未收到客户端确认信息的连接请求的最大值。

我们用两个实验来验证一下这两个参数。

三. 实验环境

两台虚拟机

172.28.32.101 [服务端]

172.28.32.102 [客户端]

服务端代码 serv.py

#!/usr/bin/python

import socket

import sys

import time

HOST = '0.0.0.0' # Symbolic name meaning all available interfaces

PORT = 1234 # Arbitrary non-privileged port

BACKLOG = 2

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

print 'Socket created'

try:

s.bind((HOST, PORT))

except socket.error , msg:

print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]

sys.exit()

print 'Socket bind complete'

s.listen(BACKLOG)

print 'Socket now listening'

time.sleep(3600)

不调用accept函数,已完成三次握手的连接可以保持在队列中

客户端代码 cl

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值