最近看netty源碼碰到ChannelOption.SO_BACKLOG
參數(shù)饥脑,通過跟蹤代碼發(fā)現(xiàn)其實是用于設(shè)置底層tcp socket的backlog參數(shù)遣疯,由于不了解這個參數(shù),有必要徹底的理解一下乌助。
底層
backlog參數(shù)主要用于底層方法int listen(int sockfd, int backlog)
罕偎, 在解釋backlog參數(shù)之前很澄,我們先了解下tcp在內(nèi)核的請求過程,其實就是tcp的三次握手:
1颜及、client發(fā)送SYN到server甩苛,將狀態(tài)修改為SYN_SEND,如果server收到請求俏站,則將狀態(tài)修改為SYN_RCVD讯蒲,并把該請求放到syns queue隊列中。
2肄扎、server回復SYN+ACK給client墨林,如果client收到請求,則將狀態(tài)修改為ESTABLISHED犯祠,并發(fā)送ACK給server旭等。
3、server收到ACK雷则,將狀態(tài)修改為ESTABLISHED七蜘,并把該請求從syns queue中放到accept queue褒繁。
在linux系統(tǒng)內(nèi)核中維護了兩個隊列:syns queue和accept queue
syns queue
用于保存半連接狀態(tài)的請求,其大小通過/proc/sys/net/ipv4/tcp_max_syn_backlog指定敌买,一般默認值是512藤乙,不過這個設(shè)置有效的前提是系統(tǒng)的syncookies功能被禁用猜揪。互聯(lián)網(wǎng)常見的TCP SYN FLOOD惡意DOS攻擊方式就是建立大量的半連接狀態(tài)的請求坛梁,然后丟棄而姐,導致syns queue不能保存其它正常的請求。
accept queue
用于保存全連接狀態(tài)的請求划咐,其大小通過/proc/sys/net/core/somaxconn指定拴念,在使用listen函數(shù)時,內(nèi)核會根據(jù)傳入的backlog參數(shù)與系統(tǒng)參數(shù)somaxconn褐缠,取二者的較小值政鼠。
如果accpet queue隊列滿了,server將發(fā)送一個ECONNREFUSED錯誤信息Connection refused到client队魏。
應用層
在netty實現(xiàn)中公般,backlog默認通過NetUtil.SOMAXCONN指定。
當然也可以通過option方法自定義backlog的大小。
backlog設(shè)置注意點
前面已經(jīng)提到過官帘,內(nèi)核會根據(jù)somaxconn和backlog的較小值設(shè)置accept queue的大小瞬雹,如果想擴大accept queue的大小,必須要同時調(diào)整這兩個參數(shù)刽虹。
作者:占小狼
鏈接:http://www.reibang.com/p/e6f2036621f4
來源:簡書
著作權(quán)歸作者所有酗捌。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處涌哲。