套接字分析

listen函数的监听队列长度参数

http://blog.chinaunix.net/uid-20806345-id-3199231.html

listen函数将主动套接字转换为被动监控套接字,其第二个参数backlog决定了内核的连接缓存队列长度。对于一个给定的监听套接字,内核维护两个队列:

① 未就绪队列,存放没有完成三路握手的连接,监听套接字收到SYN并返回ACK+SYN,连接处于SYN_RECV状态,等待对端发送ACK。如果已完成队 列非满,则接收ACK,连接握手完成,进入已完成队列;如果已完成队列满则丢弃ACK,对端重发ACK(对端看到的连接是ESTABLISED状态),若 未就绪队列中的SYN_RECV等待直到超时还没进入已完成队列则丢弃连接(对端不知道,只有在读写套接字时才知道)。

② 已完成队列,存放已经完成三路握手的连接(ESTABLISHED),等待accept取走连接。

backlog决定了两个队列的长度之和(并不是说两个队列之和等于backlog,而是存在个转换,依赖于具体实现)

如果未就绪队列满则忽略新到来的SYN请求,对端重发,如果一直不能进入未就绪队列则对端connect失败返回。

当 监听套接字关闭时:① 会对已完成队列中的每个连接发送复位分节RST,对端捕获RST被动关闭连接;② 直接释放未就绪队列的连接,这时对端不知道,对端的连接状态依然保持ESTABLISHED状态,直到对端主动关闭连接,由于监听端已经关闭连接,所以以 RST响应对端的FIN,对端收到RST直接关闭连接。(类似于半打开连接)

 

 

inux中listen()系统调用的backlog参数分析

 

http://www.linuxidc.com/Linux/2013-02/79859.htm

 

listen()系统调用的backlog参数既是连接队列的长度,也指定了半连接队列的长度(不能说等于),而不是《Unix网络编程》中讲到的是半连接队列和连接队列之和的上限,也就是说这个说法对Linux不适用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值