β

socket.listen(backlog) 中 backlog 指的是什么

nosa.me 377 阅读

1. 首先,创建 socket bind 并 listen 之后,服务端就可以独自完成三次握手了(抓包确认),调用 accept 才是把「连接」从队列里取出来。



#-*- encoding: UTF-8 -*-

from socket import *

HOST = ''
PORT = 80
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(2)

while True:
    pass
    # print 'waiting for connection...'
    # tcpCliSock, addr = tcpSerSock.accept() # 等待连接
    # print '...connected from:', addr

tcpSerSock.close()

2. 下面我们看看假如不调用 accept,最大能有多少 ESTABLISHED 的连接。

server 端代码还是采用上面的,client 代码如下:



#-*- encoding: UTF-8 -*-

import time
from socket import *
from multiprocessing.dummy import Pool as ThreadPool
HOST = '10.19.28.33'
PORT = 80
ADDR = (HOST, PORT)
MAX_THREAD_NUM = 100

def connect(x):
    tcpCliSock = socket(AF_INET, SOCK_STREAM)
    tcpCliSock.connect(ADDR) # 套接字连接
    time.sleep(4)
    return time.time(), tcpCliSock

pool = ThreadPool(MAX_THREAD_NUM)
result_data = pool.map(connect, xrange(MAX_THREAD_NUM))
pool.close()
pool.join()

print result_data

测试结果如下:

1). 当 server 端 listen 的 backlog 为0,最大的 ESTABLISHED 数量为 2;

2). 当 listen 的 backlog 为1,最大的 ESTABLISHED 数量为 2;

3). 当 listen 的 backlog 为 N,则最大的 ESTABLISHED 数量为 N + 1;

所以,backlog 代表着有多少个已经建立的但是没有被 accept 取走的连接数量。

另外,有个内核参数 net.core.somaxconn 定义了 socket 同时 listen 的最大连接数,所以 socket.listen() 指定的值不能超过 net.core.somaxconn。

3. 如果 ESTABLISHED 满了,此时进来的连接请求状态是 SYN_RECV,那么 SYN_RECV 的数量(也就是 SYN 队列长度)最大是多少呢?

答案是由内核参数 net.ipv4.tcp_max_syn_backlog 决定。

我做了个测试,环境如下:

server 端,ip 10.19.28.33,代码如1,listen backlog 为2,net.ipv4.tcp_max_syn_backlog 设置为8,net.ipv4.tcp_syncookies 设置为0。

clinet 端,ip 10.0.11.12,代码如2,MAX_THREAD_NUM 设置为12。

两台机器的 /proc/sys/net/ipv4/tcp_synack_retries 和 /proc/sys/net/ipv4/tcp_syn_retries 都为2,而且 /proc/sys/net/ipv4/tcp_abort_on_overflow 都为0。

client 端会报: <class ‘socket.error’>: [Errno 110] Connection timed out

在 server 端抓包,包在这里: socket.pcap

这里不纠结发生了什么,在后面的文章继续。

参考:

http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html

http://linux.die.net/man/2/listen

Related posts:

  1. 关于 tcp syn 队列和 accept 队列
  2. 解决 HTTP 请求被 LVS reset 的问题
  3. redis 连接一直是 ESTABLISHED 的问题排查
作者:nosa.me
未来不会有sa
原文地址:socket.listen(backlog) 中 backlog 指的是什么, 感谢原作者分享。

发表评论