Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59486
  • 博文数量: 8
  • 博客积分: 294
  • 博客等级: 二等列兵
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-17 10:18
文章分类
文章存档

2012年(8)

我的朋友

分类: LINUX

2012-05-07 13:04:43

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直接关闭连接。(类似于半打开连接)
阅读(6380) | 评论(2) | 转发(3) |
给主人留下些什么吧!~~

kugong11192012-05-10 21:34:12

韩仪ailsi: 很不错我顶你呵呵.....
第一个留言的同学,谢谢你

韩仪ailsi2012-05-08 14:31:05

很不错我顶你呵呵