很早之前 在排查對socket的連接隊列相關(guān)的問題時候遇到的問題采蚀。
建立socket連接的過程:
1.client發(fā)syn請求給server
2.server收到后把請求存放在SYN queue里率寡,這個半連接隊列的最大值是系統(tǒng)參數(shù) tcp_max_syn_backlog定義的
3.存放在半連接隊列后發(fā)送syn+ack給client苟翻,client收到后再發(fā)syn+ack給server完成三次握手相寇,然后server把連接存放在accept queue ,這個隊列長度就是程序里調(diào)用socket的時候定義的backlog定義大小。
4.應(yīng)用程序通過調(diào)用accept()到accept queue里獲取連接赠幕。
坑爹的特性來了!注意询筏!
當(dāng)accept queue滿了會怎么樣榕堰?
!嫌套!注意逆屡!如果accept隊列滿了,linux會出現(xiàn)一個異常處理踱讨,去判斷tcp_abort_on_overflow系統(tǒng)參數(shù)是否為1魏蔗,如果為1 ,則會發(fā)出拒絕客戶端的終止訊息并斷開連接痹筛。但是如果這個參數(shù)是0莺治,那就坑爹了!帚稠,對于溢出隊列的連接谣旁,linux不會去管它,會繼續(xù)正常建立連接滋早,但是在accept queue里沒有蔓挖,那就意味著你的程序用accept()函數(shù)無法取的連接!這是多么的坑爹肮菹巍N僚小!角溃!根本查不出原因好么?交瘛!减细!各種被誤導(dǎo)好么4夜稀!未蝌!尼瑪linux巴灾ā!萧吠!