- 在线时间
- 4 小时
- 最后登录
- 2015-5-5
- 注册时间
- 2015-4-8
- 听众数
- 9
- 收听数
- 0
- 能力
- 0 分
- 体力
- 86 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 38
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 22
- 主题
- 12
- 精华
- 0
- 分享
- 0
- 好友
- 3
升级   34.74% TA的每日心情 | 慵懒 2015-5-5 09:35 |
|---|
签到天数: 10 天 [LV.3]偶尔看看II
- 自我介绍
- sdc
 |
linux在对socket的连接队列的定义处理上个人觉得是有点坑爹的,闲话少说,直接开讲。
) a4 @3 x6 ~0 n" j; k% n @2 Y7 J% a3 h$ U0 H; B+ T: |
建立socket连接的过程:
3 v. a1 ]2 L5 N q- u+ ?6 L 1.client发syn请求给server 9 l0 |* ?- Q1 \0 |0 d% e
2.server收到后把请求存放在SYN queue里,这个半连接队列的最大值是系统参数 tcp_max_syn_backlog定义的
7 q% E$ b9 z1 z, n( e M5 M 3.存放在半连接队列后发送syn+ack给client,client收到后再发syn+ack给server完成三次握手,然后server把连接存放在accept queue ,这个队列长度就是程序里调用socket的时候定义的backlog定义大小。
% p2 i( |- w* q8 O8 G 4.应用程序通过调用accept()到accept queue里获取连接。
1 B4 ~; @+ w/ K/ F+ E( W$ m: C" a: d 坑爹的特性来了!注意!0 a8 Q% o5 G- r9 [! J+ C
当accept queue满了会怎么样?
4 P$ k5 ?9 g2 {* S; M4 H1 s, ^ !!注意!如果accept队列满了,linux会出现一个异常处理,去判断tcp_abort_on_overflow系统参数是否为1,如果为1 ,则会发出拒绝客户端的终止讯息并断开连接。但是如果这个参数是0,那就坑爹了!,对于溢出队列的连接,linux不会去管它,会继续正常建立连接,但是在accept queue里没有,那就意味着你的程序用accept()函数无法取的连接!这是多么的坑爹啊!!!根本查不出原因好么!!!各种被误导好么!!!尼玛linux啊!!
& ~% S. Q3 O8 r6 |# w* o |
zan
|