linux在对socket的连接队列的定义处理上个人觉得是有点坑爹的,闲话少说,直接开讲。) K" J! z5 d* L4 ~- H8 c
' @& L' |2 G, T. s# M
建立socket连接的过程: ) G0 V- I, M; C 1.client发syn请求给server ; Z# D+ V l m9 N: V5 n 2.server收到后把请求存放在SYN queue里,这个半连接队列的最大值是系统参数 tcp_max_syn_backlog定义的0 o- ~% ?, F$ E$ K& B
3.存放在半连接队列后发送syn+ack给client,client收到后再发syn+ack给server完成三次握手,然后server把连接存放在accept queue ,这个队列长度就是程序里调用socket的时候定义的backlog定义大小。; k0 p8 p: S9 B Q$ O! E. @
4.应用程序通过调用accept()到accept queue里获取连接。9 ?6 z& [3 D0 L. c' Y6 D1 y% @: K
坑爹的特性来了!注意! - ~2 Z; ^3 D1 B/ C. N 当accept queue满了会怎么样? ( ] D* [' x( P2 f !!注意!如果accept队列满了,linux会出现一个异常处理,去判断tcp_abort_on_overflow系统参数是否为1,如果为1 ,则会发出拒绝客户端的终止讯息并断开连接。但是如果这个参数是0,那就坑爹了!,对于溢出队列的连接,linux不会去管它,会继续正常建立连接,但是在accept queue里没有,那就意味着你的程序用accept()函数无法取的连接!这是多么的坑爹啊!!!根本查不出原因好么!!!各种被误导好么!!!尼玛linux啊!!% R& V+ q) d/ ?% Z/ ]! A; Z