socket的連接隊(duì)列backlog與tcp_abort_on_overflow參數(shù)

很早之前 在排查對(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?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容