很早之前 在排查對(duì)socket的連接隊(duì)列相關(guān)的問(wèn)題時(shí)候遇到的問(wèn)題。
建立socket連接的過(guò)程:
1.client發(fā)syn請(qǐng)求給server
2.server收到后把請(qǐng)求存放在SYN queue里,這個(gè)半連接隊(duì)列的最大值是系統(tǒng)參數(shù) tcp_max_syn_backlog定義的
3.存放在半連接隊(duì)列后發(fā)送syn+ack給client,client收到后再發(fā)syn+ack給server完成三次握手,然后server把連接存放在accept queue ,這個(gè)隊(duì)列長(zhǎng)度就是程序里調(diào)用socket的時(shí)候定義的backlog定義大小。
4.應(yīng)用程序通過(guò)調(diào)用accept()到accept queue里獲取連接。
坑爹的特性來(lái)了!注意!
當(dāng)accept queue滿了會(huì)怎么樣?
??!注意!如果accept隊(duì)列滿了,linux會(huì)出現(xiàn)一個(gè)異常處理,去判斷tcp_abort_on_overflow系統(tǒng)參數(shù)是否為1,如果為1 ,則會(huì)發(fā)出拒絕客戶端的終止訊息并斷開(kāi)連接。但是如果這個(gè)參數(shù)是0,那就坑爹了!,對(duì)于溢出隊(duì)列的連接,linux不會(huì)去管它,會(huì)繼續(xù)正常建立連接,但是在accept queue里沒(méi)有,那就意味著你的程序用accept()函數(shù)無(wú)法取的連接!這是多么的坑爹?。。?!根本查不出原因好么?。?!各種被誤導(dǎo)好么!?。∧岈攍inux?。?!