listen的第二个参数详解

之前对于listen的第二个参数的理解,只是停留在它代表服务器缓冲区队列的大小层面上,具体并没有详细研究过,一次偶然的tcp实验,发现了很大的bug。
当服务器端没有调用accept函数时,此时3个客户端同时连接服务器,用netstat查看服务器状态,但是当启动第4个客户端时,发现客户端状态正常,服务器出现了SYN_RECV状态,而不是ESTABLISHED状态,如下图所示:

这是因为,Linux内核协议栈为一个tcp连接管理使用两个队列,分别是:
半连接队列:用来保存SYN_SENT和SYN_RECV两个状态的连接
全连接队列:用来保存保存ESTABLISHED状态的连接
全连接队列存放三次握手成功的连接。当服务器不调用accept函数,没有将全连接队列的请求拿出来,当队列满的时候,客户端的连接就无法再过来,即存放在半连接队列中,所以此实验中当第4个客户端发起连接时,服务器会处于SYN_RECV状态。
注意:全队列的长度是listen的第二个参数+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值